Merge branch 'dev' into fix-db-order

This commit is contained in:
Timothy Jaeryang Baek 2025-03-26 20:55:42 -07:00 committed by GitHub
commit 7490bc9100
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
76 changed files with 1740 additions and 261 deletions

View File

@ -9,9 +9,9 @@
- [ ] **Changelog:** Ensure a changelog entry following the format of [Keep a Changelog](https://keepachangelog.com/) is added at the bottom of the PR description.
- [ ] **Documentation:** Have you updated relevant documentation [Open WebUI Docs](https://github.com/open-webui/docs), or other documentation sources?
- [ ] **Dependencies:** Are there any new dependencies? Have you updated the dependency versions in the documentation?
- [ ] **Testing:** Have you written and run sufficient tests for validating the changes?
- [ ] **Testing:** Have you written and run sufficient tests to validate the changes?
- [ ] **Code review:** Have you performed a self-review of your code, addressing any coding standard issues and ensuring adherence to the project's coding standards?
- [ ] **Prefix:** To cleary categorize this pull request, prefix the pull request title, using one of the following:
- [ ] **Prefix:** To clearly categorize this pull request, prefix the pull request title using one of the following:
- **BREAKING CHANGE**: Significant changes that may affect compatibility
- **build**: Changes that affect the build system or external dependencies
- **ci**: Changes to our continuous integration processes or workflows
@ -22,7 +22,7 @@
- **i18n**: Internationalization or localization changes
- **perf**: Performance improvement
- **refactor**: Code restructuring for better maintainability, readability, or scalability
- **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc.)
- **style**: Changes that do not affect the meaning of the code (white space, formatting, missing semi-colons, etc.)
- **test**: Adding missing tests or correcting existing tests
- **WIP**: Work in progress, a temporary label for incomplete or ongoing work

View File

@ -132,7 +132,7 @@ RUN if [ "$USE_OLLAMA" = "true" ]; then \
# install python dependencies
COPY --chown=$UID:$GID ./backend/requirements.txt ./requirements.txt
RUN pip3 install uv && \
RUN pip3 install --no-cache-dir uv && \
if [ "$USE_CUDA" = "true" ]; then \
# If you use CUDA the whisper and embedding model will be downloaded on first use
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/$USE_CUDA_DOCKER_VER --no-cache-dir && \

View File

@ -1685,6 +1685,11 @@ BYPASS_EMBEDDING_AND_RETRIEVAL = PersistentConfig(
RAG_TOP_K = PersistentConfig(
"RAG_TOP_K", "rag.top_k", int(os.environ.get("RAG_TOP_K", "3"))
)
RAG_TOP_K_RERANKER = PersistentConfig(
"RAG_TOP_K_RERANKER",
"rag.top_k_reranker",
int(os.environ.get("RAG_TOP_K_RERANKER", "3"))
)
RAG_RELEVANCE_THRESHOLD = PersistentConfig(
"RAG_RELEVANCE_THRESHOLD",
"rag.relevance_threshold",

View File

@ -414,13 +414,12 @@ if OFFLINE_MODE:
####################################
# AUDIT LOGGING
####################################
ENABLE_AUDIT_LOGS = os.getenv("ENABLE_AUDIT_LOGS", "false").lower() == "true"
# Where to store log file
AUDIT_LOGS_FILE_PATH = f"{DATA_DIR}/audit.log"
# Maximum size of a file before rotating into a new log file
AUDIT_LOG_FILE_ROTATION_SIZE = os.getenv("AUDIT_LOG_FILE_ROTATION_SIZE", "10MB")
# METADATA | REQUEST | REQUEST_RESPONSE
AUDIT_LOG_LEVEL = os.getenv("AUDIT_LOG_LEVEL", "REQUEST_RESPONSE").upper()
AUDIT_LOG_LEVEL = os.getenv("AUDIT_LOG_LEVEL", "NONE").upper()
try:
MAX_BODY_LOG_SIZE = int(os.environ.get("MAX_BODY_LOG_SIZE") or 2048)
except ValueError:

View File

@ -223,6 +223,9 @@ async def generate_function_chat_completion(
extra_params = {
"__event_emitter__": __event_emitter__,
"__event_call__": __event_call__,
"__chat_id__": metadata.get("chat_id", None),
"__session_id__": metadata.get("session_id", None),
"__message_id__": metadata.get("message_id", None),
"__task__": __task__,
"__task_body__": __task_body__,
"__files__": files,

View File

@ -191,6 +191,7 @@ from open_webui.config import (
DOCUMENT_INTELLIGENCE_ENDPOINT,
DOCUMENT_INTELLIGENCE_KEY,
RAG_TOP_K,
RAG_TOP_K_RERANKER,
RAG_TEXT_SPLITTER,
TIKTOKEN_ENCODING_NAME,
PDF_EXTRACT_IMAGES,
@ -552,6 +553,7 @@ app.state.FUNCTIONS = {}
app.state.config.TOP_K = RAG_TOP_K
app.state.config.TOP_K_RERANKER = RAG_TOP_K_RERANKER
app.state.config.RELEVANCE_THRESHOLD = RAG_RELEVANCE_THRESHOLD
app.state.config.FILE_MAX_SIZE = RAG_FILE_MAX_SIZE
app.state.config.FILE_MAX_COUNT = RAG_FILE_MAX_COUNT

View File

@ -105,7 +105,7 @@ class TikaLoader:
if r.ok:
raw_metadata = r.json()
text = raw_metadata.get("X-TIKA:content", "<No text content found>")
text = raw_metadata.get("X-TIKA:content", "<No text content found>").strip()
if "Content-Type" in raw_metadata:
headers["Content-Type"] = raw_metadata["Content-Type"]

View File

@ -106,6 +106,7 @@ def query_doc_with_hybrid_search(
embedding_function,
k: int,
reranking_function,
k_reranker: int,
r: float,
) -> dict:
try:
@ -128,7 +129,7 @@ def query_doc_with_hybrid_search(
)
compressor = RerankCompressor(
embedding_function=embedding_function,
top_n=k,
top_n=k_reranker,
reranking_function=reranking_function,
r_score=r,
)
@ -138,10 +139,20 @@ def query_doc_with_hybrid_search(
)
result = compression_retriever.invoke(query)
distances = [d.metadata.get("score") for d in result]
documents = [d.page_content for d in result]
metadatas = [d.metadata for d in result]
# retrieve only min(k, k_reranker) items, sort and cut by distance if k < k_reranker
if k < k_reranker:
sorted_items = sorted(zip(distances, metadatas, documents), key=lambda x: x[0], reverse=True)
sorted_items = sorted_items[:k]
distances, documents, metadatas = map(list, zip(*sorted_items))
result = {
"distances": [[d.metadata.get("score") for d in result]],
"documents": [[d.page_content for d in result]],
"metadatas": [[d.metadata for d in result]],
"distances": [distances],
"documents": [documents],
"metadatas": [metadatas],
}
log.info(
@ -264,6 +275,7 @@ def query_collection_with_hybrid_search(
embedding_function,
k: int,
reranking_function,
k_reranker: int,
r: float,
) -> dict:
results = []
@ -277,6 +289,7 @@ def query_collection_with_hybrid_search(
embedding_function=embedding_function,
k=k,
reranking_function=reranking_function,
k_reranker=k_reranker,
r=r,
)
results.append(result)
@ -290,10 +303,8 @@ def query_collection_with_hybrid_search(
raise Exception(
"Hybrid search failed for all collections. Using Non hybrid search as fallback."
)
return merge_and_sort_query_results(results, k=k)
def get_embedding_function(
embedding_engine,
embedding_model,
@ -337,6 +348,7 @@ def get_sources_from_files(
embedding_function,
k,
reranking_function,
k_reranker,
r,
hybrid_search,
full_context=False,
@ -453,6 +465,7 @@ def get_sources_from_files(
embedding_function=embedding_function,
k=k,
reranking_function=reranking_function,
k_reranker=k_reranker,
r=r,
)
except Exception as e:

View File

@ -172,12 +172,19 @@ class ChromaClient:
filter: Optional[dict] = None,
):
# Delete the items from the collection based on the ids.
collection = self.client.get_collection(name=collection_name)
if collection:
if ids:
collection.delete(ids=ids)
elif filter:
collection.delete(where=filter)
try:
collection = self.client.get_collection(name=collection_name)
if collection:
if ids:
collection.delete(ids=ids)
elif filter:
collection.delete(where=filter)
except Exception as e:
# If collection doesn't exist, that's fine - nothing to delete
log.debug(
f"Attempted to delete from non-existent collection {collection_name}. Ignoring."
)
pass
def reset(self):
# Resets the database. This will delete all collections and item entries.

View File

@ -2,6 +2,8 @@ import json
import logging
from typing import Optional
from open_webui.socket.main import get_event_emitter
from open_webui.models.chats import (
ChatForm,
ChatImportForm,
@ -372,6 +374,107 @@ async def update_chat_by_id(
)
############################
# UpdateChatMessageById
############################
class MessageForm(BaseModel):
content: str
@router.post("/{id}/messages/{message_id}", response_model=Optional[ChatResponse])
async def update_chat_message_by_id(
id: str, message_id: str, form_data: MessageForm, user=Depends(get_verified_user)
):
chat = Chats.get_chat_by_id(id)
if not chat:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
)
if chat.user_id != user.id and user.role != "admin":
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
)
chat = Chats.upsert_message_to_chat_by_id_and_message_id(
id,
message_id,
{
"content": form_data.content,
},
)
event_emitter = get_event_emitter(
{
"user_id": user.id,
"chat_id": id,
"message_id": message_id,
},
False,
)
if event_emitter:
await event_emitter(
{
"type": "chat:message",
"data": {
"chat_id": id,
"message_id": message_id,
"content": form_data.content,
},
}
)
return ChatResponse(**chat.model_dump())
############################
# SendChatMessageEventById
############################
class EventForm(BaseModel):
type: str
data: dict
@router.post("/{id}/messages/{message_id}/event", response_model=Optional[bool])
async def send_chat_message_event_by_id(
id: str, message_id: str, form_data: EventForm, user=Depends(get_verified_user)
):
chat = Chats.get_chat_by_id(id)
if not chat:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
)
if chat.user_id != user.id and user.role != "admin":
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=ERROR_MESSAGES.ACCESS_PROHIBITED,
)
event_emitter = get_event_emitter(
{
"user_id": user.id,
"chat_id": id,
"message_id": message_id,
}
)
try:
if event_emitter:
await event_emitter(form_data.model_dump())
else:
return False
return True
except:
return False
############################
# DeleteChatById
############################

View File

@ -719,6 +719,7 @@ async def get_query_settings(request: Request, user=Depends(get_admin_user)):
"status": True,
"template": request.app.state.config.RAG_TEMPLATE,
"k": request.app.state.config.TOP_K,
"k_reranker": request.app.state.config.TOP_K_RERANKER,
"r": request.app.state.config.RELEVANCE_THRESHOLD,
"hybrid": request.app.state.config.ENABLE_RAG_HYBRID_SEARCH,
}
@ -726,6 +727,7 @@ async def get_query_settings(request: Request, user=Depends(get_admin_user)):
class QuerySettingsForm(BaseModel):
k: Optional[int] = None
k_reranker: Optional[int] = None
r: Optional[float] = None
template: Optional[str] = None
hybrid: Optional[bool] = None
@ -737,6 +739,7 @@ async def update_query_settings(
):
request.app.state.config.RAG_TEMPLATE = form_data.template
request.app.state.config.TOP_K = form_data.k if form_data.k else 4
request.app.state.config.TOP_K_RERANKER = form_data.k_reranker or 4
request.app.state.config.RELEVANCE_THRESHOLD = form_data.r if form_data.r else 0.0
request.app.state.config.ENABLE_RAG_HYBRID_SEARCH = (
@ -747,6 +750,7 @@ async def update_query_settings(
"status": True,
"template": request.app.state.config.RAG_TEMPLATE,
"k": request.app.state.config.TOP_K,
"k_reranker": request.app.state.config.TOP_K_RERANKER,
"r": request.app.state.config.RELEVANCE_THRESHOLD,
"hybrid": request.app.state.config.ENABLE_RAG_HYBRID_SEARCH,
}
@ -1495,6 +1499,7 @@ class QueryDocForm(BaseModel):
collection_name: str
query: str
k: Optional[int] = None
k_reranker: Optional[int] = None
r: Optional[float] = None
hybrid: Optional[bool] = None
@ -1515,6 +1520,7 @@ def query_doc_handler(
),
k=form_data.k if form_data.k else request.app.state.config.TOP_K,
reranking_function=request.app.state.rf,
k_reranker=form_data.k_reranker or request.app.state.config.TOP_K_RERANKER,
r=(
form_data.r
if form_data.r
@ -1543,6 +1549,7 @@ class QueryCollectionsForm(BaseModel):
collection_names: list[str]
query: str
k: Optional[int] = None
k_reranker: Optional[int] = None
r: Optional[float] = None
hybrid: Optional[bool] = None
@ -1563,6 +1570,7 @@ def query_collection_handler(
),
k=form_data.k if form_data.k else request.app.state.config.TOP_K,
reranking_function=request.app.state.rf,
k_reranker=form_data.k_reranker or request.app.state.config.TOP_K_RERANKER,
r=(
form_data.r
if form_data.r

View File

@ -269,11 +269,19 @@ async def disconnect(sid):
# print(f"Unknown session ID {sid} disconnected")
def get_event_emitter(request_info):
def get_event_emitter(request_info, update_db=True):
async def __event_emitter__(event_data):
user_id = request_info["user_id"]
session_ids = list(
set(USER_POOL.get(user_id, []) + [request_info["session_id"]])
set(
USER_POOL.get(user_id, [])
+ (
[request_info.get("session_id")]
if request_info.get("session_id")
else []
)
)
)
for session_id in session_ids:
@ -287,40 +295,41 @@ def get_event_emitter(request_info):
to=session_id,
)
if "type" in event_data and event_data["type"] == "status":
Chats.add_message_status_to_chat_by_id_and_message_id(
request_info["chat_id"],
request_info["message_id"],
event_data.get("data", {}),
)
if update_db:
if "type" in event_data and event_data["type"] == "status":
Chats.add_message_status_to_chat_by_id_and_message_id(
request_info["chat_id"],
request_info["message_id"],
event_data.get("data", {}),
)
if "type" in event_data and event_data["type"] == "message":
message = Chats.get_message_by_id_and_message_id(
request_info["chat_id"],
request_info["message_id"],
)
if "type" in event_data and event_data["type"] == "message":
message = Chats.get_message_by_id_and_message_id(
request_info["chat_id"],
request_info["message_id"],
)
content = message.get("content", "")
content += event_data.get("data", {}).get("content", "")
content = message.get("content", "")
content += event_data.get("data", {}).get("content", "")
Chats.upsert_message_to_chat_by_id_and_message_id(
request_info["chat_id"],
request_info["message_id"],
{
"content": content,
},
)
Chats.upsert_message_to_chat_by_id_and_message_id(
request_info["chat_id"],
request_info["message_id"],
{
"content": content,
},
)
if "type" in event_data and event_data["type"] == "replace":
content = event_data.get("data", {}).get("content", "")
if "type" in event_data and event_data["type"] == "replace":
content = event_data.get("data", {}).get("content", "")
Chats.upsert_message_to_chat_by_id_and_message_id(
request_info["chat_id"],
request_info["message_id"],
{
"content": content,
},
)
Chats.upsert_message_to_chat_by_id_and_message_id(
request_info["chat_id"],
request_info["message_id"],
{
"content": content,
},
)
return __event_emitter__

View File

@ -100,7 +100,7 @@ log.setLevel(SRC_LOG_LEVELS["MAIN"])
async def chat_completion_tools_handler(
request: Request, body: dict, user: UserModel, models, tools
request: Request, body: dict, extra_params: dict, user: UserModel, models, tools
) -> tuple[dict, dict]:
async def get_content_from_response(response) -> Optional[str]:
content = None
@ -135,6 +135,9 @@ async def chat_completion_tools_handler(
"metadata": {"task": str(TASKS.FUNCTION_CALLING)},
}
event_caller = extra_params["__event_call__"]
metadata = extra_params["__metadata__"]
task_model_id = get_task_model_id(
body["model"],
request.app.state.config.TASK_MODEL,
@ -189,17 +192,33 @@ async def chat_completion_tools_handler(
tool_function_params = tool_call.get("parameters", {})
try:
spec = tools[tool_function_name].get("spec", {})
tool = tools[tool_function_name]
spec = tool.get("spec", {})
allowed_params = (
spec.get("parameters", {}).get("properties", {}).keys()
)
tool_function = tools[tool_function_name]["callable"]
tool_function = tool["callable"]
tool_function_params = {
k: v
for k, v in tool_function_params.items()
if k in allowed_params
}
tool_output = await tool_function(**tool_function_params)
if tool.get("direct", False):
tool_output = await tool_function(**tool_function_params)
else:
tool_output = await event_caller(
{
"type": "execute:tool",
"data": {
"id": str(uuid4()),
"tool": tool,
"params": tool_function_params,
"session_id": metadata.get("session_id", None),
},
}
)
except Exception as e:
tool_output = str(e)
@ -565,6 +584,7 @@ async def chat_completion_files_handler(
),
k=request.app.state.config.TOP_K,
reranking_function=request.app.state.rf,
k_reranker=request.app.state.config.TOP_K_RERANKER,
r=request.app.state.config.RELEVANCE_THRESHOLD,
hybrid_search=request.app.state.config.ENABLE_RAG_HYBRID_SEARCH,
full_context=request.app.state.config.RAG_FULL_CONTEXT,
@ -764,12 +784,18 @@ async def process_chat_payload(request, form_data, user, metadata, model):
}
form_data["metadata"] = metadata
# Server side tools
tool_ids = metadata.get("tool_ids", None)
# Client side tools
tool_specs = form_data.get("tool_specs", None)
log.debug(f"{tool_ids=}")
log.debug(f"{tool_specs=}")
tools_dict = {}
if tool_ids:
# If tool_ids field is present, then get the tools
tools = get_tools(
tools_dict = get_tools(
request,
tool_ids,
user,
@ -780,20 +806,30 @@ async def process_chat_payload(request, form_data, user, metadata, model):
"__files__": metadata.get("files", []),
},
)
log.info(f"{tools=}")
log.info(f"{tools_dict=}")
if tool_specs:
for tool in tool_specs:
callable = tool.pop("callable", None)
tools_dict[tool["name"]] = {
"direct": True,
"callable": callable,
"spec": tool,
}
if tools_dict:
if metadata.get("function_calling") == "native":
# If the function calling is native, then call the tools function calling handler
metadata["tools"] = tools
metadata["tools"] = tools_dict
form_data["tools"] = [
{"type": "function", "function": tool.get("spec", {})}
for tool in tools.values()
for tool in tools_dict.values()
]
else:
# If the function calling is not native, then call the tools function calling handler
try:
form_data, flags = await chat_completion_tools_handler(
request, form_data, user, models, tools
request, form_data, extra_params, user, models, tools_dict
)
sources.extend(flags.get("sources", []))
@ -812,7 +848,7 @@ async def process_chat_payload(request, form_data, user, metadata, model):
for source_idx, source in enumerate(sources):
if "document" in source:
for doc_idx, doc_context in enumerate(source["document"]):
context_string += f"<source><source_id>{source_idx}</source_id><source_context>{doc_context}</source_context></source>\n"
context_string += f"<source><source_id>{source_idx + 1}</source_id><source_context>{doc_context}</source_context></source>\n"
context_string = context_string.strip()
prompt = get_last_user_message(form_data["messages"])
@ -1079,8 +1115,6 @@ async def process_chat_response(
for filter_id in get_sorted_filter_ids(model)
]
print(f"{filter_functions=}")
# Streaming response
if event_emitter and event_caller:
task_id = str(uuid4()) # Create a unique task ID.
@ -1560,7 +1594,9 @@ async def process_chat_response(
value = delta.get("content")
reasoning_content = delta.get("reasoning_content")
reasoning_content = delta.get(
"reasoning_content"
) or delta.get("reasoning")
if reasoning_content:
if (
not content_blocks
@ -1774,9 +1810,25 @@ async def process_chat_response(
for k, v in tool_function_params.items()
if k in allowed_params
}
tool_result = await tool_function(
**tool_function_params
)
if tool.get("direct", False):
tool_result = await tool_function(
**tool_function_params
)
else:
tool_result = await event_caller(
{
"type": "execute:tool",
"data": {
"id": str(uuid4()),
"tool": tool,
"params": tool_function_params,
"session_id": metadata.get(
"session_id", None
),
},
}
)
except Exception as e:
tool_result = str(e)

View File

@ -1,6 +1,9 @@
import inspect
import logging
import re
import inspect
import uuid
from typing import Any, Awaitable, Callable, get_type_hints
from functools import update_wrapper, partial

View File

@ -79,9 +79,9 @@
const submitHandler = async () => {
loading = true;
if (!ollama && (!url || !key)) {
if (!ollama && !url) {
loading = false;
toast.error('URL and Key are required');
toast.error('URL is required');
return;
}
@ -223,7 +223,7 @@
className="w-full text-sm bg-transparent placeholder:text-gray-300 dark:placeholder:text-gray-700 outline-hidden"
bind:value={key}
placeholder={$i18n.t('API Key')}
required={!ollama}
required={false}
/>
</div>
</div>

View File

@ -76,6 +76,7 @@
template: '',
r: 0.0,
k: 4,
k_reranker: 4,
hybrid: false
};
@ -765,6 +766,23 @@
</div>
</div>
{#if querySettings.hybrid === true}
<div class="mb-2.5 flex w-full justify-between">
<div class="self-center text-xs font-medium">{$i18n.t('Top K Reranker')}</div>
<div class="flex items-center relative">
<input
class="flex-1 w-full rounded-lg text-sm bg-transparent outline-hidden"
type="number"
placeholder={$i18n.t('Enter Top K Reranker')}
bind:value={querySettings.k_reranker}
autocomplete="off"
min="0"
/>
</div>
</div>
{/if}
{#if querySettings.hybrid === true}
<div class=" mb-2.5 flex flex-col w-full justify-between">
<div class=" flex w-full justify-between">

View File

@ -293,18 +293,10 @@
} else if (type === 'chat:tags') {
chat = await getChatById(localStorage.token, $chatId);
allTags.set(await getAllTags(localStorage.token));
} else if (type === 'message') {
} else if (type === 'chat:message:delta' || type === 'message') {
message.content += data.content;
} else if (type === 'replace') {
} else if (type === 'chat:message' || type === 'replace') {
message.content = data.content;
} else if (type === 'action') {
if (data.action === 'continue') {
const continueButton = document.getElementById('continue-response-button');
if (continueButton) {
continueButton.click();
}
}
} else if (type === 'confirmation') {
eventCallback = cb;

View File

@ -102,7 +102,7 @@
<div class="flex text-xs font-medium flex-wrap">
{#each citations as citation, idx}
<button
id={`source-${id}-${idx}`}
id={`source-${id}-${idx + 1}`}
class="no-toggle outline-hidden flex dark:text-gray-300 p-1 bg-white dark:bg-gray-900 rounded-xl max-w-96"
on:click={() => {
showCitationModal = true;
@ -181,7 +181,7 @@
<div class="flex text-xs font-medium flex-wrap">
{#each citations as citation, idx}
<button
id={`source-${id}-${idx}`}
id={`source-${id}-${idx + 1}`}
class="no-toggle outline-hidden flex dark:text-gray-300 p-1 bg-gray-50 hover:bg-gray-100 dark:bg-gray-900 dark:hover:bg-gray-850 transition rounded-xl max-w-96"
on:click={() => {
showCitationModal = true;

View File

@ -476,7 +476,7 @@
<div class="flex flex-col">
{#if $mobile && (item?.model?.tags ?? []).length > 0}
<div class="flex gap-0.5 self-start h-full mb-1.5 -translate-x-1">
{#each item.model?.tags as tag}
{#each item.model?.tags.sort((a, b) => a.name.localeCompare(b.name)) as tag}
<div
class=" text-xs font-bold px-1 rounded-sm uppercase line-clamp-1 bg-gray-500/20 text-gray-700 dark:text-gray-200"
>
@ -498,31 +498,37 @@
alt="Model"
class="rounded-full size-5 flex items-center mr-2"
/>
{item.label}
<div class="flex items-center line-clamp-1">
<div class="line-clamp-1">
{item.label}
</div>
{#if item.model.owned_by === 'ollama' && (item.model.ollama?.details?.parameter_size ?? '') !== ''}
<div class="flex ml-1 items-center translate-y-[0.5px]">
<Tooltip
content={`${
item.model.ollama?.details?.quantization_level
? item.model.ollama?.details?.quantization_level + ' '
: ''
}${
item.model.ollama?.size
? `(${(item.model.ollama?.size / 1024 ** 3).toFixed(1)}GB)`
: ''
}`}
className="self-end"
>
<span
class=" text-xs font-medium text-gray-600 dark:text-gray-400 line-clamp-1"
>{item.model.ollama?.details?.parameter_size ?? ''}</span
>
</Tooltip>
</div>
{/if}
</div>
</Tooltip>
</div>
</div>
{#if item.model.owned_by === 'ollama' && (item.model.ollama?.details?.parameter_size ?? '') !== ''}
<div class="flex ml-1 items-center translate-y-[0.5px]">
<Tooltip
content={`${
item.model.ollama?.details?.quantization_level
? item.model.ollama?.details?.quantization_level + ' '
: ''
}${
item.model.ollama?.size
? `(${(item.model.ollama?.size / 1024 ** 3).toFixed(1)}GB)`
: ''
}`}
className="self-end"
>
<span
class=" text-xs font-medium text-gray-600 dark:text-gray-400 line-clamp-1"
>{item.model.ollama?.details?.parameter_size ?? ''}</span
>
</Tooltip>
</div>
{/if}
</div>
<!-- {JSON.stringify(item.info)} -->
@ -600,7 +606,7 @@
<div
class="flex gap-0.5 self-center items-center h-full translate-y-[0.5px] overflow-x-auto scrollbar-none"
>
{#each item.model?.tags as tag}
{#each item.model?.tags.sort((a, b) => a.name.localeCompare(b.name)) as tag}
<Tooltip content={tag.name} className="flex-shrink-0">
<div
class=" text-xs font-bold px-1 rounded-sm uppercase bg-gray-500/20 text-gray-700 dark:text-gray-200"

View File

@ -961,6 +961,7 @@
<div class="flex w-full justify-between">
<div class=" self-center text-xs font-medium">
{$i18n.t('Context Length')}
{$i18n.t('(Ollama)')}
</div>
<button

View File

@ -304,18 +304,15 @@
console.log('Edit');
await tick();
name = folders[folderId].name;
edit = true;
edit = true;
await tick();
// focus on the input and select all text
setTimeout(() => {
const input = document.getElementById(`folder-${folderId}-input`);
if (input) {
input.focus();
input.select();
}
}, 100);
const input = document.getElementById(`folder-${folderId}-input`);
if (input) {
input.focus();
}
};
const exportHandler = async () => {
@ -404,6 +401,9 @@
id="folder-{folderId}-input"
type="text"
bind:value={name}
on:focus={(e) => {
e.target.select();
}}
on:blur={() => {
nameUpdateHandler();
edit = false;
@ -437,7 +437,10 @@
>
<FolderMenu
on:rename={() => {
editHandler();
// Requires a timeout to prevent the click event from closing the dropdown
setTimeout(() => {
editHandler();
}, 200);
}}
on:delete={() => {
showDeleteConfirm = true;

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "( `sh webui.sh --api`مثال)",
"(latest)": "(الأخير)",
"(Ollama)": "",
"{{ models }}": "{{ نماذج }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(напр. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(напр. `sh webui.sh --api`)",
"(latest)": "(последна)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "{{COUNT}} Отговори",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "(যেমন `sh webui.sh --api`)",
"(latest)": "(সর্বশেষ)",
"(Ollama)": "",
"{{ models }}": "{{ মডেল}}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(p. ex. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(p. ex. `sh webui.sh --api`)",
"(latest)": "(últim)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "{{COUNT}} línies ocultes",
"{{COUNT}} Replies": "{{COUNT}} respostes",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "(pananglitan `sh webui.sh --api`)",
"(latest)": "",
"(Ollama)": "",
"{{ models }}": "",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(např. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(např. `sh webui.sh --api`)",
"(latest)": "Nejnovější",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(f.eks. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(f.eks. `sh webui.sh --api`)",
"(latest)": "(seneste)",
"(Ollama)": "",
"{{ models }}": "{{ modeller }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,14 +4,15 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(z. B. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(z. B. `sh webui.sh --api`)",
"(latest)": "(neueste)",
"(Ollama)": "",
"{{ models }}": "{{ Modelle }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} hidden lines": "{{COUNT}} versteckte Zeilen",
"{{COUNT}} Replies": "{{COUNT}} Antworten",
"{{user}}'s Chats": "{{user}}s Unterhaltungen",
"{{user}}'s Chats": "{{user}}s Chats",
"{{webUIName}} Backend Required": "{{webUIName}}-Backend erforderlich",
"*Prompt node ID(s) are required for image generation": "*Prompt-Node-ID(s) sind für die Bildgenerierung erforderlich",
"A new version (v{{LATEST_VERSION}}) is now available.": "Eine neue Version (v{{LATEST_VERSION}}) ist jetzt verfügbar.",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Aufgabenmodelle können Unterhaltungstitel oder Websuchanfragen generieren.",
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Aufgabenmodelle können Chat-Titel oder Websuchanfragen generieren.",
"a user": "ein Benutzer",
"About": "Über",
"Accept autocomplete generation / Jump to prompt variable": "Automatische Vervollständigung akzeptieren / Zur Prompt-Variable springen",
@ -47,29 +48,29 @@
"Adjusting these settings will apply changes universally to all users.": "Das Anpassen dieser Einstellungen wird Änderungen universell auf alle Benutzer anwenden.",
"admin": "Administrator",
"Admin": "Administrator",
"Admin Panel": "Administrationsbereich",
"Admin Settings": "Administrationsbereich",
"Admin Panel": "Administration",
"Admin Settings": "Administration",
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "Administratoren haben jederzeit Zugriff auf alle Werkzeuge. Benutzer können im Arbeitsbereich zugewiesen.",
"Advanced Parameters": "Erweiterte Parameter",
"Advanced Params": "Erweiterte Parameter",
"All": "",
"All": "Alle",
"All Documents": "Alle Dokumente",
"All models deleted successfully": "Alle Modelle erfolgreich gelöscht",
"Allow Chat Controls": "Chat-Steuerung erlauben",
"Allow Chat Delete": "Löschen von Unterhaltungen erlauben",
"Allow Chat Deletion": "Löschen von Unterhaltungen erlauben",
"Allow Chat Edit": "Bearbeiten von Unterhaltungen erlauben",
"Allow Chat Delete": "Löschen von Chats erlauben",
"Allow Chat Deletion": "Löschen von Chats erlauben",
"Allow Chat Edit": "Bearbeiten von Chats erlauben",
"Allow File Upload": "Hochladen von Dateien erlauben",
"Allow non-local voices": "Nicht-lokale Stimmen erlauben",
"Allow Temporary Chat": "Temporäre Unterhaltungen erlauben",
"Allow Temporary Chat": "Temporäre Chats erlauben",
"Allow User Location": "Standort freigeben",
"Allow Voice Interruption in Call": "Unterbrechung durch Stimme im Anruf zulassen",
"Allowed Endpoints": "Erlaubte Endpunkte",
"Already have an account?": "Haben Sie bereits einen 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.": "",
"Always": "Immer",
"Always Collapse Code Blocks": "",
"Always Expand Details": "",
"Always Collapse Code Blocks": "Code-Blöcke immer zuklappen",
"Always Expand Details": "Details immer aufklappen",
"Amazing": "Fantastisch",
"an assistant": "ein Assistent",
"Analyzed": "Analysiert",
@ -87,17 +88,17 @@
"applies to all users with the \"user\" role": "gilt für alle Benutzer mit der Rolle \"Benutzer\"",
"April": "April",
"Archive": "Archivieren",
"Archive All Chats": "Alle Unterhaltungen archivieren",
"Archived Chats": "Archivierte Unterhaltungen",
"Archive All Chats": "Alle Chats archivieren",
"Archived Chats": "Archivierte Chats",
"archived-chat-export": "archivierter-chat-export",
"Are you sure you want to clear all memories? This action cannot be undone.": "Sind Sie sicher, dass Sie alle Erinnerungen löschen möchten? Diese Handlung kann nicht rückgängig gemacht werden.",
"Are you sure you want to delete this channel?": "Sind Sie sicher, dass Sie diesen Kanal löschen möchten?",
"Are you sure you want to delete this message?": "Sind Sie sicher, dass Sie diese Nachricht löschen möchten?",
"Are you sure you want to unarchive all archived chats?": "Sind Sie sicher, dass Sie alle archivierten Unterhaltungen wiederherstellen möchten?",
"Are you sure you want to unarchive all archived chats?": "Sind Sie sicher, dass Sie alle archivierten Chats wiederherstellen möchten?",
"Are you sure?": "Sind Sie sicher?",
"Arena Models": "Arena-Modelle",
"Artifacts": "Artefakte",
"Ask": "",
"Ask": "Fragen",
"Ask a question": "Stellen Sie eine Frage",
"Assistant": "Assistent",
"Attach file from knowledge": "Datei aus Wissensspeicher anhängen",
@ -152,14 +153,14 @@
"Character limit for autocomplete generation input": "Zeichenlimit für die Eingabe der automatischen Vervollständigung",
"Chart new frontiers": "Neue Wege beschreiten",
"Chat": "Gespräch",
"Chat Background Image": "Hintergrundbild des Unterhaltungsfensters",
"Chat Bubble UI": "Chat Bubble UI",
"Chat Background Image": "Hintergrundbild des Chat-Fensters",
"Chat Bubble UI": "Sprechblasen-Layout",
"Chat Controls": "Chat-Steuerung",
"Chat direction": "Textrichtung",
"Chat Overview": "Unterhaltungsübersicht",
"Chat Permissions": "Unterhaltungsberechtigungen",
"Chat Tags Auto-Generation": "Automatische Generierung von Unterhaltungstags",
"Chats": "Unterhaltungen",
"Chat Overview": "Chat-Übersicht",
"Chat Permissions": "Chat-Berechtigungen",
"Chat Tags Auto-Generation": "Automatische Generierung von Chat-Tags",
"Chats": "Chats",
"Check Again": "Erneut überprüfen",
"Check for updates": "Nach Updates suchen",
"Checking for updates...": "Sucht nach Updates...",
@ -169,7 +170,7 @@
"Ciphers": "Verschlüsselungen",
"Citation": "Zitate",
"Clear memory": "Alle Erinnerungen entfernen",
"Clear Memory": "",
"Clear Memory": "Alle Erinnerungen entfernen",
"click here": "hier klicken",
"Click here for filter guides.": "Klicken Sie hier für Filteranleitungen.",
"Click here for help.": "Klicken Sie hier für Hilfe.",
@ -191,12 +192,12 @@
"Code execution": "Codeausführung",
"Code Execution": "Codeausführung",
"Code Execution Engine": "",
"Code Execution Timeout": "",
"Code Execution Timeout": "Timeout für Codeausführung",
"Code formatted successfully": "Code erfolgreich formatiert",
"Code Interpreter": "Code-Interpreter",
"Code Interpreter Engine": "",
"Code Interpreter Prompt Template": "",
"Collapse": "",
"Collapse": "Zuklappen",
"Collection": "Kollektion",
"Color": "Farbe",
"ComfyUI": "ComfyUI",
@ -252,7 +253,7 @@
"Created At": "Erstellt am",
"Created by": "Erstellt von",
"CSV Import": "CSV-Import",
"Ctrl+Enter to Send": "",
"Ctrl+Enter to Send": "Strg+Enter zum Senden",
"Current Model": "Aktuelles Modell",
"Current Password": "Aktuelles Passwort",
"Custom": "Benutzerdefiniert",
@ -276,15 +277,15 @@
"Default User Role": "Standardbenutzerrolle",
"Delete": "Löschen",
"Delete a model": "Ein Modell löschen",
"Delete All Chats": "Alle Unterhaltungen löschen",
"Delete All Chats": "Alle Chats löschen",
"Delete All Models": "Alle Modelle löschen",
"Delete chat": "Unterhaltung löschen",
"Delete Chat": "Unterhaltung löschen",
"Delete chat?": "Unterhaltung löschen?",
"Delete chat": "Chat löschen",
"Delete Chat": "Chat löschen",
"Delete chat?": "Chat löschen?",
"Delete folder?": "Ordner löschen?",
"Delete function?": "Funktion löschen?",
"Delete Message": "Nachricht löschen",
"Delete message?": "",
"Delete message?": "Nachricht löschen?",
"Delete prompt?": "Prompt löschen?",
"delete this link": "diesen Link löschen",
"Delete tool?": "Werkzeug löschen?",
@ -295,7 +296,7 @@
"Describe your knowledge base and objectives": "Beschreibe deinen Wissensspeicher und deine Ziele",
"Description": "Beschreibung",
"Didn't fully follow instructions": "Nicht genau den Answeisungen gefolgt",
"Direct": "",
"Direct": "Direkt",
"Direct Connections": "Direktverbindungen",
"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Direktverbindungen ermöglichen es Benutzern, sich mit ihren eigenen OpenAI-kompatiblen API-Endpunkten zu verbinden.",
"Direct Connections settings updated": "Direktverbindungs-Einstellungen aktualisiert",
@ -304,7 +305,7 @@
"Discover a model": "Entdecken Sie weitere Modelle",
"Discover a prompt": "Entdecken Sie weitere Prompts",
"Discover a tool": "Entdecken Sie weitere Werkzeuge",
"Discover how to use Open WebUI and seek support from the community.": "",
"Discover how to use Open WebUI and seek support from the community.": "Entdecke, wie Sie Open WebUI nutzen und erhalten Sie Unterstützung von der Community.",
"Discover wonders": "Entdecken Sie Wunder",
"Discover, download, and explore custom functions": "Entdecken und beziehen Sie benutzerdefinierte Funktionen",
"Discover, download, and explore custom prompts": "Entdecken und beziehen Sie benutzerdefinierte Prompts",
@ -326,7 +327,7 @@
"Documentation": "Dokumentation",
"Documents": "Dokumente",
"does not make any external connections, and your data stays securely on your locally hosted server.": "stellt keine externen Verbindungen her, und Ihre Daten bleiben sicher auf Ihrem lokal gehosteten Server.",
"Domain Filter List": "",
"Domain Filter List": "Domain Filter-Liste",
"Don't have an account?": "Haben Sie noch kein Benutzerkonto?",
"don't install random functions from sources you don't trust.": "installieren Sie keine Funktionen aus Quellen, denen Sie nicht vertrauen.",
"don't install random tools from sources you don't trust.": "installieren Sie keine Werkzeuge aus Quellen, denen Sie nicht vertrauen.",
@ -338,7 +339,7 @@
"Download Database": "Datenbank exportieren",
"Drag and drop a file to upload or select a file to view": "Ziehen Sie eine Datei zum Hochladen oder wählen Sie eine Datei zum Anzeigen aus",
"Draw": "Zeichnen",
"Drop any files here to add to the conversation": "Ziehen Sie beliebige Dateien hierher, um sie der Unterhaltung hinzuzufügen",
"Drop any files here to add to the conversation": "Ziehen Sie beliebige Dateien hierher, um sie dem Chat hinzuzufügen",
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "z. B. '30s','10m'. Gültige Zeiteinheiten sind 's', 'm', 'h'.",
"e.g. 60": "z. B. 60",
"e.g. A filter to remove profanity from text": "z. B. Ein Filter, um Schimpfwörter aus Text zu entfernen",
@ -365,8 +366,8 @@
"Embedding model set to \"{{embedding_model}}\"": "Embedding-Modell auf \"{{embedding_model}}\" gesetzt",
"Enable API Key": "API-Schlüssel aktivieren",
"Enable autocomplete generation for chat messages": "Automatische Vervollständigung für Chat-Nachrichten aktivieren",
"Enable Code Execution": "",
"Enable Code Interpreter": "",
"Enable Code Execution": "Codeausführung aktivieren",
"Enable Code Interpreter": "Code-Interpreter aktivieren",
"Enable Community Sharing": "Community-Freigabe aktivieren",
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "Aktiviere Memory Locking (mlock), um zu verhindern, dass Modelldaten aus dem RAM ausgelagert werden. Diese Option sperrt die Arbeitsseiten des Modells im RAM, um sicherzustellen, dass sie nicht auf die Festplatte ausgelagert werden. Dies kann die Leistung verbessern, indem Page Faults vermieden und ein schneller Datenzugriff sichergestellt werden.",
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "Aktiviere Memory Mapping (mmap), um Modelldaten zu laden. Diese Option ermöglicht es dem System, den Festplattenspeicher als Erweiterung des RAM zu verwenden, indem Festplattendateien so behandelt werden, als ob sie im RAM wären. Dies kann die Modellleistung verbessern, indem ein schnellerer Datenzugriff ermöglicht wird. Es kann jedoch nicht auf allen Systemen korrekt funktionieren und einen erheblichen Teil des Festplattenspeichers beanspruchen.",
@ -400,17 +401,17 @@
"Enter Google PSE Engine Id": "Geben Sie die Google PSE-Engine-ID ein",
"Enter Image Size (e.g. 512x512)": "Geben Sie die Bildgröße ein (z. B. 512x512)",
"Enter Jina API Key": "Geben Sie den Jina-API-Schlüssel ein",
"Enter Jupyter Password": "",
"Enter Jupyter Token": "",
"Enter Jupyter URL": "",
"Enter Kagi Search API Key": "Geben sie den Kagi Search API-Schlüssel ein",
"Enter Key Behavior": "",
"Enter Jupyter Password": "Geben Sie das Jupyter-Passwort ein",
"Enter Jupyter Token": "Geben Sie den Jupyter-Token ein",
"Enter Jupyter URL": "Geben Sie die Jupyter-URL ein",
"Enter Kagi Search API Key": "Geben Sie den Kagi Search API-Schlüssel ein",
"Enter Key Behavior": "Verhalten von 'Enter'",
"Enter language codes": "Geben Sie die Sprachcodes ein",
"Enter Model ID": "Geben Sie die Modell-ID ein",
"Enter model tag (e.g. {{modelTag}})": "Geben Sie den Model-Tag ein",
"Enter Mojeek Search API Key": "Geben Sie den Mojeek Search API-Schlüssel ein",
"Enter Number of Steps (e.g. 50)": "Geben Sie die Anzahl an Schritten ein (z. B. 50)",
"Enter Perplexity API Key": "",
"Enter Perplexity API Key": "Geben Sie den Perplexity API-Key ein",
"Enter proxy URL (e.g. https://user:password@host:port)": "Geben sie die Proxy-URL ein (z. B. https://user:password@host:port)",
"Enter reasoning effort": "Geben Sie den Schlussfolgerungsaufwand ein",
"Enter Sampler (e.g. Euler a)": "Geben Sie den Sampler ein (z. B. Euler a)",
@ -433,9 +434,10 @@
"Enter Tavily API Key": "Geben Sie den Tavily-API-Schlüssel ein",
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "Geben sie die öffentliche URL Ihrer WebUI ein. Diese URL wird verwendet, um Links in den Benachrichtigungen zu generieren.",
"Enter Tika Server URL": "Geben Sie die Tika-Server-URL ein",
"Enter timeout in seconds": "",
"Enter to Send": "",
"Enter timeout in seconds": "Geben Sie den Timeout in Sekunden ein",
"Enter to Send": "'Enter' zum Senden",
"Enter Top K": "Geben Sie Top K ein",
"Enter Top K Reranker": "Geben Sie Top K für Reranker ein",
"Enter URL (e.g. http://127.0.0.1:7860/)": "Geben Sie die URL ein (z. B. http://127.0.0.1:7860/)",
"Enter URL (e.g. http://localhost:11434)": "Geben Sie die URL ein (z. B. http://localhost:11434)",
"Enter your current password": "Geben Sie Ihr aktuelles Passwort ein",
@ -461,16 +463,16 @@
"Exceeded the number of seats in your license. Please contact support to increase the number of seats.": "",
"Exclude": "Ausschließen",
"Execute code for analysis": "Code für Analyse ausführen",
"Expand": "",
"Expand": "Aufklappen",
"Experimental": "Experimentell",
"Explain": "",
"Explain this section to me in more detail": "",
"Explain": "Erklären",
"Explain this section to me in more detail": "Erkläre mir diesen Abschnitt im Detail",
"Explore the cosmos": "Erforschen Sie das Universum",
"Export": "Exportieren",
"Export All Archived Chats": "Alle archivierten Unterhaltungen exportieren",
"Export All Chats (All Users)": "Alle Unterhaltungen exportieren (alle Benutzer)",
"Export chat (.json)": "Unterhaltung exportieren (.json)",
"Export Chats": "Unterhaltungen exportieren",
"Export All Archived Chats": "Alle archivierten Chats exportieren",
"Export All Chats (All Users)": "Alle Chats exportieren (alle Benutzer)",
"Export chat (.json)": "Chat exportieren (.json)",
"Export Chats": "Chats exportieren",
"Export Config to JSON File": "Exportiere Konfiguration als JSON-Datei",
"Export Functions": "Funktionen exportieren",
"Export Models": "Modelle exportieren",
@ -478,7 +480,7 @@
"Export Prompts": "Prompts exportieren",
"Export to CSV": "Als CSV exportieren",
"Export Tools": "Werkzeuge exportieren",
"External": "",
"External": "Extern",
"External Models": "Externe Modelle",
"Failed to add file.": "Fehler beim Hinzufügen der Datei.",
"Failed to create API Key.": "Fehler beim Erstellen des API-Schlüssels.",
@ -517,7 +519,7 @@
"Form": "Formular",
"Format your variables using brackets like this:": "Formatieren Sie Ihre Variablen mit Klammern, wie hier:",
"Frequency Penalty": "Frequenzstrafe",
"Full Context Mode": "",
"Full Context Mode": "Voll-Kontext Modus",
"Function": "Funktion",
"Function Calling": "Funktionsaufruf",
"Function created successfully": "Funktion erfolgreich erstellt",
@ -554,7 +556,7 @@
"Group updated successfully": "Gruppe erfolgreich aktualisiert",
"Groups": "Gruppen",
"Haptic Feedback": "Haptisches Feedback",
"has no conversations.": "hat keine Unterhaltungen.",
"has no conversations.": "hat keine Chats.",
"Hello, {{name}}": "Hallo, {{name}}",
"Help": "Hilfe",
"Help us create the best community leaderboard by sharing your feedback history!": "Helfen Sie uns, die beste Community-Bestenliste zu erstellen, indem Sie Ihren Feedback-Verlauf teilen!",
@ -579,7 +581,7 @@
"Image Prompt Generation Prompt": "Prompt für die Bild-Prompt-Generierung",
"Image Settings": "Bildeinstellungen",
"Images": "Bilder",
"Import Chats": "Unterhaltungen importieren",
"Import Chats": "Chats importieren",
"Import Config from JSON File": "Konfiguration aus JSON-Datei importieren",
"Import Functions": "Funktionen importieren",
"Import Models": "Modelle importieren",
@ -596,7 +598,7 @@
"Install from Github URL": "Installiere von der Github-URL",
"Instant Auto-Send After Voice Transcription": "Spracherkennung direkt absenden",
"Integration": "",
"Interface": "Benutzeroberfläche",
"Interface": "Oberfläche",
"Invalid file format.": "Ungültiges Dateiformat.",
"Invalid Tag": "Ungültiger Tag",
"is typing...": "schreibt ...",
@ -675,7 +677,7 @@
"Memory updated successfully": "Erinnerung erfolgreich aktualisiert",
"Merge Responses": "Antworten zusammenführen",
"Message rating should be enabled to use this feature": "Antwortbewertung muss aktiviert sein, um diese Funktion zu verwenden",
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Nachrichten, die Sie nach der Erstellung Ihres Links senden, werden nicht geteilt. Nutzer mit der URL können die freigegebene Unterhaltung einsehen.",
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Nachrichten, die Sie nach der Erstellung Ihres Links senden, werden nicht geteilt. Nutzer mit der URL können den freigegebenen Chat einsehen.",
"Min P": "Min P",
"Minimum Score": "Mindestpunktzahl",
"Mirostat": "Mirostat",
@ -687,7 +689,7 @@
"Model {{modelId}} not found": "Modell {{modelId}} nicht gefunden",
"Model {{modelName}} is not vision capable": "Das Modell {{modelName}} ist nicht für die Bildverarbeitung geeignet",
"Model {{name}} is now {{status}}": "Modell {{name}} ist jetzt {{status}}",
"Model accepts image inputs": "Modell akzeptiert Bileingaben",
"Model accepts image inputs": "Modell akzeptiert Bildeingaben",
"Model created successfully!": "Modell erfolgreich erstellt!",
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Modell-Dateisystempfad erkannt. Modellkurzname ist für das Update erforderlich, Fortsetzung nicht möglich.",
"Model Filtering": "Modellfilterung",
@ -708,7 +710,7 @@
"Name": "Name",
"Name your knowledge base": "Benennen Sie Ihren Wissensspeicher",
"Native": "Nativ",
"New Chat": "Neue Unterhaltung",
"New Chat": "Neuer Chat",
"New Folder": "Neuer Ordner",
"New Password": "Neues Passwort",
"new-channel": "neuer-kanal",
@ -815,7 +817,7 @@
"Presence Penalty": "",
"Previous 30 days": "Vorherige 30 Tage",
"Previous 7 days": "Vorherige 7 Tage",
"Private": "",
"Private": "Privat",
"Profile Image": "Profilbild",
"Prompt": "Prompt",
"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (z. B. \"Erzähle mir eine interessante Tatsache über das Römische Reich\")",
@ -825,7 +827,7 @@
"Prompt updated successfully": "Prompt erfolgreich aktualisiert",
"Prompts": "Prompts",
"Prompts Access": "Prompt-Zugriff",
"Public": "",
"Public": "Öffentlich",
"Pull \"{{searchValue}}\" from Ollama.com": "\"{{searchValue}}\" von Ollama.com beziehen",
"Pull a model from Ollama.com": "Modell von Ollama.com beziehen",
"Query Generation Prompt": "Abfragegenerierungsprompt",
@ -865,7 +867,7 @@
"Result": "Ergebnis",
"Retrieval": "",
"Retrieval Query Generation": "Abfragegenerierung",
"Rich Text Input for Chat": "Rich-Text-Eingabe für Unterhaltungen",
"Rich Text Input for Chat": "Rich-Text-Eingabe für Chats",
"RK": "RK",
"Role": "Rolle",
"Rosé Pine": "Rosé Pine",
@ -879,12 +881,12 @@
"Save As Copy": "Als Kopie speichern",
"Save Tag": "Tag speichern",
"Saved": "Gespeichert",
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Das direkte Speichern von Unterhaltungen im Browser-Speicher wird nicht mehr unterstützt. Bitte nehmen Sie einen Moment Zeit, um Ihre Unterhaltungen zu exportieren und zu löschen, indem Sie auf die Schaltfläche unten klicken. Keine Sorge, Sie können Ihre Unterhaltungen problemlos über das Backend wieder importieren.",
"Saving chat logs directly to your browser's storage is no longer supported. Please take a moment to download and delete your chat logs by clicking the button below. Don't worry, you can easily re-import your chat logs to the backend through": "Das direkte Speichern von Chats im Browser-Speicher wird nicht mehr unterstützt. Bitte nehmen Sie einen Moment Zeit, um Ihre Chats zu exportieren und zu löschen, indem Sie auf die Schaltfläche unten klicken. Keine Sorge, Sie können Ihre Chats problemlos über das Backend wieder importieren.",
"Scroll to bottom when switching between branches": "Beim Wechsel zwischen Branches nach unten scrollen",
"Search": "Suchen",
"Search a model": "Modell suchen",
"Search Base": "Suchbasis",
"Search Chats": "Unterhaltungen durchsuchen...",
"Search Chats": "Chats durchsuchen...",
"Search Collection": "Sammlung durchsuchen",
"Search Filters": "Suchfilter",
"search for tags": "nach Tags suchen",
@ -955,7 +957,7 @@
"Settings": "Einstellungen",
"Settings saved successfully!": "Einstellungen erfolgreich gespeichert!",
"Share": "Teilen",
"Share Chat": "Unterhaltung teilen",
"Share Chat": "Chat teilen",
"Share to Open WebUI Community": "Mit OpenWebUI Community teilen",
"Show": "Anzeigen",
"Show \"What's New\" modal on login": "\"Was gibt's Neues\"-Modal beim Anmelden anzeigen",
@ -977,7 +979,7 @@
"Speech-to-Text Engine": "Sprache-zu-Text-Engine",
"Stop": "Stop",
"Stop Sequence": "Stop-Sequenz",
"Stream Chat Response": "Unterhaltungsantwort streamen",
"Stream Chat Response": "Chat-Antwort streamen",
"STT Model": "STT-Modell",
"STT Settings": "STT-Einstellungen",
"Subtitle (e.g. about the Roman Empire)": "Untertitel (z. B. über das Römische Reich)",
@ -1001,7 +1003,7 @@
"Tell us more:": "Erzähl uns mehr",
"Temperature": "Temperatur",
"Template": "Vorlage",
"Temporary Chat": "Temporäre Unterhaltung",
"Temporary Chat": "Temporärer Chat",
"Text Splitter": "Text-Splitter",
"Text-to-Speech Engine": "Text-zu-Sprache-Engine",
"Tfs Z": "Tfs Z",
@ -1015,14 +1017,14 @@
"The LDAP attribute that maps to the username that users use to sign in.": "Das LDAP-Attribut, das dem Benutzernamen zugeordnet ist, den Benutzer zum Anmelden verwenden.",
"The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "Die Bestenliste befindet sich derzeit in der Beta-Phase, und es ist möglich, dass wir die Bewertungsberechnungen anpassen, während wir den Algorithmus verfeinern.",
"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "Die maximale Dateigröße in MB. Wenn die Dateigröße dieses Limit überschreitet, wird die Datei nicht hochgeladen.",
"The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "Die maximale Anzahl von Dateien, die gleichzeitig in der Unterhaltung verwendet werden können. Wenn die Anzahl der Dateien dieses Limit überschreitet, werden die Dateien nicht hochgeladen.",
"The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "Die maximale Anzahl von Dateien, die gleichzeitig im Chat verwendet werden können. Wenn die Anzahl der Dateien dieses Limit überschreitet, werden die Dateien nicht hochgeladen.",
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Die Punktzahl sollte ein Wert zwischen 0,0 (0 %) und 1,0 (100 %) sein.",
"The temperature of the model. Increasing the temperature will make the model answer more creatively.": "",
"Theme": "Design",
"Thinking...": "Denke nach...",
"This action cannot be undone. Do you wish to continue?": "Diese Aktion kann nicht rückgängig gemacht werden. Möchten Sie fortfahren?",
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dies stellt sicher, dass Ihre wertvollen Unterhaltungen sicher in Ihrer Backend-Datenbank gespeichert werden. Vielen Dank!",
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Dieser Kanal wurde am {{createdAt}} erstellt. Dies ist der Beginn des {{channelName}} Kanals.",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Dies stellt sicher, dass Ihre wertvollen Chats sicher in Ihrer Backend-Datenbank gespeichert werden. Vielen Dank!",
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Dies ist eine experimentelle Funktion, sie funktioniert möglicherweise nicht wie erwartet und kann jederzeit geändert werden.",
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "",
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "",
@ -1039,10 +1041,10 @@
"Tika": "Tika",
"Tika Server URL required.": "Tika-Server-URL erforderlich.",
"Tiktoken": "Tiktoken",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tipp: Aktualisieren Sie mehrere Variablenfelder nacheinander, indem Sie nach jedem Ersetzen die Tabulatortaste im Eingabefeld der Unterhaltung drücken.",
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Tipp: Aktualisieren Sie mehrere Variablenfelder nacheinander, indem Sie nach jedem Ersetzen die Tabulatortaste im Eingabefeld des Chats drücken.",
"Title": "Titel",
"Title (e.g. Tell me a fun fact)": "Titel (z. B. Erzähl mir einen lustigen Fakt)",
"Title Auto-Generation": "Unterhaltungstitel automatisch generieren",
"Title Auto-Generation": "Chat-Titel automatisch generieren",
"Title cannot be an empty string.": "Titel darf nicht leer sein.",
"Title Generation": "Titelgenerierung",
"Title Generation Prompt": "Prompt für Titelgenerierung",
@ -1052,7 +1054,7 @@
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Um auf das WebUI zugreifen zu können, wenden Sie sich bitte an einen Administrator. Administratoren können den Benutzerstatus über das Admin-Panel verwalten.",
"To attach knowledge base here, add them to the \"Knowledge\" workspace first.": "Um Wissensdatenbanken hier anzuhängen, fügen Sie sie zunächst dem Arbeitsbereich \"Wissen\" hinzu.",
"To learn more about available endpoints, visit our documentation.": "Um mehr über verfügbare Endpunkte zu erfahren, besuchen Sie unsere Dokumentation.",
"To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "Um Ihre Privatsphäre zu schützen, werden nur Bewertungen, Modell-IDs, Tags und Metadaten aus Ihrem Feedback geteilt Ihre Unterhaltungen bleiben privat und werden nicht einbezogen.",
"To protect your privacy, only ratings, model IDs, tags, and metadata are shared from your feedback—your chat logs remain private and are not included.": "Um Ihre Privatsphäre zu schützen, werden nur Bewertungen, Modell-IDs, Tags und Metadaten aus Ihrem Feedback geteilt Ihre Chats bleiben privat und werden nicht einbezogen.",
"To select actions here, add them to the \"Functions\" workspace first.": "Um Aktionen auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich „Funktionen“ hinzu.",
"To select filters here, add them to the \"Functions\" workspace first.": "Um Filter auszuwählen, fügen Sie diese zunächst dem Arbeitsbereich „Funktionen“ hinzu.",
"To select toolkits here, add them to the \"Tools\" workspace first.": "Um Toolkits auszuwählen, fügen Sie sie zunächst dem Arbeitsbereich „Werkzeuge“ hinzu.",
@ -1080,7 +1082,7 @@
"Top P": "Top P",
"Transformers": "Transformers",
"Trouble accessing Ollama?": "Probleme beim Zugriff auf Ollama?",
"Trust Proxy Environment": "",
"Trust Proxy Environment": "Proxy-Umgebung vertrauen",
"TTS Model": "TTS-Modell",
"TTS Settings": "TTS-Einstellungen",
"TTS Voice": "TTS-Stimme",
@ -1089,8 +1091,8 @@
"Uh-oh! There was an issue with the response.": "Oh nein! Es gab ein Problem mit der Antwort.",
"UI": "Oberfläche",
"Unarchive All": "Alle wiederherstellen",
"Unarchive All Archived Chats": "Alle archivierten Unterhaltungen wiederherstellen",
"Unarchive Chat": "Unterhaltung wiederherstellen",
"Unarchive All Archived Chats": "Alle archivierten Chats wiederherstellen",
"Unarchive Chat": "Chat wiederherstellen",
"Unlock mysteries": "Geheimnisse entsperren",
"Unpin": "Lösen",
"Unravel secrets": "Geheimnisse lüften",
@ -1102,7 +1104,7 @@
"Updated": "Aktualisiert",
"Updated at": "Aktualisiert am",
"Updated At": "Aktualisiert am",
"Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "",
"Upgrade to a licensed plan for enhanced capabilities, including custom theming and branding, and dedicated support.": "Upgrade auf einen lizenzierten Plan für erweiterte Funktionen wie individuelles Design, Branding und dedizierten Support.",
"Upload": "Hochladen",
"Upload a GGUF model": "GGUF-Model hochladen",
"Upload directory": "Upload-Verzeichnis",
@ -1131,7 +1133,7 @@
"Valves updated successfully": "Valves erfolgreich aktualisiert",
"variable": "Variable",
"variable to have them replaced with clipboard content.": "Variable, um den Inhalt der Zwischenablage beim Nutzen des Prompts zu ersetzen.",
"Verify Connection": "",
"Verify Connection": "Verbindung verifizieren",
"Version": "Version",
"Version {{selectedVersion}} of {{totalVersions}}": "Version {{selectedVersion}} von {{totalVersions}}",
"View Replies": "Antworten anzeigen",
@ -1179,8 +1181,8 @@
"You cannot upload an empty file.": "Sie können keine leere Datei hochladen.",
"You do not have permission to upload files": "Sie haben keine Berechtigung, Dateien hochzuladen",
"You do not have permission to upload files.": "Sie haben keine Berechtigung zum Hochladen von Dateien.",
"You have no archived conversations.": "Du hast keine archivierten Unterhaltungen.",
"You have shared this chat": "Sie haben diese Unterhaltung geteilt",
"You have no archived conversations.": "Du hast keine archivierten Chats.",
"You have shared this chat": "Sie haben diesen Chat geteilt",
"You're a helpful assistant.": "Du bist ein hilfreicher Assistent.",
"You're now logged in.": "Sie sind jetzt eingeloggt.",
"Your account status is currently pending activation.": "Ihr Kontostatus ist derzeit ausstehend und wartet auf Aktivierung.",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "(such e.g. `sh webui.sh --api`)",
"(latest)": "(much latest)",
"(Ollama)": "",
"{{ models }}": "",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(π.χ. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(π.χ. `sh webui.sh --api`)",
"(latest)": "(τελευταίο)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "",
"(latest)": "",
"(Ollama)": "",
"{{ models }}": "",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",
@ -436,6 +437,7 @@
"Enter timeout in seconds": "",
"Enter to Send": "",
"Enter Top K": "",
"Enter Top K Reranker": "",
"Enter URL (e.g. http://127.0.0.1:7860/)": "",
"Enter URL (e.g. http://localhost:11434)": "",
"Enter your current password": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "",
"(latest)": "",
"(Ollama)": "",
"{{ models }}": "",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",
@ -436,6 +437,7 @@
"Enter timeout in seconds": "",
"Enter to Send": "",
"Enter Top K": "",
"Enter Top K Reranker": "",
"Enter URL (e.g. http://127.0.0.1:7860/)": "",
"Enter URL (e.g. http://localhost:11434)": "",
"Enter your current password": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(p.ej. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(p.ej. `sh webui.sh --api`)",
"(latest)": "(latest)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "{{COUNT}} líneas ocultas",
"{{COUNT}} Replies": "{{COUNT}} Respuestas",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(nt `sh webui.sh --api --api-auth kasutajanimi_parool`)",
"(e.g. `sh webui.sh --api`)": "(nt `sh webui.sh --api`)",
"(latest)": "(uusim)",
"(Ollama)": "",
"{{ models }}": "{{ mudelid }}",
"{{COUNT}} hidden lines": "{{COUNT}} peidetud rida",
"{{COUNT}} Replies": "{{COUNT}} vastust",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(adib. `sh webui.sh --api --api-auth erabiltzaile_pasahitza`)",
"(e.g. `sh webui.sh --api`)": "(adib. `sh webui.sh --api`)",
"(latest)": "(azkena)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
"(latest)": "(آخرین)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(esim. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(esim. `sh webui.sh --api`)",
"(latest)": "(uusin)",
"(Ollama)": "",
"{{ models }}": "{{ mallit }}",
"{{COUNT}} hidden lines": "{{COUNT}} piilotettua riviä",
"{{COUNT}} Replies": "{{COUNT}} vastausta",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(par ex. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(par exemple `sh webui.sh --api`)",
"(latest)": "(dernier)",
"(Ollama)": "",
"{{ models }}": "{{ modèles }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(par ex. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(par exemple `sh webui.sh --api`)",
"(latest)": "(dernière version)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "{{COUNT}} réponses",

File diff suppressed because it is too large Load Diff

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "(למשל `sh webui.sh --api`)",
"(latest)": "(האחרון)",
"(Ollama)": "",
"{{ models }}": "{{ דגמים }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "(e.g. `sh webui.sh --api`)",
"(latest)": "(latest)",
"(Ollama)": "",
"{{ models }}": "{{ मॉडल }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "(npr. `sh webui.sh --api`)",
"(latest)": "(najnovije)",
"(Ollama)": "",
"{{ models }}": "{{ modeli }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(pl. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(pl. `sh webui.sh --api`)",
"(latest)": "(legújabb)",
"(Ollama)": "",
"{{ models }}": "{{ modellek }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(contoh: `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(contoh: `sh webui.sh --api`)",
"(latest)": "(terbaru)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(m.sh. `sh webui.sh --api --api-auth username_password `)",
"(e.g. `sh webui.sh --api`)": "(m.sh. `sh webui.sh --api`)",
"(latest)": "(is déanaí)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "{{COUNT}} Freagra",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "(p.e. `sh webui.sh --api`)",
"(latest)": "(ultima)",
"(Ollama)": "",
"{{ models }}": "{{ modelli }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(例: `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(例: `sh webui.sh --api`)",
"(latest)": "(最新)",
"(Ollama)": "",
"{{ models }}": "{{ モデル }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(მაგ: `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(მაგ: `sh webui.sh --api`)",
"(latest)": "(უახლესი)",
"(Ollama)": "",
"{{ models }}": "{{ მოდელები }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "{{COUNT}} პასუხი",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(예: `sh webui.sh --api --api-auth 사용자이름_비밀번호`)",
"(e.g. `sh webui.sh --api`)": "(예: `sh webui.sh --api`)",
"(latest)": "(최근)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(pvz. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(pvz. `sh webui.sh --api`)",
"(latest)": "(naujausias)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(contoh `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(contoh `sh webui.sh --api`)",
"(latest)": "(terkini)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(f.eks. `sh webui.sh --api --api-auth brukernavn_passord`)",
"(e.g. `sh webui.sh --api`)": "(f.eks. `sh webui.sh --api`)",
"(latest)": "(siste)",
"(Ollama)": "",
"{{ models }}": "{{ modeller }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "{{COUNT}} svar",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(bv. `sh webui.sh --api --api-auth gebruikersnaam_wachtwoord`)",
"(e.g. `sh webui.sh --api`)": "(bv. `sh webui.sh --api`)",
"(latest)": "(nieuwste)",
"(Ollama)": "",
"{{ models }}": "{{ modellen }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "(ਉਦਾਹਰਣ ਦੇ ਤੌਰ ਤੇ `sh webui.sh --api`)",
"(latest)": "(ਤਾਜ਼ਾ)",
"(Ollama)": "",
"{{ models }}": "{{ ਮਾਡਲ }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(np. `sh webui.sh --api --api-auth username_password`)>",
"(e.g. `sh webui.sh --api`)": "(np. `sh webui.sh --api`)",
"(latest)": "(najnowszy)",
"(Ollama)": "",
"{{ models }}": "{{ modele }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "{{COUNT}} odpowiedzi",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(por exemplo, `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(por exemplo, `sh webui.sh --api`)",
"(latest)": "(último)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "(por exemplo, `sh webui.sh --api`)",
"(latest)": "(mais recente)",
"(Ollama)": "",
"{{ models }}": "{{ modelos }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(de ex. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(de ex. `sh webui.sh --api`)",
"(latest)": "(ultimul)",
"(Ollama)": "",
"{{ models }}": "{{ modele }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(например, `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(например, `sh webui.sh --api`)",
"(latest)": "(последняя)",
"(Ollama)": "",
"{{ models }}": "{{ модели }}",
"{{COUNT}} hidden lines": "{{COUNT}} скрытых строк",
"{{COUNT}} Replies": "{{COUNT}} Ответов",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(napr. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(napr. `sh webui.sh --api`)",
"(latest)": "Najnovšie",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(нпр. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(нпр. `sh webui.sh --api`)",
"(latest)": "(најновије)",
"(Ollama)": "",
"{{ models }}": "{{ модели }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "{{COUNT}} одговора",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(t.ex. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(t.ex. `sh webui.sh --api`)",
"(latest)": "(senaste)",
"(Ollama)": "",
"{{ models }}": "{{ modeller }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "{{COUNT}} Svar",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(เช่น `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(เช่น `sh webui.sh --api`)",
"(latest)": "(ล่าสุด)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "",
"(latest)": "",
"(Ollama)": "",
"{{ models }}": "",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(örn. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(örn. `sh webui.sh --api`)",
"(latest)": "(en son)",
"(Ollama)": "",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "{{COUNT}} Yanıt",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(напр. `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(напр. `sh webui.sh --api`)",
"(latest)": "(остання)",
"(Ollama)": "(Ollama)",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "{{COUNT}} прихованих рядків",
"{{COUNT}} Replies": "{{COUNT}} Відповіді",
@ -68,8 +69,8 @@
"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, логіти зі значенням менше 0.045 відфільтровуються.",
"Always": "Завжди",
"Always Collapse Code Blocks": "",
"Always Expand Details": "",
"Always Collapse Code Blocks": "Завжди згортати блоки коду",
"Always Expand Details": "Завжди розгортати деталі",
"Amazing": "Чудово",
"an assistant": "асистента",
"Analyzed": "Проаналізовано",
@ -272,7 +273,7 @@
"Default Prompt Suggestions": "Пропозиції промтів замовчуванням",
"Default to 389 or 636 if TLS is enabled": "За замовчуванням використовується 389 або 636, якщо TLS увімкнено.",
"Default to ALL": "За замовчуванням — УСІ.",
"Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "",
"Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "За замовчуванням використовувати сегментований пошук для зосередженого та релевантного вилучення контенту, це рекомендується у більшості випадків.",
"Default User Role": "Роль користувача за замовчуванням",
"Delete": "Видалити",
"Delete a model": "Видалити модель",
@ -295,7 +296,7 @@
"Describe your knowledge base and objectives": "Опишіть вашу базу знань та цілі",
"Description": "Опис",
"Didn't fully follow instructions": "Не повністю дотримувалися інструкцій",
"Direct": "",
"Direct": "Прямий",
"Direct Connections": "Прямі з'єднання",
"Direct Connections allow users to connect to their own OpenAI compatible API endpoints.": "Прямі з'єднання дозволяють користувачам підключатися до своїх власних API-кінцевих точок, сумісних з OpenAI.",
"Direct Connections settings updated": "Налаштування прямих з'єднань оновлено",
@ -318,8 +319,8 @@
"Dive into knowledge": "Зануртесь у знання",
"Do not install functions from sources you do not fully trust.": "Не встановлюйте функції з джерел, яким ви не повністю довіряєте.",
"Do not install tools from sources you do not fully trust.": "Не встановлюйте інструменти з джерел, яким ви не повністю довіряєте.",
"Docling": "",
"Docling Server URL required.": "",
"Docling": "Docling",
"Docling Server URL required.": "Потрібна URL-адреса сервера Docling.",
"Document": "Документ",
"Document Intelligence": "Інтелект документа",
"Document Intelligence endpoint and key required.": "Потрібні кінцева точка та ключ для Інтелекту документа.",
@ -390,7 +391,7 @@
"Enter Chunk Size": "Введіть розмір фрагменту",
"Enter comma-seperated \"token:bias_value\" pairs (example: 5432:100, 413:-100)": "Введіть пари \"токен:значення_зміщення\", розділені комами (напр.: 5432:100, 413:-100)",
"Enter description": "Введіть опис",
"Enter Docling Server URL": "",
"Enter Docling Server URL": "Введіть URL-адресу сервера Docling",
"Enter Document Intelligence Endpoint": "Введіть кінцеву точку Інтелекту документа",
"Enter Document Intelligence Key": "Введіть ключ Інтелекту документа",
"Enter domains separated by commas (e.g., example.com,site.org)": "Введіть домени, розділені комами (наприклад, example.com, site.org)",
@ -478,7 +479,7 @@
"Export Prompts": "Експорт промтів",
"Export to CSV": "Експорт в CSV",
"Export Tools": "Експорт інструментів",
"External": "",
"External": "Зовнішній",
"External Models": "Зовнішні моделі",
"Failed to add file.": "Не вдалося додати файл.",
"Failed to create API Key.": "Не вдалося створити API ключ.",
@ -591,7 +592,7 @@
"Include `--api` flag when running stable-diffusion-webui": "Включіть прапор `--api` при запуску stable-diffusion-webui",
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "Впливає на те, як швидко алгоритм реагує на відгуки згенерованого тексту. Нижча швидкість навчання призведе до повільніших коригувань, тоді як вища швидкість навчання зробить алгоритм більш чутливим.",
"Info": "Інфо",
"Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "",
"Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "Вставте весь вміст як контекст для всебічної обробки, це рекомендується для складних запитів.",
"Input commands": "Команди вводу",
"Install from Github URL": "Встановіть з URL-адреси Github",
"Instant Auto-Send After Voice Transcription": "Миттєва автоматична відправка після транскрипції голосу",
@ -815,7 +816,7 @@
"Presence Penalty": "Штраф за присутність",
"Previous 30 days": "Попередні 30 днів",
"Previous 7 days": "Попередні 7 днів",
"Private": "",
"Private": "Приватний",
"Profile Image": "Зображення профілю",
"Prompt": "Підказка",
"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Підказка (напр., розкажіть мені цікавий факт про Римську імперію)",
@ -825,7 +826,7 @@
"Prompt updated successfully": "Підказку успішно оновлено",
"Prompts": "Промти",
"Prompts Access": "Доступ до підказок",
"Public": "",
"Public": "Публічний",
"Pull \"{{searchValue}}\" from Ollama.com": "Завантажити \"{{searchValue}}\" з Ollama.com",
"Pull a model from Ollama.com": "Завантажити модель з Ollama.com",
"Query Generation Prompt": "Підказка для генерації запиту",
@ -990,7 +991,7 @@
"System": "Система",
"System Instructions": "Системні інструкції",
"System Prompt": "Системний промт",
"Tags": "",
"Tags": "Теги",
"Tags Generation": "Генерація тегів",
"Tags Generation Prompt": "Підказка для генерації тегів",
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "Вибірка без хвоста використовується для зменшення впливу менш ймовірних токенів на результат. Вищий показник (напр., 2.0) зменшить вплив сильніше, тоді як значення 1.0 вимикає цю опцію.",
@ -1021,7 +1022,7 @@
"Theme": "Тема",
"Thinking...": "Думаю...",
"This action cannot be undone. Do you wish to continue?": "Цю дію не можна скасувати. Ви бажаєте продовжити?",
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "",
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "Цей канал був створений {{createdAt}}. Це самий початок каналу {{channelName}}.",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Це забезпечує збереження ваших цінних розмов у безпечному бекенд-сховищі. Дякуємо!",
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Це експериментальна функція, вона може працювати не так, як очікувалося, і може бути змінена в будь-який час.",
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "Ця опція контролює, скільки токенів зберігається при оновленні контексту. Наприклад, якщо встановити значення 2, останні 2 токени контексту розмови будуть збережені. Збереження контексту допомагає підтримувати послідовність розмови, але може зменшити здатність реагувати на нові теми.",
@ -1131,7 +1132,7 @@
"Valves updated successfully": "Клапани успішно оновлено",
"variable": "змінна",
"variable to have them replaced with clipboard content.": "змінна, щоб замінити їх вмістом буфера обміну.",
"Verify Connection": "",
"Verify Connection": "Перевірити з'єднання",
"Version": "Версія",
"Version {{selectedVersion}} of {{totalVersions}}": "Версія {{selectedVersion}} з {{totalVersions}}",
"View Replies": "Переглянути відповіді",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(مثال کے طور پر: `sh webui.sh --api --api-auth username_password`)",
"(e.g. `sh webui.sh --api`)": "(مثال کے طور پر: `sh webui.sh --api`)",
"(latest)": "(تازہ ترین)",
"(Ollama)": "",
"{{ models }}": "{{ ماڈلز }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "",
"(e.g. `sh webui.sh --api`)": "(vd: `sh webui.sh --api`)",
"(latest)": "(mới nhất)",
"(Ollama)": "",
"{{ models }}": "{{ mô hình }}",
"{{COUNT}} hidden lines": "",
"{{COUNT}} Replies": "",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(例如 `sh webui.sh --api --api-auth username_password`",
"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`",
"(latest)": "(最新版)",
"(Ollama)": "(Ollama)",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "{{COUNT}} 行被隐藏",
"{{COUNT}} Replies": "{{COUNT}} 回复",

View File

@ -4,6 +4,7 @@
"(e.g. `sh webui.sh --api --api-auth username_password`)": "(例如 `sh webui.sh --api --api-auth username_password`",
"(e.g. `sh webui.sh --api`)": "(例如 `sh webui.sh --api`",
"(latest)": "(最新版)",
"(Ollama)": "(Ollama)",
"{{ models }}": "{{ models }}",
"{{COUNT}} hidden lines": "已隱藏 {{COUNT}} 行",
"{{COUNT}} Replies": "{{COUNT}} 回覆",
@ -66,7 +67,7 @@
"Allow Voice Interruption in Call": "允許在通話中打斷語音",
"Allowed Endpoints": "允許的端點",
"Already have an account?": "已經有帳號了嗎?",
"Alternative to the top_p, and aims to ensure a balance of quality and variety. The parameter p represents the minimum probability for a token to be considered, relative to the probability of the most likely token. For example, with p=0.05 and the most likely token having a probability of 0.9, logits with a value less than 0.045 are filtered out.": "top_p 的替代方案,旨在確保品質與多樣性之間的平衡。參數 p 代表一個 token 被考慮的最低機率,相對於最有可能 token 的機率。例如,當 p=0.05 且最有可能 token 的機率為 0.9 時,機率小於 0.045 的 logits 將被過濾掉。",
"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 代表一個 token 被考慮的最低機率,相對於最有可能 token 的機率。例如,當 p=0.05 且最有可能 token 的機率為 0.9 時,機率小於 0.045 的 logits 將被過濾掉。",
"Always": "總是",
"Always Collapse Code Blocks": "總是摺疊程式碼區塊",
"Always Expand Details": "總是展開詳細資訊",
@ -132,7 +133,7 @@
"Bing Search V7 Endpoint": "Bing 搜尋 V7 端點",
"Bing Search V7 Subscription Key": "Bing 搜尋 V7 訂閱金鑰",
"Bocha Search API Key": "Bocha 搜尋 API 金鑰",
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "針對受限的回應,增強或懲罰特定 tokens。偏置值將限制在 -100 到 100 (含)。 (預設: none)",
"Boosting or penalizing specific tokens for constrained responses. Bias values will be clamped between -100 and 100 (inclusive). (Default: none)": "針對受限的回應,增強或懲罰特定 tokens。偏置值將限制在 -100 到 100 (含)。 (預設none)",
"Brave Search API Key": "Brave 搜尋 API 金鑰",
"By {{name}}": "由 {{name}} 製作",
"Bypass Embedding and Retrieval": "繞過嵌入與檢索",
@ -171,11 +172,11 @@
"Clear memory": "清除記憶",
"Clear Memory": "清除記憶",
"click here": "點選這裡",
"Click here for filter guides.": "點選這裡查看篩選器指南。",
"Click here for filter guides.": "點選這裡檢視篩選器指南。",
"Click here for help.": "點選這裡取得協助。",
"Click here to": "點選這裡",
"Click here to download user import template file.": "點選這裡下載使用者匯入範本檔案。",
"Click here to learn more about faster-whisper and see the available models.": "點選這裡了解更多關於 faster-whisper 的資訊並查看可用的模型。",
"Click here to learn more about faster-whisper and see the available models.": "點選這裡了解更多關於 faster-whisper 的資訊並檢視可用的模型。",
"Click here to see available models.": "點選這裡以檢視可用的模型",
"Click here to select": "點選這裡選擇",
"Click here to select a csv file.": "點選這裡選擇 CSV 檔案。",
@ -193,9 +194,9 @@
"Code Execution Engine": "程式碼執行引擎",
"Code Execution Timeout": "程式執行超時",
"Code formatted successfully": "程式碼格式化成功",
"Code Interpreter": "程式碼解釋器",
"Code Interpreter Engine": "程式碼解釋器引擎",
"Code Interpreter Prompt Template": "程式碼解釋器提示詞模板",
"Code Interpreter": "程式碼直譯器",
"Code Interpreter Engine": "程式碼直譯器引擎",
"Code Interpreter Prompt Template": "程式碼直譯器提示詞範本",
"Collapse": "摺疊",
"Collection": "收藏",
"Color": "顏色",
@ -225,9 +226,9 @@
"Continue with Email": "使用 Email 繼續",
"Continue with LDAP": "使用 LDAP 繼續",
"Control how message text is split for TTS requests. 'Punctuation' splits into sentences, 'paragraphs' splits into paragraphs, and 'none' keeps the message as a single string.": "控制文字轉語音TTS請求中如何分割訊息文字。「標點符號」分割為句子「段落」分割為段落「無」則保持訊息為單一字串。",
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "控制生成文中 token 序列的重複程度。較高的值(例如 1.5)會更強烈地懲罰重複,而較低的值(例如 1.1)會更寬容。設為 1 時,此功能將停用。",
"Control the repetition of token sequences in the generated text. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 1.1) will be more lenient. At 1, it is disabled.": "控制生成文中 token 序列的重複程度。較高的值(例如 1.5)會更強烈地懲罰重複,而較低的值(例如 1.1)會更寬容。設為 1 時,此功能將停用。",
"Controls": "控制項",
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "控制輸出結果的連貫性與多樣性之間的平衡。數值越低會產生更集中且連貫的文。",
"Controls the balance between coherence and diversity of the output. A lower value will result in more focused and coherent text.": "控制輸出結果的連貫性與多樣性之間的平衡。數值越低會產生更集中且連貫的文。",
"Copied": "已複製",
"Copied shared chat URL to clipboard!": "已複製共用對話 URL 到剪貼簿!",
"Copied to clipboard": "已複製到剪貼簿",
@ -252,7 +253,7 @@
"Created At": "建立於",
"Created by": "建立者",
"CSV Import": "CSV 匯入",
"Ctrl+Enter to Send": "使用 Ctrl+Enter 送",
"Ctrl+Enter to Send": "使用 Ctrl+Enter 送",
"Current Model": "目前模型",
"Current Password": "目前密碼",
"Custom": "自訂",
@ -270,7 +271,7 @@
"Default permissions": "預設權限",
"Default permissions updated successfully": "預設權限更新成功",
"Default Prompt Suggestions": "預設提示詞建議",
"Default to 389 or 636 if TLS is enabled": "如果用了 TLS 則預設為 389 或 636",
"Default to 389 or 636 if TLS is enabled": "如果用了 TLS 則預設為 389 或 636",
"Default to ALL": "預設到所有",
"Default to segmented retrieval for focused and relevant content extraction, this is recommended for most cases.": "預設使用分段檢索以提取聚焦且相關的內容,建議用於大多數情況。",
"Default User Role": "預設使用者角色",
@ -366,12 +367,12 @@
"Enable API Key": "啟用 API 金鑰",
"Enable autocomplete generation for chat messages": "啟用聊天訊息的自動完成生成",
"Enable Code Execution": "啟用程式碼執行",
"Enable Code Interpreter": "啟用程式碼解釋器",
"Enable Code Interpreter": "啟用程式碼直譯器",
"Enable Community Sharing": "啟用社群分享",
"Enable Memory Locking (mlock) to prevent model data from being swapped out of RAM. This option locks the model's working set of pages into RAM, ensuring that they will not be swapped out to disk. This can help maintain performance by avoiding page faults and ensuring fast data access.": "啟用記憶體鎖定mlock以防止模型資料被換出 RAM。此選項會將模型的工作頁面集鎖定在 RAM 中,確保它們不會被換出到磁碟。這可以透過避免頁面錯誤和確保快速資料存取來維持效能。",
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "啟用記憶體映射mmap以載入模型資料。此選項允許系統使用磁碟儲存作為 RAM 的延伸,透過將磁碟檔案視為在 RAM 中來處理。這可以透過允許更快的資料存取來改善模型效能。然而,它可能無法在所有系統上正常運作,並且可能會消耗大量磁碟空間。",
"Enable Memory Mapping (mmap) to load model data. This option allows the system to use disk storage as an extension of RAM by treating disk files as if they were in RAM. This can improve model performance by allowing for faster data access. However, it may not work correctly with all systems and can consume a significant amount of disk space.": "啟用記憶體配置圖mmap以載入模型資料。此選項允許系統使用磁碟儲存作為 RAM 的延伸,透過將磁碟檔案視為在 RAM 中來處理。這可以透過允許更快的資料存取來改善模型效能。然而,它可能無法在所有系統上正常運作,並且可能會消耗大量磁碟空間。",
"Enable Message Rating": "啟用訊息評分",
"Enable Mirostat sampling for controlling perplexity.": "啟用 Mirostat 樣以控制 perplexity。",
"Enable Mirostat sampling for controlling perplexity.": "啟用 Mirostat 樣以控制 perplexity。",
"Enable New Sign Ups": "允許新使用者註冊",
"Enabled": "已啟用",
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "請確認您的 CSV 檔案包含以下 4 個欄位,並按照此順序排列:姓名、電子郵件、密碼、角色。",
@ -434,11 +435,11 @@
"Enter the public URL of your WebUI. This URL will be used to generate links in the notifications.": "請輸入您 WebUI 的公開 URL。此 URL 將用於在通知中產生連結。",
"Enter Tika Server URL": "輸入 Tika 伺服器 URL",
"Enter timeout in seconds": "請以秒為單位輸入超時時間",
"Enter to Send": "使用 Enter 送",
"Enter to Send": "使用 Enter 送",
"Enter Top K": "輸入 Top K 值",
"Enter URL (e.g. http://127.0.0.1:7860/)": "輸入 URL例如http://127.0.0.1:7860/",
"Enter URL (e.g. http://localhost:11434)": "輸入 URL例如http://localhost:11434",
"Enter your current password": "輸入您的前密碼",
"Enter your current password": "輸入您的前密碼",
"Enter Your Email": "輸入您的電子郵件",
"Enter Your Full Name": "輸入您的全名",
"Enter your message": "輸入您的訊息",
@ -482,7 +483,7 @@
"External Models": "外部模型",
"Failed to add file.": "新增檔案失敗。",
"Failed to create API Key.": "建立 API 金鑰失敗。",
"Failed to fetch models": "取模型失敗",
"Failed to fetch models": "模型失敗",
"Failed to read clipboard contents": "讀取剪貼簿內容失敗",
"Failed to save models configuration": "儲存模型設定失敗",
"Failed to update settings": "更新設定失敗",
@ -589,13 +590,13 @@
"Include": "包含",
"Include `--api-auth` flag when running stable-diffusion-webui": "執行 stable-diffusion-webui 時包含 `--api-auth` 參數",
"Include `--api` flag when running stable-diffusion-webui": "執行 stable-diffusion-webui 時包含 `--api` 參數",
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "影響算法對生成文本回饋的反應速度。較低的學習率會導致調整速度較慢,而較高的學習率會使算法反應更靈敏。",
"Influences how quickly the algorithm responds to feedback from the generated text. A lower learning rate will result in slower adjustments, while a higher learning rate will make the algorithm more responsive.": "影響算法對生成文本回饋的反應速度。較低的學習率會導致調整速度較慢,而較高的學習率會使算法反應更靈敏。",
"Info": "資訊",
"Inject the entire content as context for comprehensive processing, this is recommended for complex queries.": "將完整內容注入為上下文以進行全面處理,建議用於複雜查詢。",
"Input commands": "輸入命令",
"Install from Github URL": "從 GitHub URL 安裝",
"Instant Auto-Send After Voice Transcription": "語音轉錄後立即自動傳送",
"Integration": "集成",
"Integration": "整合",
"Interface": "介面",
"Invalid file format.": "無效檔案格式。",
"Invalid Tag": "無效標籤",
@ -701,7 +702,7 @@
"Modelfile Content": "模型檔案內容",
"Models": "模型",
"Models Access": "模型存取",
"Models configuration saved successfully": "模型設定存成功",
"Models configuration saved successfully": "模型設定存成功",
"Mojeek Search API Key": "Mojeek 搜尋 API 金鑰",
"more": "更多",
"More": "更多",
@ -764,7 +765,7 @@
"Open file": "開啟檔案",
"Open in full screen": "全螢幕開啟",
"Open new chat": "開啟新的對話",
"Open WebUI uses faster-whisper internally.": "Open WebUI 使用部 faster-whisper。",
"Open WebUI uses faster-whisper internally.": "Open WebUI 使用部 faster-whisper。",
"Open WebUI uses SpeechT5 and CMU Arctic speaker embeddings.": "Open WebUI 使用 SpeechT5 和 CMU Arctic 說話者嵌入。",
"Open WebUI version (v{{OPEN_WEBUI_VERSION}}) is lower than required version (v{{REQUIRED_VERSION}})": "Open WebUI 版本 (v{{OPEN_WEBUI_VERSION}}) 低於所需版本 (v{{REQUIRED_VERSION}})",
"OpenAI": "OpenAI",
@ -772,7 +773,7 @@
"OpenAI API Config": "OpenAI API 設定",
"OpenAI API Key is required.": "需要 OpenAI API 金鑰。",
"OpenAI API settings updated": "OpenAI API 設定已更新",
"OpenAI URL/Key required.": "需要 OpenAI URL或金鑰。",
"OpenAI URL/Key required.": "需要 OpenAI URL 或金鑰。",
"or": "或",
"Organize your users": "組織您的使用者",
"Other": "其他",
@ -805,13 +806,13 @@
"Please do not close the settings page while loading the model.": "載入模型時,請勿關閉設定頁面。",
"Please enter a prompt": "請輸入提示詞",
"Please fill in all fields.": "請填寫所有欄位。",
"Please select a model first.": "請先選擇。",
"Please select a model first.": "請先選擇型。",
"Please select a model.": "請選擇一個模型。",
"Please select a reason": "請選擇原因",
"Port": "連接埠",
"Positive attitude": "積極的態度",
"Prefix ID": "前 ID",
"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "前綴 ID 用於透過為模型 ID 新增前綴以避免與其他連線衝突 - 留空以停用",
"Prefix ID": "前 ID",
"Prefix ID is used to avoid conflicts with other connections by adding a prefix to the model IDs - leave empty to disable": "前置 ID 用於透過為模型 ID 新增字首以避免與其他連線衝突 - 留空以停用",
"Presence Penalty": "在場懲罰",
"Previous 30 days": "過去 30 天",
"Previous 7 days": "過去 7 天",
@ -859,13 +860,13 @@
"Reset All Models": "重設所有模型",
"Reset Upload Directory": "重設上傳目錄",
"Reset Vector Storage/Knowledge": "重設向量儲存或知識",
"Reset view": "重設",
"Reset view": "重設視",
"Response notifications cannot be activated as the website permissions have been denied. Please visit your browser settings to grant the necessary access.": "無法啟用回應通知,因為網站權限已遭拒。請前往瀏覽器設定以授予必要存取權限。",
"Response splitting": "回應分割",
"Result": "結果",
"Retrieval": "檢索",
"Retrieval Query Generation": "檢索查詢生成",
"Rich Text Input for Chat": "使用富文輸入對話",
"Rich Text Input for Chat": "使用富文輸入對話",
"RK": "RK",
"Role": "角色",
"Rosé Pine": "玫瑰松",
@ -914,7 +915,7 @@
"Select a pipeline url": "選擇管線 URL",
"Select a tool": "選擇工具",
"Select an auth method": "選擇驗證方式",
"Select an Ollama instance": "選擇一個 Ollama 實例",
"Select an Ollama instance": "選擇一個 Ollama 執行個體",
"Select Engine": "選擇引擎",
"Select Knowledge": "選擇知識庫",
"Select only one model to call": "僅選擇一個模型來呼叫",
@ -949,8 +950,8 @@
"Sets a flat bias against tokens that have appeared at least once. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "對至少出現過一次的 token 設定統一的偏差值。較高的值(例如 1.5)會更強烈地懲罰重複,而較低的值(例如 0.9)會更寬容。設為 0 時,此功能將停用。",
"Sets a scaling bias against tokens to penalize repetitions, based on how many times they have appeared. A higher value (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., 0.9) will be more lenient. At 0, it is disabled.": "根據 token 出現的次數,設定一個縮放偏差值來懲罰重複。較高的值(例如 1.5)會更強烈地懲罰重複,而較低的值(例如 0.9)會更寬容。設為 0 時,此功能將停用。",
"Sets how far back for the model to look back to prevent repetition.": "設定模型回溯多遠以防止重複。",
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "設定用於生成的隨機數種子。將其設定為特定數字將使模型針對相同的提示生成相同的文。",
"Sets the size of the context window used to generate the next token.": "設定用於生成下一個 token 的上下文大小。",
"Sets the random number seed to use for generation. Setting this to a specific number will make the model generate the same text for the same prompt.": "設定用於生成的隨機數種子。將其設定為特定數字將使模型針對相同的提示生成相同的文。",
"Sets the size of the context window used to generate the next token.": "設定用於生成下一個 token 的上下文窗大小。",
"Sets the stop sequences to use. When this pattern is encountered, the LLM will stop generating text and return. Multiple stop patterns may be set by specifying multiple separate stop parameters in a modelfile.": "設定要使用的停止序列。當遇到此模式時,大型語言模型將停止生成文字並返回。可以在模型檔案中指定多個單獨的停止參數來設定多個停止模式。",
"Settings": "設定",
"Settings saved successfully!": "設定已成功儲存!",
@ -977,7 +978,7 @@
"Speech-to-Text Engine": "語音轉文字 (STT) 引擎",
"Stop": "停止",
"Stop Sequence": "停止序列",
"Stream Chat Response": "流式對話回應",
"Stream Chat Response": "流式對話回應",
"STT Model": "語音轉文字 (STT) 模型",
"STT Settings": "語音轉文字 (STT) 設定",
"Subtitle (e.g. about the Roman Empire)": "副標題(例如:關於羅馬帝國)",
@ -993,7 +994,7 @@
"Tags": "標籤",
"Tags Generation": "標籤生成",
"Tags Generation Prompt": "標籤生成提示詞",
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "尾部自由樣用於減少輸出結果中較低機率 token 的影響。較高的值(例如 2.0)會減少更多影響,而值為 1.0 時會停用此設定。",
"Tail free sampling is used to reduce the impact of less probable tokens from the output. A higher value (e.g., 2.0) will reduce the impact more, while a value of 1.0 disables this setting.": "尾部自由樣用於減少輸出結果中較低機率 token 的影響。較高的值(例如 2.0)會減少更多影響,而值為 1.0 時會停用此設定。",
"Talk to model": "與模型對話",
"Tap to interrupt": "點選以中斷",
"Tasks": "任務",
@ -1008,11 +1009,11 @@
"Thanks for your feedback!": "感謝您的回饋!",
"The Application Account DN you bind with for search": "您綁定用於搜尋的應用程式帳號 DN",
"The base to search for users": "搜尋使用者的基礎",
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "批次大小決定一次處理多少文請求。較高的批次大小可以提高模型的效能和速度,但也需要更多記憶體。",
"The batch size determines how many text requests are processed together at once. A higher batch size can increase the performance and speed of the model, but it also requires more memory.": "批次大小決定一次處理多少文請求。較高的批次大小可以提高模型的效能和速度,但也需要更多記憶體。",
"The developers behind this plugin are passionate volunteers from the community. If you find this plugin helpful, please consider contributing to its development.": "這個外掛背後的開發者是來自社群的熱情志願者。如果您覺得這個外掛很有幫助,請考慮為其開發做出貢獻。",
"The evaluation leaderboard is based on the Elo rating system and is updated in real-time.": "評估排行榜基於 Elo 評分系統,並即時更新。",
"The LDAP attribute that maps to the mail that users use to sign in.": "到使用者用於登入的使用者郵箱的 LDAP 屬性。",
"The LDAP attribute that maps to the username that users use to sign in.": "到使用者用於登入的使用者名稱的 LDAP 屬性。",
"The LDAP attribute that maps to the mail that users use to sign in.": "映到使用者用於登入的使用者郵箱的 LDAP 屬性。",
"The LDAP attribute that maps to the username that users use to sign in.": "映到使用者用於登入的使用者名稱的 LDAP 屬性。",
"The leaderboard is currently in beta, and we may adjust the rating calculations as we refine the algorithm.": "排行榜目前處於測試階段,我們可能會在改進演算法時調整評分計算方式。",
"The maximum file size in MB. If the file size exceeds this limit, the file will not be uploaded.": "檔案大小上限MB。如果檔案大小超過此限制檔案將不會被上傳。",
"The maximum number of files that can be used at once in chat. If the number of files exceeds this limit, the files will not be uploaded.": "對話中一次可使用的最大檔案數量。如果檔案數量超過此限制,檔案將不會被上傳。",
@ -1021,10 +1022,10 @@
"Theme": "主題",
"Thinking...": "正在思考...",
"This action cannot be undone. Do you wish to continue?": "此操作無法復原。您確定要繼續進行嗎?",
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "此頻道建於 {{createdAt}}。這是 {{channelName}} 頻道的起點。",
"This channel was created on {{createdAt}}. This is the very beginning of the {{channelName}} channel.": "此頻道於 {{createdAt}}。這是 {{channelName}} 頻道的起點。",
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "這確保您寶貴的對話會安全地儲存到您的後端資料庫。謝謝!",
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "這是一個實驗性功能,它可能無法如預期運作,並且可能會隨時變更。",
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "此選項控制在刷新上下文時保留多少 token。例如如果設定為 2則會保留對話上下文的最後 2 個 token。保留上下文有助於保持對話的連貫性但也可能降低對新主題的回應能力。",
"This option controls how many tokens are preserved when refreshing the context. For example, if set to 2, the last 2 tokens of the conversation context will be retained. Preserving context can help maintain the continuity of a conversation, but it may reduce the ability to respond to new topics.": "此選項控制在重新整理上下文時保留多少 token。例如如果設定為 2則會保留對話上下文的最後 2 個 token。保留上下文有助於保持對話的連貫性但也可能降低對新主題的回應能力。",
"This option sets the maximum number of tokens the model can generate in its response. Increasing this limit allows the model to provide longer answers, but it may also increase the likelihood of unhelpful or irrelevant content being generated.": "此選項設定模型在其回應中可以生成的最大 token 數量。增加此限制允許模型提供更長的答案,但也可能增加生成無用或不相關內容的可能性。",
"This option will delete all existing files in the collection and replace them with newly uploaded files.": "此選項將刪除集合中的所有現有檔案,並用新上傳的檔案取代它們。",
"This response was generated by \"{{model}}\"": "此回應由「{{model}}」生成",
@ -1152,10 +1153,10 @@
"Webhook URL": "Webhook URL",
"WebUI Settings": "WebUI 設定",
"WebUI URL": "WebUI URL",
"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI 將向 \"{{url}}/api/chat\" 送請求",
"WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI 將向 \"{{url}}/chat/completions\" 送請求",
"What are you trying to achieve?": "您正在試圖完成什",
"What are you working on?": "您現在的工作是什",
"WebUI will make requests to \"{{url}}/api/chat\"": "WebUI 將向 \"{{url}}/api/chat\" 送請求",
"WebUI will make requests to \"{{url}}/chat/completions\"": "WebUI 將向 \"{{url}}/chat/completions\" 送請求",
"What are you trying to achieve?": "您正在試圖完成什",
"What are you working on?": "您現在的工作是什",
"Whats New in": "新功能",
"When enabled, the model will respond to each chat message in real-time, generating a response as soon as the user sends a message. This mode is useful for live chat applications, but may impact performance on slower hardware.": "啟用時,模型將即時回應每個對話訊息,在使用者傳送訊息後立即生成回應。此模式適用於即時對話應用程式,但在較慢的硬體上可能會影響效能。",
"wherever you are": "無論您在何處",
@ -1163,14 +1164,14 @@
"Why?": "為什麼?",
"Widescreen Mode": "寬螢幕模式",
"Won": "獲勝",
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "與 top-k 一起使用。較高的值(例如 0.95)將產生更多樣化的文本,而較低的值(例如 0.5)將生成更集中和保守的文本。",
"Works together with top-k. A higher value (e.g., 0.95) will lead to more diverse text, while a lower value (e.g., 0.5) will generate more focused and conservative text.": "與 top-k 一起使用。較高的值(例如 0.95)將產生更多樣化的文字,而較低的值(例如 0.5)將生成更集中和保守的文字。",
"Workspace": "工作區",
"Workspace Permissions": "工作區權限",
"Write": "寫入",
"Write a prompt suggestion (e.g. Who are you?)": "撰寫提示詞建議(例如:你是誰?)",
"Write a summary in 50 words that summarizes [topic or keyword].": "用 50 字寫一篇總結 [主題或關鍵字] 的摘要。",
"Write something...": "寫一些什...",
"Write your model template content here": "在此撰寫您的模型範本容",
"Write something...": "寫一些什...",
"Write your model template content here": "在此撰寫您的模型範本容",
"Yesterday": "昨天",
"You": "您",
"You are currently using a trial license. Please contact support to upgrade your license.": "您目前使用的是試用授權。請聯絡支援以升級您的授權。",

View File

@ -47,7 +47,7 @@ export const chatId = writable('');
export const chatTitle = writable('');
export const channels = writable([]);
export const chats = writable([]);
export const chats = writable(null);
export const pinnedChats = writable([]);
export const tags = writable([]);

View File

@ -63,8 +63,8 @@ export const replaceTokens = (content, sourceIds, char, user) => {
if (Array.isArray(sourceIds)) {
sourceIds.forEach((sourceId, idx) => {
const regex = new RegExp(`\\[${idx}\\]`, 'g');
segment = segment.replace(regex, `<source_id data="${idx}" title="${sourceId}" />`);
const regex = new RegExp(`\\[${idx + 1}\\]`, 'g');
segment = segment.replace(regex, `<source_id data="${idx + 1}" title="${sourceId}" />`);
});
}

View File

@ -203,6 +203,22 @@
};
};
const executeTool = async (data, cb) => {
console.log(data);
// TODO: MCP (SSE) support
// TODO: API Server support
if (cb) {
cb(
JSON.parse(
JSON.stringify({
result: null
})
)
);
}
};
const chatEventHandler = async (event, cb) => {
const chat = $page.url.pathname.includes(`/c/${event.chat_id}`);
@ -256,6 +272,9 @@
if (type === 'execute:python') {
console.log('execute:python', data);
executePythonAsWorker(data.id, data.code, cb);
} else if (type === 'execute:tool') {
console.log('execute:tool', data);
executeTool(data, cb);
} else if (type === 'request:chat:completion') {
console.log(data, $socket.id);
const { session_id, channel, form_data, model } = data;
@ -496,6 +515,9 @@
if ($config) {
await setupSocket($config.features?.enable_websocket ?? true);
const currentUrl = `${window.location.pathname}${window.location.search}`;
const encodedUrl = encodeURIComponent(currentUrl);
if (localStorage.token) {
// Get Session User Info
const sessionUser = await getSessionUser(localStorage.token).catch((error) => {
@ -512,13 +534,13 @@
} else {
// Redirect Invalid Session User to /auth Page
localStorage.removeItem('token');
await goto('/auth');
await goto(`/auth?redirect=${encodedUrl}`);
}
} else {
// Don't redirect if we're already on the auth page
// Needed because we pass in tokens from OAuth logins via URL fragments
if ($page.url.pathname !== '/auth') {
await goto('/auth');
await goto(`/auth?redirect=${encodedUrl}`);
}
}
}

View File

@ -140,7 +140,8 @@
onMount(async () => {
if ($user !== undefined) {
await goto('/');
const redirectPath = querystringValue('redirect') || '/';
goto(redirectPath);
}
await checkOauthCallback();