Compare commits
153 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8f3c9b391b | |||
| 5a9d883a93 | |||
| c2e8af5ed1 | |||
| 70a85d6111 | |||
| 1163745a03 | |||
| 529fcaa5c9 | |||
| 681fd4ff3b | |||
| 0917fa6f4a | |||
| c7d3969a53 | |||
| c41b33c9c0 | |||
| 7131ac24a7 | |||
| 501cd2071c | |||
| 85a1233733 | |||
| 670fa83e2c | |||
| d03a53e755 | |||
| 2ec416bd6b | |||
| b1a391ca5d | |||
| c0ca447041 | |||
| 5d3db15eca | |||
| eead69068c | |||
| edae1ca4c7 | |||
| 0c9cc2baa3 | |||
| 326ac41422 | |||
| dd2941bb43 | |||
| a691ee08d8 | |||
| e8fc522eba | |||
| 482a41e49b | |||
| ae3d8ce0c0 | |||
| a2e30ace02 | |||
| cde9672a09 | |||
| db6ca856de | |||
| bb5e615841 | |||
| 48ac4d9f2a | |||
| eb7bba81fe | |||
| a43cb1eb25 | |||
| e2d8872060 | |||
| ede584320f | |||
| bc458d3ee0 | |||
| 0d1f7265c4 | |||
| 539201a032 | |||
| 50ad2aa215 | |||
| 5cd28c04b8 | |||
| c3ce4d7f6a | |||
| 9bd054490f | |||
| 2be14d57bf | |||
| 61e0a85aed | |||
| e483c6b598 | |||
| db3b075796 | |||
| 0bb26ae504 | |||
| 9d16dd997a | |||
| e4fe1fff97 | |||
| 37ed31b0e2 | |||
| dc82e681dd | |||
| 4944824544 | |||
| 67cd9b76ae | |||
| 8a86f32700 | |||
| f62b15d8da | |||
| d709038b5b | |||
| a2631ed38e | |||
| 8ffd8c3505 | |||
| f74df0433b | |||
| 93fa98245b | |||
| e7727aea9e | |||
| 884eb9f7ee | |||
| 912b75f8ac | |||
| 3bec60b80c | |||
| 07b08ef67e | |||
| 83f9475584 | |||
| 1ad5456fe0 | |||
| bf1936de34 | |||
| 827dd1b044 | |||
| b2028d187d | |||
| 1e1b372d07 | |||
| bd5a8567ef | |||
| fc46532955 | |||
| 5f29a9edf4 | |||
| 91bc65c7da | |||
| a91db7f7a6 | |||
| e6fe3ada57 | |||
| 354683296b | |||
| 5237439e29 | |||
| 049b3136e8 | |||
| 3d6f5f418d | |||
| a27175d672 | |||
| ff1cd306d8 | |||
| aa7d25600f | |||
| 0bae7ca615 | |||
| 3578b5e337 | |||
| 8464b30485 | |||
| c961964647 | |||
| dd7ac4c53a | |||
| 4601a0246f | |||
| 25c0eca414 | |||
| ca8be1ee4a | |||
| 1611a3aa70 | |||
| b434ebf3ad | |||
| d2ed99e201 | |||
| 06976c4551 | |||
| 626643104e | |||
| c5683dd24c | |||
| 6589464ddf | |||
| e27c264081 | |||
| 3a96e1f109 | |||
| c4629c8c2d | |||
| adea3af8d7 | |||
| ec516e95fa | |||
| 481fd9f88a | |||
| 2bbaf1234c | |||
| 690c25215d | |||
| b72243c166 | |||
| 8f2e799615 | |||
| 8ecf262457 | |||
| 7fb785901e | |||
| 5dc9b93916 | |||
| 1241bc3e89 | |||
| c5ed3452d2 | |||
| c2e6e44714 | |||
| 6e7e575a18 | |||
| f43b545bdd | |||
| 12a04b118f | |||
| 8b1e2ce279 | |||
| fb0f106afe | |||
| dd423f43de | |||
| f2bd3fdf19 | |||
| 8ad52f0fcc | |||
| 5a3736f1ee | |||
| 54bbfa5e89 | |||
| 3933db2c91 | |||
| dc8f0987e1 | |||
| 644f0fe6c3 | |||
| 87b04b0fc3 | |||
| 455403a4a4 | |||
| 547b990041 | |||
| fcf8f2a704 | |||
| 496e798cc7 | |||
| e01b3569d5 | |||
| a75b68c19c | |||
| 34f04c53fc | |||
| 2b87ab32ff | |||
| d20f6cb45b | |||
| 48c9fb0ddf | |||
| c609cc23eb | |||
| 3566002b0b | |||
| 140d7ff721 | |||
| 7349e1d8c8 | |||
| bf5a62298c | |||
| 2972774d87 | |||
| 14eb667fc8 | |||
| 79bf8d6dd3 | |||
| 14d33f0fcc | |||
| 4dcec4855e | |||
| efb4a710c8 | |||
| 8e9e429a91 |
@@ -5,6 +5,42 @@ All notable changes to this project will be documented in this file.
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
||||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [0.3.4] - 2024-06-12
|
||||
|
||||
### Fixed
|
||||
|
||||
- **🔒 Mixed Content with HTTPS Issue**: Resolved a problem where mixed content (HTTP and HTTPS) was causing security warnings and blocking resources on HTTPS sites.
|
||||
- **🔍 Web Search Issue**: Addressed the problem where web search functionality was not working correctly. The 'ENABLE_RAG_LOCAL_WEB_FETCH' option has been reintroduced to restore proper web searching capabilities.
|
||||
- **💾 RAG Template Not Being Saved**: Fixed an issue where the RAG template was not being saved correctly, ensuring your custom templates are now preserved as expected.
|
||||
|
||||
## [0.3.3] - 2024-06-12
|
||||
|
||||
### Added
|
||||
|
||||
- **🛠️ Native Python Function Calling**: Introducing native Python function calling within Open WebUI. We’ve also included a built-in code editor to seamlessly develop and integrate function code within the 'Tools' workspace. With this, you can significantly enhance your LLM’s capabilities by creating custom RAG pipelines, web search tools, and even agent-like features such as sending Discord messages.
|
||||
- **🌐 DuckDuckGo Integration**: Added DuckDuckGo as a web search provider, giving you more search options.
|
||||
- **🌏 Enhanced Translations**: Improved translations for Vietnamese and Chinese languages, making the interface more accessible.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **🔗 Web Search URL Error Handling**: Fixed the issue where a single URL error would disrupt the data loading process in Web Search mode. Now, such errors will be handled gracefully to ensure uninterrupted data loading.
|
||||
- **🖥️ Frontend Responsiveness**: Resolved the problem where the frontend would stop responding if the backend encounters an error while downloading a model. Improved error handling to maintain frontend stability.
|
||||
- **🔧 Dependency Issues in pip**: Fixed issues related to pip installations, ensuring all dependencies are correctly managed to prevent installation errors.
|
||||
|
||||
## [0.3.2] - 2024-06-10
|
||||
|
||||
### Added
|
||||
|
||||
- **🔍 Web Search Query Status**: The web search query will now persist in the results section to aid in easier debugging and tracking of search queries.
|
||||
- **🌐 New Web Search Provider**: We have added Serply as a new option for web search providers, giving you more choices for your search needs.
|
||||
- **🌏 Improved Translations**: We've enhanced translations for Chinese and Portuguese.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **🎤 Audio File Upload Issue**: The bug that prevented audio files from being uploaded in chat input has been fixed, ensuring smooth communication.
|
||||
- **💬 Message Input Handling**: Improved the handling of message inputs by instantly clearing images and text after sending, along with immediate visual indications when a response message is loading, enhancing user feedback.
|
||||
- **⚙️ Parameter Registration and Validation**: Fixed the issue where parameters were not registering in certain cases and addressed the problem where users were unable to save due to invalid input errors.
|
||||
|
||||
## [0.3.1] - 2024-06-09
|
||||
|
||||
### Fixed
|
||||
|
||||
@@ -29,11 +29,15 @@ Open WebUI is an [extensible](https://github.com/open-webui/pipelines), feature-
|
||||
|
||||
- ✒️🔢 **Full Markdown and LaTeX Support**: Elevate your LLM experience with comprehensive Markdown and LaTeX capabilities for enriched interaction.
|
||||
|
||||
- 🎤📹 **Hands-Free Voice/Video Call**: Experience seamless communication with integrated hands-free voice and video call features, allowing for a more dynamic and interactive chat environment.
|
||||
|
||||
- 🛠️ **Model Builder**: Easily create Ollama models via the Web UI. Create and add custom characters/agents, customize chat elements, and import models effortlessly through [Open WebUI Community](https://openwebui.com/) integration.
|
||||
|
||||
- 🐍 **Native Python Function Calling Tool**: Enhance your LLMs with built-in code editor support in the tools workspace. Bring Your Own Function (BYOF) by simply adding your pure Python functions, enabling seamless integration with LLMs.
|
||||
|
||||
- 📚 **Local RAG Integration**: Dive into the future of chat interactions with groundbreaking Retrieval Augmented Generation (RAG) support. This feature seamlessly integrates document interactions into your chat experience. You can load documents directly into the chat or add files to your document library, effortlessly accessing them using the `#` command before a query.
|
||||
|
||||
- 🔍 **Web Search for RAG**: Perform web searches using providers like `SearXNG`, `Google PSE`, `Brave Search`, `serpstack`, and `serper`, and inject the results directly into your chat experience.
|
||||
- 🔍 **Web Search for RAG**: Perform web searches using providers like `SearXNG`, `Google PSE`, `Brave Search`, `serpstack`, `serper`, and `Serply` and inject the results directly into your chat experience.
|
||||
|
||||
- 🌐 **Web Browsing Capability**: Seamlessly integrate websites into your chat experience using the `#` command followed by a URL. This feature allows you to incorporate web content directly into your conversations, enhancing the richness and depth of your interactions.
|
||||
|
||||
|
||||
@@ -8,13 +8,15 @@ from fastapi import (
|
||||
Form,
|
||||
)
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
import requests
|
||||
import os, shutil, logging, re
|
||||
from datetime import datetime
|
||||
|
||||
from pathlib import Path
|
||||
from typing import List, Union, Sequence
|
||||
from typing import List, Union, Sequence, Iterator, Any
|
||||
|
||||
from chromadb.utils.batch_utils import create_batches
|
||||
from langchain_core.documents import Document
|
||||
|
||||
from langchain_community.document_loaders import (
|
||||
WebBaseLoader,
|
||||
@@ -69,7 +71,8 @@ from apps.rag.search.main import SearchResult
|
||||
from apps.rag.search.searxng import search_searxng
|
||||
from apps.rag.search.serper import search_serper
|
||||
from apps.rag.search.serpstack import search_serpstack
|
||||
|
||||
from apps.rag.search.serply import search_serply
|
||||
from apps.rag.search.duckduckgo import search_duckduckgo
|
||||
|
||||
from utils.misc import (
|
||||
calculate_sha256,
|
||||
@@ -115,6 +118,7 @@ from config import (
|
||||
SERPSTACK_API_KEY,
|
||||
SERPSTACK_HTTPS,
|
||||
SERPER_API_KEY,
|
||||
SERPLY_API_KEY,
|
||||
RAG_WEB_SEARCH_RESULT_COUNT,
|
||||
RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
|
||||
RAG_EMBEDDING_OPENAI_BATCH_SIZE,
|
||||
@@ -167,6 +171,7 @@ app.state.config.BRAVE_SEARCH_API_KEY = BRAVE_SEARCH_API_KEY
|
||||
app.state.config.SERPSTACK_API_KEY = SERPSTACK_API_KEY
|
||||
app.state.config.SERPSTACK_HTTPS = SERPSTACK_HTTPS
|
||||
app.state.config.SERPER_API_KEY = SERPER_API_KEY
|
||||
app.state.config.SERPLY_API_KEY = SERPLY_API_KEY
|
||||
app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = RAG_WEB_SEARCH_RESULT_COUNT
|
||||
app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = RAG_WEB_SEARCH_CONCURRENT_REQUESTS
|
||||
|
||||
@@ -394,6 +399,7 @@ async def get_rag_config(user=Depends(get_admin_user)):
|
||||
"serpstack_api_key": app.state.config.SERPSTACK_API_KEY,
|
||||
"serpstack_https": app.state.config.SERPSTACK_HTTPS,
|
||||
"serper_api_key": app.state.config.SERPER_API_KEY,
|
||||
"serply_api_key": app.state.config.SERPLY_API_KEY,
|
||||
"result_count": app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
||||
"concurrent_requests": app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
|
||||
},
|
||||
@@ -421,6 +427,7 @@ class WebSearchConfig(BaseModel):
|
||||
serpstack_api_key: Optional[str] = None
|
||||
serpstack_https: Optional[bool] = None
|
||||
serper_api_key: Optional[str] = None
|
||||
serply_api_key: Optional[str] = None
|
||||
result_count: Optional[int] = None
|
||||
concurrent_requests: Optional[int] = None
|
||||
|
||||
@@ -471,6 +478,7 @@ async def update_rag_config(form_data: ConfigUpdateForm, user=Depends(get_admin_
|
||||
app.state.config.SERPSTACK_API_KEY = form_data.web.search.serpstack_api_key
|
||||
app.state.config.SERPSTACK_HTTPS = form_data.web.search.serpstack_https
|
||||
app.state.config.SERPER_API_KEY = form_data.web.search.serper_api_key
|
||||
app.state.config.SERPLY_API_KEY = form_data.web.search.serply_api_key
|
||||
app.state.config.RAG_WEB_SEARCH_RESULT_COUNT = form_data.web.search.result_count
|
||||
app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS = (
|
||||
form_data.web.search.concurrent_requests
|
||||
@@ -499,6 +507,7 @@ async def update_rag_config(form_data: ConfigUpdateForm, user=Depends(get_admin_
|
||||
"serpstack_api_key": app.state.config.SERPSTACK_API_KEY,
|
||||
"serpstack_https": app.state.config.SERPSTACK_HTTPS,
|
||||
"serper_api_key": app.state.config.SERPER_API_KEY,
|
||||
"serply_api_key": app.state.config.SERPLY_API_KEY,
|
||||
"result_count": app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
||||
"concurrent_requests": app.state.config.RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
|
||||
},
|
||||
@@ -695,7 +704,7 @@ def get_web_loader(url: Union[str, Sequence[str]], verify_ssl: bool = True):
|
||||
# Check if the URL is valid
|
||||
if not validate_url(url):
|
||||
raise ValueError(ERROR_MESSAGES.INVALID_URL)
|
||||
return WebBaseLoader(
|
||||
return SafeWebBaseLoader(
|
||||
url,
|
||||
verify_ssl=verify_ssl,
|
||||
requests_per_second=RAG_WEB_SEARCH_CONCURRENT_REQUESTS,
|
||||
@@ -746,6 +755,7 @@ def search_web(engine: str, query: str) -> list[SearchResult]:
|
||||
- BRAVE_SEARCH_API_KEY
|
||||
- SERPSTACK_API_KEY
|
||||
- SERPER_API_KEY
|
||||
- SERPLY_API_KEY
|
||||
|
||||
Args:
|
||||
query (str): The query to search for
|
||||
@@ -804,6 +814,17 @@ def search_web(engine: str, query: str) -> list[SearchResult]:
|
||||
)
|
||||
else:
|
||||
raise Exception("No SERPER_API_KEY found in environment variables")
|
||||
elif engine == "serply":
|
||||
if app.state.config.SERPLY_API_KEY:
|
||||
return search_serply(
|
||||
app.state.config.SERPLY_API_KEY,
|
||||
query,
|
||||
app.state.config.RAG_WEB_SEARCH_RESULT_COUNT,
|
||||
)
|
||||
else:
|
||||
raise Exception("No SERPLY_API_KEY found in environment variables")
|
||||
elif engine == "duckduckgo":
|
||||
return search_duckduckgo(query, app.state.config.RAG_WEB_SEARCH_RESULT_COUNT)
|
||||
else:
|
||||
raise Exception("No search engine API key found in environment variables")
|
||||
|
||||
@@ -811,6 +832,9 @@ def search_web(engine: str, query: str) -> list[SearchResult]:
|
||||
@app.post("/web/search")
|
||||
def store_web_search(form_data: SearchForm, user=Depends(get_current_user)):
|
||||
try:
|
||||
logging.info(
|
||||
f"trying to web search with {app.state.config.RAG_WEB_SEARCH_ENGINE, form_data.query}"
|
||||
)
|
||||
web_results = search_web(
|
||||
app.state.config.RAG_WEB_SEARCH_ENGINE, form_data.query
|
||||
)
|
||||
@@ -1221,6 +1245,33 @@ def reset(user=Depends(get_admin_user)) -> bool:
|
||||
return True
|
||||
|
||||
|
||||
class SafeWebBaseLoader(WebBaseLoader):
|
||||
"""WebBaseLoader with enhanced error handling for URLs."""
|
||||
|
||||
def lazy_load(self) -> Iterator[Document]:
|
||||
"""Lazy load text from the url(s) in web_path with error handling."""
|
||||
for path in self.web_paths:
|
||||
try:
|
||||
soup = self._scrape(path, bs_kwargs=self.bs_kwargs)
|
||||
text = soup.get_text(**self.bs_get_text_kwargs)
|
||||
|
||||
# Build metadata
|
||||
metadata = {"source": path}
|
||||
if title := soup.find("title"):
|
||||
metadata["title"] = title.get_text()
|
||||
if description := soup.find("meta", attrs={"name": "description"}):
|
||||
metadata["description"] = description.get(
|
||||
"content", "No description found."
|
||||
)
|
||||
if html := soup.find("html"):
|
||||
metadata["language"] = html.get("lang", "No language found.")
|
||||
|
||||
yield Document(page_content=text, metadata=metadata)
|
||||
except Exception as e:
|
||||
# Log the error and continue with the next URL
|
||||
log.error(f"Error loading {path}: {e}")
|
||||
|
||||
|
||||
if ENV == "dev":
|
||||
|
||||
@app.get("/ef")
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
import logging
|
||||
|
||||
from apps.rag.search.main import SearchResult
|
||||
from duckduckgo_search import DDGS
|
||||
from config import SRC_LOG_LEVELS
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
log.setLevel(SRC_LOG_LEVELS["RAG"])
|
||||
|
||||
|
||||
def search_duckduckgo(query: str, count: int) -> list[SearchResult]:
|
||||
"""
|
||||
Search using DuckDuckGo's Search API and return the results as a list of SearchResult objects.
|
||||
Args:
|
||||
query (str): The query to search for
|
||||
count (int): The number of results to return
|
||||
|
||||
Returns:
|
||||
List[SearchResult]: A list of search results
|
||||
"""
|
||||
# Use the DDGS context manager to create a DDGS object
|
||||
with DDGS() as ddgs:
|
||||
# Use the ddgs.text() method to perform the search
|
||||
ddgs_gen = ddgs.text(
|
||||
query, safesearch="moderate", max_results=count, backend="api"
|
||||
)
|
||||
# Check if there are search results
|
||||
if ddgs_gen:
|
||||
# Convert the search results into a list
|
||||
search_results = [r for r in ddgs_gen]
|
||||
|
||||
# Create an empty list to store the SearchResult objects
|
||||
results = []
|
||||
# Iterate over each search result
|
||||
for result in search_results:
|
||||
# Create a SearchResult object and append it to the results list
|
||||
results.append(
|
||||
SearchResult(
|
||||
link=result["href"],
|
||||
title=result.get("title"),
|
||||
snippet=result.get("body"),
|
||||
)
|
||||
)
|
||||
print(results)
|
||||
# Return the list of search results
|
||||
return results
|
||||
@@ -0,0 +1,68 @@
|
||||
import json
|
||||
import logging
|
||||
|
||||
import requests
|
||||
from urllib.parse import urlencode
|
||||
|
||||
from apps.rag.search.main import SearchResult
|
||||
from config import SRC_LOG_LEVELS
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
log.setLevel(SRC_LOG_LEVELS["RAG"])
|
||||
|
||||
|
||||
def search_serply(
|
||||
api_key: str,
|
||||
query: str,
|
||||
count: int,
|
||||
hl: str = "us",
|
||||
limit: int = 10,
|
||||
device_type: str = "desktop",
|
||||
proxy_location: str = "US",
|
||||
) -> list[SearchResult]:
|
||||
"""Search using serper.dev's API and return the results as a list of SearchResult objects.
|
||||
|
||||
Args:
|
||||
api_key (str): A serply.io API key
|
||||
query (str): The query to search for
|
||||
hl (str): Host Language code to display results in (reference https://developers.google.com/custom-search/docs/xml_results?hl=en#wsInterfaceLanguages)
|
||||
limit (int): The maximum number of results to return [10-100, defaults to 10]
|
||||
"""
|
||||
log.info("Searching with Serply")
|
||||
|
||||
url = "https://api.serply.io/v1/search/"
|
||||
|
||||
query_payload = {
|
||||
"q": query,
|
||||
"language": "en",
|
||||
"num": limit,
|
||||
"gl": proxy_location.upper(),
|
||||
"hl": hl.lower(),
|
||||
}
|
||||
|
||||
url = f"{url}{urlencode(query_payload)}"
|
||||
headers = {
|
||||
"X-API-KEY": api_key,
|
||||
"X-User-Agent": device_type,
|
||||
"User-Agent": "open-webui",
|
||||
"X-Proxy-Location": proxy_location,
|
||||
}
|
||||
|
||||
response = requests.request("GET", url, headers=headers)
|
||||
response.raise_for_status()
|
||||
|
||||
json_response = response.json()
|
||||
log.info(f"results from serply search: {json_response}")
|
||||
|
||||
results = sorted(
|
||||
json_response.get("results", []), key=lambda x: x.get("realPosition", 0)
|
||||
)
|
||||
|
||||
return [
|
||||
SearchResult(
|
||||
link=result["link"],
|
||||
title=result.get("title"),
|
||||
snippet=result.get("description"),
|
||||
)
|
||||
for result in results[:count]
|
||||
]
|
||||
+206
@@ -0,0 +1,206 @@
|
||||
{
|
||||
"ads": [],
|
||||
"ads_count": 0,
|
||||
"answers": [],
|
||||
"results": [
|
||||
{
|
||||
"title": "Apple",
|
||||
"link": "https://www.apple.com/",
|
||||
"description": "Discover the innovative world of Apple and shop everything iPhone, iPad, Apple Watch, Mac, and Apple TV, plus explore accessories, entertainment, ...",
|
||||
"additional_links": [
|
||||
{
|
||||
"text": "AppleApplehttps://www.apple.com",
|
||||
"href": "https://www.apple.com/"
|
||||
}
|
||||
],
|
||||
"cite": {},
|
||||
"subdomains": [
|
||||
{
|
||||
"title": "Support",
|
||||
"link": "https://support.apple.com/",
|
||||
"description": "SupportContact - iPhone Support - Billing and Subscriptions - Apple Repair"
|
||||
},
|
||||
{
|
||||
"title": "Store",
|
||||
"link": "https://www.apple.com/store",
|
||||
"description": "StoreShop iPhone - Shop iPad - App Store - Shop Mac - ..."
|
||||
},
|
||||
{
|
||||
"title": "Mac",
|
||||
"link": "https://www.apple.com/mac/",
|
||||
"description": "MacMacBook Air - MacBook Pro - iMac - Compare Mac models - Mac mini"
|
||||
},
|
||||
{
|
||||
"title": "iPad",
|
||||
"link": "https://www.apple.com/ipad/",
|
||||
"description": "iPadShop iPad - iPad Pro - iPad Air - Compare iPad models - ..."
|
||||
},
|
||||
{
|
||||
"title": "Watch",
|
||||
"link": "https://www.apple.com/watch/",
|
||||
"description": "WatchShop Apple Watch - Series 9 - SE - Ultra 2 - Nike - Hermès - ..."
|
||||
}
|
||||
],
|
||||
"realPosition": 1
|
||||
},
|
||||
{
|
||||
"title": "Apple",
|
||||
"link": "https://www.apple.com/",
|
||||
"description": "Discover the innovative world of Apple and shop everything iPhone, iPad, Apple Watch, Mac, and Apple TV, plus explore accessories, entertainment, ...",
|
||||
"additional_links": [
|
||||
{
|
||||
"text": "AppleApplehttps://www.apple.com",
|
||||
"href": "https://www.apple.com/"
|
||||
}
|
||||
],
|
||||
"cite": {},
|
||||
"realPosition": 2
|
||||
},
|
||||
{
|
||||
"title": "Apple Inc.",
|
||||
"link": "https://en.wikipedia.org/wiki/Apple_Inc.",
|
||||
"description": "Apple Inc. (formerly Apple Computer, Inc.) is an American multinational corporation and technology company headquartered in Cupertino, California, ...",
|
||||
"additional_links": [
|
||||
{
|
||||
"text": "Apple Inc.Wikipediahttps://en.wikipedia.org › wiki › Apple_Inc",
|
||||
"href": "https://en.wikipedia.org/wiki/Apple_Inc."
|
||||
},
|
||||
{
|
||||
"text": "",
|
||||
"href": "https://en.wikipedia.org/wiki/Apple_Inc."
|
||||
},
|
||||
{
|
||||
"text": "History",
|
||||
"href": "https://en.wikipedia.org/wiki/History_of_Apple_Inc."
|
||||
},
|
||||
{
|
||||
"text": "List of Apple products",
|
||||
"href": "https://en.wikipedia.org/wiki/List_of_Apple_products"
|
||||
},
|
||||
{
|
||||
"text": "Litigation involving Apple Inc.",
|
||||
"href": "https://en.wikipedia.org/wiki/Litigation_involving_Apple_Inc."
|
||||
},
|
||||
{
|
||||
"text": "Apple Park",
|
||||
"href": "https://en.wikipedia.org/wiki/Apple_Park"
|
||||
}
|
||||
],
|
||||
"cite": {
|
||||
"domain": "https://en.wikipedia.org › wiki › Apple_Inc",
|
||||
"span": " › wiki › Apple_Inc"
|
||||
},
|
||||
"realPosition": 3
|
||||
},
|
||||
{
|
||||
"title": "Apple Inc. (AAPL) Company Profile & Facts",
|
||||
"link": "https://finance.yahoo.com/quote/AAPL/profile/",
|
||||
"description": "Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables, and accessories worldwide. The company offers iPhone, a line ...",
|
||||
"additional_links": [
|
||||
{
|
||||
"text": "Apple Inc. (AAPL) Company Profile & FactsYahoo Financehttps://finance.yahoo.com › quote › AAPL › profile",
|
||||
"href": "https://finance.yahoo.com/quote/AAPL/profile/"
|
||||
}
|
||||
],
|
||||
"cite": {
|
||||
"domain": "https://finance.yahoo.com › quote › AAPL › profile",
|
||||
"span": " › quote › AAPL › profile"
|
||||
},
|
||||
"realPosition": 4
|
||||
},
|
||||
{
|
||||
"title": "Apple Inc - Company Profile and News",
|
||||
"link": "https://www.bloomberg.com/profile/company/AAPL:US",
|
||||
"description": "Apple Inc. Apple Inc. designs, manufactures, and markets smartphones, personal computers, tablets, wearables and accessories, and sells a variety of related ...",
|
||||
"additional_links": [
|
||||
{
|
||||
"text": "Apple Inc - Company Profile and NewsBloomberghttps://www.bloomberg.com › company › AAPL:US",
|
||||
"href": "https://www.bloomberg.com/profile/company/AAPL:US"
|
||||
},
|
||||
{
|
||||
"text": "",
|
||||
"href": "https://www.bloomberg.com/profile/company/AAPL:US"
|
||||
}
|
||||
],
|
||||
"cite": {
|
||||
"domain": "https://www.bloomberg.com › company › AAPL:US",
|
||||
"span": " › company › AAPL:US"
|
||||
},
|
||||
"realPosition": 5
|
||||
},
|
||||
{
|
||||
"title": "Apple Inc. | History, Products, Headquarters, & Facts",
|
||||
"link": "https://www.britannica.com/money/Apple-Inc",
|
||||
"description": "May 22, 2024 — Apple Inc. is an American multinational technology company that revolutionized the technology sector through its innovation of computer ...",
|
||||
"additional_links": [
|
||||
{
|
||||
"text": "Apple Inc. | History, Products, Headquarters, & FactsBritannicahttps://www.britannica.com › money › Apple-Inc",
|
||||
"href": "https://www.britannica.com/money/Apple-Inc"
|
||||
},
|
||||
{
|
||||
"text": "",
|
||||
"href": "https://www.britannica.com/money/Apple-Inc"
|
||||
}
|
||||
],
|
||||
"cite": {
|
||||
"domain": "https://www.britannica.com › money › Apple-Inc",
|
||||
"span": " › money › Apple-Inc"
|
||||
},
|
||||
"realPosition": 6
|
||||
}
|
||||
],
|
||||
"shopping_ads": [],
|
||||
"places": [
|
||||
{
|
||||
"title": "Apple Inc."
|
||||
},
|
||||
{
|
||||
"title": "Apple Inc"
|
||||
},
|
||||
{
|
||||
"title": "Apple Inc"
|
||||
}
|
||||
],
|
||||
"related_searches": {
|
||||
"images": [],
|
||||
"text": [
|
||||
{
|
||||
"title": "apple inc full form",
|
||||
"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+Inc+full+form&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhPEAE"
|
||||
},
|
||||
{
|
||||
"title": "apple company history",
|
||||
"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+company+history&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhOEAE"
|
||||
},
|
||||
{
|
||||
"title": "apple store",
|
||||
"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+Store&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhQEAE"
|
||||
},
|
||||
{
|
||||
"title": "apple id",
|
||||
"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+id&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhSEAE"
|
||||
},
|
||||
{
|
||||
"title": "apple inc industry",
|
||||
"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+Inc+industry&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhREAE"
|
||||
},
|
||||
{
|
||||
"title": "apple login",
|
||||
"link": "https://www.google.com/search?sca_esv=6b6df170a5c9891b&sca_upv=1&q=Apple+login&sa=X&ved=2ahUKEwjLxuSJwM-GAxUHODQIHYuJBhgQ1QJ6BAhTEAE"
|
||||
}
|
||||
]
|
||||
},
|
||||
"image_results": [],
|
||||
"carousel": [],
|
||||
"total": 2450000000,
|
||||
"knowledge_graph": "",
|
||||
"related_questions": [
|
||||
"What does the Apple Inc do?",
|
||||
"Why did Apple change to Apple Inc?",
|
||||
"Who owns Apple Inc.?",
|
||||
"What is Apple Inc best known for?"
|
||||
],
|
||||
"carousel_count": 0,
|
||||
"ts": 2.491065263748169,
|
||||
"device_type": null
|
||||
}
|
||||
@@ -236,10 +236,9 @@ def get_embedding_function(
|
||||
return lambda query: generate_multiple(query, func)
|
||||
|
||||
|
||||
def rag_messages(
|
||||
def get_rag_context(
|
||||
docs,
|
||||
messages,
|
||||
template,
|
||||
embedding_function,
|
||||
k,
|
||||
reranking_function,
|
||||
@@ -318,16 +317,7 @@ def rag_messages(
|
||||
|
||||
context_string = context_string.strip()
|
||||
|
||||
ra_content = rag_template(
|
||||
template=template,
|
||||
context=context_string,
|
||||
query=query,
|
||||
)
|
||||
|
||||
log.debug(f"ra_content: {ra_content}")
|
||||
messages = add_or_update_system_message(ra_content, messages)
|
||||
|
||||
return messages, citations
|
||||
return context_string, citations
|
||||
|
||||
|
||||
def get_model_path(model: str, update_model: bool = False):
|
||||
|
||||
@@ -19,8 +19,6 @@ TIMEOUT_DURATION = 3
|
||||
|
||||
@sio.event
|
||||
async def connect(sid, environ, auth):
|
||||
print("connect ", sid)
|
||||
|
||||
user = None
|
||||
if auth and "token" in auth:
|
||||
data = decode_token(auth["token"])
|
||||
@@ -37,7 +35,6 @@ async def connect(sid, environ, auth):
|
||||
|
||||
print(f"user {user.name}({user.id}) connected with session ID {sid}")
|
||||
|
||||
print(len(set(USER_POOL)))
|
||||
await sio.emit("user-count", {"count": len(set(USER_POOL))})
|
||||
await sio.emit("usage", {"models": get_models_in_use()})
|
||||
|
||||
@@ -64,13 +61,11 @@ async def user_join(sid, data):
|
||||
|
||||
print(f"user {user.name}({user.id}) connected with session ID {sid}")
|
||||
|
||||
print(len(set(USER_POOL)))
|
||||
await sio.emit("user-count", {"count": len(set(USER_POOL))})
|
||||
|
||||
|
||||
@sio.on("user-count")
|
||||
async def user_count(sid):
|
||||
print("user-count", sid)
|
||||
await sio.emit("user-count", {"count": len(set(USER_POOL))})
|
||||
|
||||
|
||||
@@ -79,14 +74,12 @@ def get_models_in_use():
|
||||
models_in_use = []
|
||||
for model_id, data in USAGE_POOL.items():
|
||||
models_in_use.append(model_id)
|
||||
print(f"Models in use: {models_in_use}")
|
||||
|
||||
return models_in_use
|
||||
|
||||
|
||||
@sio.on("usage")
|
||||
async def usage(sid, data):
|
||||
print(f'Received "usage" event from {sid}: {data}')
|
||||
|
||||
model_id = data["model"]
|
||||
|
||||
@@ -114,7 +107,6 @@ async def usage(sid, data):
|
||||
|
||||
async def remove_after_timeout(sid, model_id):
|
||||
try:
|
||||
print("remove_after_timeout", sid, model_id)
|
||||
await asyncio.sleep(TIMEOUT_DURATION)
|
||||
if model_id in USAGE_POOL:
|
||||
print(USAGE_POOL[model_id]["sids"])
|
||||
@@ -124,7 +116,6 @@ async def remove_after_timeout(sid, model_id):
|
||||
if len(USAGE_POOL[model_id]["sids"]) == 0:
|
||||
del USAGE_POOL[model_id]
|
||||
|
||||
print(f"Removed usage data for {model_id} due to timeout")
|
||||
# Broadcast the usage data to all clients
|
||||
await sio.emit("usage", {"models": get_models_in_use()})
|
||||
except asyncio.CancelledError:
|
||||
@@ -143,9 +134,6 @@ async def disconnect(sid):
|
||||
if len(USER_POOL[user_id]) == 0:
|
||||
del USER_POOL[user_id]
|
||||
|
||||
print(f"user {user_id} disconnected with session ID {sid}")
|
||||
print(USER_POOL)
|
||||
|
||||
await sio.emit("user-count", {"count": len(USER_POOL)})
|
||||
else:
|
||||
print(f"Unknown session ID {sid} disconnected")
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
"""Peewee migrations -- 009_add_models.py.
|
||||
|
||||
Some examples (model - class or model name)::
|
||||
|
||||
> Model = migrator.orm['table_name'] # Return model in current state by name
|
||||
> Model = migrator.ModelClass # Return model in current state by name
|
||||
|
||||
> migrator.sql(sql) # Run custom SQL
|
||||
> migrator.run(func, *args, **kwargs) # Run python function with the given args
|
||||
> migrator.create_model(Model) # Create a model (could be used as decorator)
|
||||
> migrator.remove_model(model, cascade=True) # Remove a model
|
||||
> migrator.add_fields(model, **fields) # Add fields to a model
|
||||
> migrator.change_fields(model, **fields) # Change fields
|
||||
> migrator.remove_fields(model, *field_names, cascade=True)
|
||||
> migrator.rename_field(model, old_field_name, new_field_name)
|
||||
> migrator.rename_table(model, new_table_name)
|
||||
> migrator.add_index(model, *col_names, unique=False)
|
||||
> migrator.add_not_null(model, *field_names)
|
||||
> migrator.add_default(model, field_name, default)
|
||||
> migrator.add_constraint(model, name, sql)
|
||||
> migrator.drop_index(model, *col_names)
|
||||
> migrator.drop_not_null(model, *field_names)
|
||||
> migrator.drop_constraints(model, *constraints)
|
||||
|
||||
"""
|
||||
|
||||
from contextlib import suppress
|
||||
|
||||
import peewee as pw
|
||||
from peewee_migrate import Migrator
|
||||
|
||||
|
||||
with suppress(ImportError):
|
||||
import playhouse.postgres_ext as pw_pext
|
||||
|
||||
|
||||
def migrate(migrator: Migrator, database: pw.Database, *, fake=False):
|
||||
"""Write your migrations here."""
|
||||
|
||||
@migrator.create_model
|
||||
class Tool(pw.Model):
|
||||
id = pw.TextField(unique=True)
|
||||
user_id = pw.TextField()
|
||||
|
||||
name = pw.TextField()
|
||||
content = pw.TextField()
|
||||
specs = pw.TextField()
|
||||
|
||||
meta = pw.TextField()
|
||||
|
||||
created_at = pw.BigIntegerField(null=False)
|
||||
updated_at = pw.BigIntegerField(null=False)
|
||||
|
||||
class Meta:
|
||||
table_name = "tool"
|
||||
|
||||
|
||||
def rollback(migrator: Migrator, database: pw.Database, *, fake=False):
|
||||
"""Write your rollback migrations here."""
|
||||
|
||||
migrator.remove_model("tool")
|
||||
@@ -6,6 +6,7 @@ from apps.webui.routers import (
|
||||
users,
|
||||
chats,
|
||||
documents,
|
||||
tools,
|
||||
models,
|
||||
prompts,
|
||||
configs,
|
||||
@@ -26,8 +27,8 @@ from config import (
|
||||
WEBUI_AUTH_TRUSTED_EMAIL_HEADER,
|
||||
JWT_EXPIRES_IN,
|
||||
WEBUI_BANNERS,
|
||||
AppConfig,
|
||||
ENABLE_COMMUNITY_SHARING,
|
||||
AppConfig,
|
||||
)
|
||||
|
||||
app = FastAPI()
|
||||
@@ -38,6 +39,7 @@ app.state.config = AppConfig()
|
||||
|
||||
app.state.config.ENABLE_SIGNUP = ENABLE_SIGNUP
|
||||
app.state.config.JWT_EXPIRES_IN = JWT_EXPIRES_IN
|
||||
app.state.AUTH_TRUSTED_EMAIL_HEADER = WEBUI_AUTH_TRUSTED_EMAIL_HEADER
|
||||
|
||||
|
||||
app.state.config.SHOW_ADMIN_DETAILS = SHOW_ADMIN_DETAILS
|
||||
@@ -54,7 +56,7 @@ app.state.config.BANNERS = WEBUI_BANNERS
|
||||
app.state.config.ENABLE_COMMUNITY_SHARING = ENABLE_COMMUNITY_SHARING
|
||||
|
||||
app.state.MODELS = {}
|
||||
app.state.AUTH_TRUSTED_EMAIL_HEADER = WEBUI_AUTH_TRUSTED_EMAIL_HEADER
|
||||
app.state.TOOLS = {}
|
||||
|
||||
|
||||
app.add_middleware(
|
||||
@@ -70,6 +72,7 @@ app.include_router(users.router, prefix="/users", tags=["users"])
|
||||
app.include_router(chats.router, prefix="/chats", tags=["chats"])
|
||||
|
||||
app.include_router(documents.router, prefix="/documents", tags=["documents"])
|
||||
app.include_router(tools.router, prefix="/tools", tags=["tools"])
|
||||
app.include_router(models.router, prefix="/models", tags=["models"])
|
||||
app.include_router(prompts.router, prefix="/prompts", tags=["prompts"])
|
||||
app.include_router(memories.router, prefix="/memories", tags=["memories"])
|
||||
|
||||
@@ -0,0 +1,132 @@
|
||||
from pydantic import BaseModel
|
||||
from peewee import *
|
||||
from playhouse.shortcuts import model_to_dict
|
||||
from typing import List, Union, Optional
|
||||
import time
|
||||
import logging
|
||||
from apps.webui.internal.db import DB, JSONField
|
||||
|
||||
import json
|
||||
|
||||
from config import SRC_LOG_LEVELS
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
log.setLevel(SRC_LOG_LEVELS["MODELS"])
|
||||
|
||||
####################
|
||||
# Tools DB Schema
|
||||
####################
|
||||
|
||||
|
||||
class Tool(Model):
|
||||
id = CharField(unique=True)
|
||||
user_id = CharField()
|
||||
name = TextField()
|
||||
content = TextField()
|
||||
specs = JSONField()
|
||||
meta = JSONField()
|
||||
updated_at = BigIntegerField()
|
||||
created_at = BigIntegerField()
|
||||
|
||||
class Meta:
|
||||
database = DB
|
||||
|
||||
|
||||
class ToolMeta(BaseModel):
|
||||
description: Optional[str] = None
|
||||
|
||||
|
||||
class ToolModel(BaseModel):
|
||||
id: str
|
||||
user_id: str
|
||||
name: str
|
||||
content: str
|
||||
specs: List[dict]
|
||||
meta: ToolMeta
|
||||
updated_at: int # timestamp in epoch
|
||||
created_at: int # timestamp in epoch
|
||||
|
||||
|
||||
####################
|
||||
# Forms
|
||||
####################
|
||||
|
||||
|
||||
class ToolResponse(BaseModel):
|
||||
id: str
|
||||
user_id: str
|
||||
name: str
|
||||
meta: ToolMeta
|
||||
updated_at: int # timestamp in epoch
|
||||
created_at: int # timestamp in epoch
|
||||
|
||||
|
||||
class ToolForm(BaseModel):
|
||||
id: str
|
||||
name: str
|
||||
content: str
|
||||
meta: ToolMeta
|
||||
|
||||
|
||||
class ToolsTable:
|
||||
def __init__(self, db):
|
||||
self.db = db
|
||||
self.db.create_tables([Tool])
|
||||
|
||||
def insert_new_tool(
|
||||
self, user_id: str, form_data: ToolForm, specs: List[dict]
|
||||
) -> Optional[ToolModel]:
|
||||
tool = ToolModel(
|
||||
**{
|
||||
**form_data.model_dump(),
|
||||
"specs": specs,
|
||||
"user_id": user_id,
|
||||
"updated_at": int(time.time()),
|
||||
"created_at": int(time.time()),
|
||||
}
|
||||
)
|
||||
|
||||
try:
|
||||
result = Tool.create(**tool.model_dump())
|
||||
if result:
|
||||
return tool
|
||||
else:
|
||||
return None
|
||||
except Exception as e:
|
||||
print(f"Error creating tool: {e}")
|
||||
return None
|
||||
|
||||
def get_tool_by_id(self, id: str) -> Optional[ToolModel]:
|
||||
try:
|
||||
tool = Tool.get(Tool.id == id)
|
||||
return ToolModel(**model_to_dict(tool))
|
||||
except:
|
||||
return None
|
||||
|
||||
def get_tools(self) -> List[ToolModel]:
|
||||
return [ToolModel(**model_to_dict(tool)) for tool in Tool.select()]
|
||||
|
||||
def update_tool_by_id(self, id: str, updated: dict) -> Optional[ToolModel]:
|
||||
try:
|
||||
query = Tool.update(
|
||||
**updated,
|
||||
updated_at=int(time.time()),
|
||||
).where(Tool.id == id)
|
||||
query.execute()
|
||||
|
||||
tool = Tool.get(Tool.id == id)
|
||||
return ToolModel(**model_to_dict(tool))
|
||||
except:
|
||||
return None
|
||||
|
||||
def delete_tool_by_id(self, id: str) -> bool:
|
||||
try:
|
||||
query = Tool.delete().where((Tool.id == id))
|
||||
query.execute() # Remove the rows, return number of rows removed.
|
||||
|
||||
return True
|
||||
except:
|
||||
return False
|
||||
|
||||
|
||||
Tools = ToolsTable(DB)
|
||||
@@ -161,7 +161,7 @@ async def get_archived_session_user_chat_list(
|
||||
############################
|
||||
|
||||
|
||||
@router.post("/archive/all", response_model=List[ChatTitleIdResponse])
|
||||
@router.post("/archive/all", response_model=bool)
|
||||
async def archive_all_chats(user=Depends(get_current_user)):
|
||||
return Chats.archive_all_chats_by_user_id(user.id)
|
||||
|
||||
|
||||
@@ -0,0 +1,183 @@
|
||||
from fastapi import Depends, FastAPI, HTTPException, status, Request
|
||||
from datetime import datetime, timedelta
|
||||
from typing import List, Union, Optional
|
||||
|
||||
from fastapi import APIRouter
|
||||
from pydantic import BaseModel
|
||||
import json
|
||||
|
||||
from apps.webui.models.tools import Tools, ToolForm, ToolModel, ToolResponse
|
||||
from apps.webui.utils import load_toolkit_module_by_id
|
||||
|
||||
from utils.utils import get_current_user, get_admin_user
|
||||
from utils.tools import get_tools_specs
|
||||
from constants import ERROR_MESSAGES
|
||||
|
||||
from importlib import util
|
||||
import os
|
||||
|
||||
from config import DATA_DIR
|
||||
|
||||
|
||||
TOOLS_DIR = f"{DATA_DIR}/tools"
|
||||
os.makedirs(TOOLS_DIR, exist_ok=True)
|
||||
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
############################
|
||||
# GetToolkits
|
||||
############################
|
||||
|
||||
|
||||
@router.get("/", response_model=List[ToolResponse])
|
||||
async def get_toolkits(user=Depends(get_current_user)):
|
||||
toolkits = [toolkit for toolkit in Tools.get_tools()]
|
||||
return toolkits
|
||||
|
||||
|
||||
############################
|
||||
# ExportToolKits
|
||||
############################
|
||||
|
||||
|
||||
@router.get("/export", response_model=List[ToolModel])
|
||||
async def get_toolkits(user=Depends(get_admin_user)):
|
||||
toolkits = [toolkit for toolkit in Tools.get_tools()]
|
||||
return toolkits
|
||||
|
||||
|
||||
############################
|
||||
# CreateNewToolKit
|
||||
############################
|
||||
|
||||
|
||||
@router.post("/create", response_model=Optional[ToolResponse])
|
||||
async def create_new_toolkit(
|
||||
request: Request, form_data: ToolForm, user=Depends(get_admin_user)
|
||||
):
|
||||
if not form_data.id.isidentifier():
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail="Only alphanumeric characters and underscores are allowed in the id",
|
||||
)
|
||||
|
||||
form_data.id = form_data.id.lower()
|
||||
|
||||
toolkit = Tools.get_tool_by_id(form_data.id)
|
||||
if toolkit == None:
|
||||
toolkit_path = os.path.join(TOOLS_DIR, f"{form_data.id}.py")
|
||||
try:
|
||||
with open(toolkit_path, "w") as tool_file:
|
||||
tool_file.write(form_data.content)
|
||||
|
||||
toolkit_module = load_toolkit_module_by_id(form_data.id)
|
||||
|
||||
TOOLS = request.app.state.TOOLS
|
||||
TOOLS[form_data.id] = toolkit_module
|
||||
|
||||
specs = get_tools_specs(TOOLS[form_data.id])
|
||||
toolkit = Tools.insert_new_tool(user.id, form_data, specs)
|
||||
|
||||
if toolkit:
|
||||
return toolkit
|
||||
else:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=ERROR_MESSAGES.DEFAULT("Error creating toolkit"),
|
||||
)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=ERROR_MESSAGES.DEFAULT(e),
|
||||
)
|
||||
else:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=ERROR_MESSAGES.ID_TAKEN,
|
||||
)
|
||||
|
||||
|
||||
############################
|
||||
# GetToolkitById
|
||||
############################
|
||||
|
||||
|
||||
@router.get("/id/{id}", response_model=Optional[ToolModel])
|
||||
async def get_toolkit_by_id(id: str, user=Depends(get_admin_user)):
|
||||
toolkit = Tools.get_tool_by_id(id)
|
||||
|
||||
if toolkit:
|
||||
return toolkit
|
||||
else:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail=ERROR_MESSAGES.NOT_FOUND,
|
||||
)
|
||||
|
||||
|
||||
############################
|
||||
# UpdateToolkitById
|
||||
############################
|
||||
|
||||
|
||||
@router.post("/id/{id}/update", response_model=Optional[ToolModel])
|
||||
async def update_toolkit_by_id(
|
||||
request: Request, id: str, form_data: ToolForm, user=Depends(get_admin_user)
|
||||
):
|
||||
toolkit_path = os.path.join(TOOLS_DIR, f"{id}.py")
|
||||
|
||||
try:
|
||||
with open(toolkit_path, "w") as tool_file:
|
||||
tool_file.write(form_data.content)
|
||||
|
||||
toolkit_module = load_toolkit_module_by_id(id)
|
||||
|
||||
TOOLS = request.app.state.TOOLS
|
||||
TOOLS[id] = toolkit_module
|
||||
|
||||
specs = get_tools_specs(TOOLS[id])
|
||||
|
||||
updated = {
|
||||
**form_data.model_dump(exclude={"id"}),
|
||||
"specs": specs,
|
||||
}
|
||||
|
||||
print(updated)
|
||||
toolkit = Tools.update_tool_by_id(id, updated)
|
||||
|
||||
if toolkit:
|
||||
return toolkit
|
||||
else:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=ERROR_MESSAGES.DEFAULT("Error updating toolkit"),
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail=ERROR_MESSAGES.DEFAULT(e),
|
||||
)
|
||||
|
||||
|
||||
############################
|
||||
# DeleteToolkitById
|
||||
############################
|
||||
|
||||
|
||||
@router.delete("/id/{id}/delete", response_model=bool)
|
||||
async def delete_toolkit_by_id(request: Request, id: str, user=Depends(get_admin_user)):
|
||||
result = Tools.delete_tool_by_id(id)
|
||||
|
||||
if result:
|
||||
TOOLS = request.app.state.TOOLS
|
||||
if id in TOOLS:
|
||||
del TOOLS[id]
|
||||
|
||||
# delete the toolkit file
|
||||
toolkit_path = os.path.join(TOOLS_DIR, f"{id}.py")
|
||||
os.remove(toolkit_path)
|
||||
|
||||
return result
|
||||
@@ -7,6 +7,8 @@ from pydantic import BaseModel
|
||||
|
||||
from fpdf import FPDF
|
||||
import markdown
|
||||
import black
|
||||
|
||||
|
||||
from apps.webui.internal.db import DB
|
||||
from utils.utils import get_admin_user
|
||||
@@ -26,6 +28,21 @@ async def get_gravatar(
|
||||
return get_gravatar_url(email)
|
||||
|
||||
|
||||
class CodeFormatRequest(BaseModel):
|
||||
code: str
|
||||
|
||||
|
||||
@router.post("/code/format")
|
||||
async def format_code(request: CodeFormatRequest):
|
||||
try:
|
||||
formatted_code = black.format_str(request.code, mode=black.Mode())
|
||||
return {"code": formatted_code}
|
||||
except black.NothingChanged:
|
||||
return {"code": request.code}
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=400, detail=str(e))
|
||||
|
||||
|
||||
class MarkdownForm(BaseModel):
|
||||
md: str
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
from importlib import util
|
||||
import os
|
||||
|
||||
from config import TOOLS_DIR
|
||||
|
||||
|
||||
def load_toolkit_module_by_id(toolkit_id):
|
||||
toolkit_path = os.path.join(TOOLS_DIR, f"{toolkit_id}.py")
|
||||
spec = util.spec_from_file_location(toolkit_id, toolkit_path)
|
||||
module = util.module_from_spec(spec)
|
||||
|
||||
try:
|
||||
spec.loader.exec_module(module)
|
||||
print(f"Loaded module: {module.__name__}")
|
||||
if hasattr(module, "Tools"):
|
||||
return module.Tools()
|
||||
else:
|
||||
raise Exception("No Tools class found")
|
||||
except Exception as e:
|
||||
print(f"Error loading module: {toolkit_id}")
|
||||
# Move the file to the error folder
|
||||
os.rename(toolkit_path, f"{toolkit_path}.error")
|
||||
raise e
|
||||
+33
-6
@@ -308,8 +308,9 @@ frontend_favicon = FRONTEND_BUILD_DIR / "favicon.png"
|
||||
if frontend_favicon.exists():
|
||||
try:
|
||||
shutil.copyfile(frontend_favicon, STATIC_DIR / "favicon.png")
|
||||
except PermissionError:
|
||||
logging.error(f"No write permission to {STATIC_DIR / 'favicon.png'}")
|
||||
except Exception as e:
|
||||
logging.error(f"An error occurred: {e}")
|
||||
|
||||
else:
|
||||
logging.warning(f"Frontend favicon not found at {frontend_favicon}")
|
||||
|
||||
@@ -367,6 +368,14 @@ DOCS_DIR = os.getenv("DOCS_DIR", f"{DATA_DIR}/docs")
|
||||
Path(DOCS_DIR).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
####################################
|
||||
# Tools DIR
|
||||
####################################
|
||||
|
||||
TOOLS_DIR = os.getenv("TOOLS_DIR", f"{DATA_DIR}/tools")
|
||||
Path(TOOLS_DIR).mkdir(parents=True, exist_ok=True)
|
||||
|
||||
|
||||
####################################
|
||||
# LITELLM_CONFIG
|
||||
####################################
|
||||
@@ -668,16 +677,28 @@ Question:
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD = PersistentConfig(
|
||||
"SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD",
|
||||
"task.search.prompt_length_threshold",
|
||||
os.environ.get(
|
||||
"SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD",
|
||||
100,
|
||||
int(
|
||||
os.environ.get(
|
||||
"SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD",
|
||||
100,
|
||||
)
|
||||
),
|
||||
)
|
||||
|
||||
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = PersistentConfig(
|
||||
"TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE",
|
||||
"task.tools.prompt_template",
|
||||
os.environ.get(
|
||||
"TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE",
|
||||
"""Tools: {{TOOLS}}
|
||||
If a function tool doesn't match the query, return an empty string. Else, pick a function tool, fill in the parameters from the function tool's schema, and return it in the format { "name": \"functionName\", "parameters": { "key": "value" } }. Only pick a function if the user asks. Only return the object. Do not return any other text.""",
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
####################################
|
||||
# WEBUI_SECRET_KEY
|
||||
####################################
|
||||
@@ -915,6 +936,12 @@ SERPER_API_KEY = PersistentConfig(
|
||||
os.getenv("SERPER_API_KEY", ""),
|
||||
)
|
||||
|
||||
SERPLY_API_KEY = PersistentConfig(
|
||||
"SERPLY_API_KEY",
|
||||
"rag.web.search.serply_api_key",
|
||||
os.getenv("SERPLY_API_KEY", ""),
|
||||
)
|
||||
|
||||
|
||||
RAG_WEB_SEARCH_RESULT_COUNT = PersistentConfig(
|
||||
"RAG_WEB_SEARCH_RESULT_COUNT",
|
||||
|
||||
@@ -32,6 +32,7 @@ class ERROR_MESSAGES(str, Enum):
|
||||
COMMAND_TAKEN = "Uh-oh! This command is already registered. Please choose another command string."
|
||||
FILE_EXISTS = "Uh-oh! This file is already registered. Please choose another file."
|
||||
|
||||
ID_TAKEN = "Uh-oh! This id is already registered. Please choose another id string."
|
||||
MODEL_ID_TAKEN = "Uh-oh! This model id is already registered. Please choose another model id string."
|
||||
|
||||
NAME_TAG_TAKEN = "Uh-oh! This name tag is already registered. Please choose another name tag string."
|
||||
|
||||
+223
-21
@@ -11,6 +11,7 @@ import requests
|
||||
import mimetypes
|
||||
import shutil
|
||||
import os
|
||||
import inspect
|
||||
import asyncio
|
||||
|
||||
from fastapi import FastAPI, Request, Depends, status, UploadFile, File, Form
|
||||
@@ -47,15 +48,24 @@ from pydantic import BaseModel
|
||||
from typing import List, Optional
|
||||
|
||||
from apps.webui.models.models import Models, ModelModel
|
||||
from apps.webui.models.tools import Tools
|
||||
from apps.webui.utils import load_toolkit_module_by_id
|
||||
|
||||
|
||||
from utils.utils import (
|
||||
get_admin_user,
|
||||
get_verified_user,
|
||||
get_current_user,
|
||||
get_http_authorization_cred,
|
||||
)
|
||||
from utils.task import title_generation_template, search_query_generation_template
|
||||
from utils.task import (
|
||||
title_generation_template,
|
||||
search_query_generation_template,
|
||||
tools_function_calling_generation_template,
|
||||
)
|
||||
from utils.misc import get_last_user_message, add_or_update_system_message
|
||||
|
||||
from apps.rag.utils import rag_messages
|
||||
from apps.rag.utils import get_rag_context, rag_template
|
||||
|
||||
from config import (
|
||||
CONFIG_DATA,
|
||||
@@ -82,6 +92,7 @@ from config import (
|
||||
TITLE_GENERATION_PROMPT_TEMPLATE,
|
||||
SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE,
|
||||
SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD,
|
||||
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
|
||||
AppConfig,
|
||||
)
|
||||
from constants import ERROR_MESSAGES
|
||||
@@ -148,24 +159,117 @@ app.state.config.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE = (
|
||||
app.state.config.SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD = (
|
||||
SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD
|
||||
)
|
||||
app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = (
|
||||
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE
|
||||
)
|
||||
|
||||
app.state.MODELS = {}
|
||||
|
||||
origins = ["*"]
|
||||
|
||||
# Custom middleware to add security headers
|
||||
# class SecurityHeadersMiddleware(BaseHTTPMiddleware):
|
||||
# async def dispatch(self, request: Request, call_next):
|
||||
# response: Response = await call_next(request)
|
||||
# response.headers["Cross-Origin-Opener-Policy"] = "same-origin"
|
||||
# response.headers["Cross-Origin-Embedder-Policy"] = "require-corp"
|
||||
# return response
|
||||
|
||||
async def get_function_call_response(messages, tool_id, template, task_model_id, user):
|
||||
tool = Tools.get_tool_by_id(tool_id)
|
||||
tools_specs = json.dumps(tool.specs, indent=2)
|
||||
content = tools_function_calling_generation_template(template, tools_specs)
|
||||
|
||||
user_message = get_last_user_message(messages)
|
||||
prompt = (
|
||||
"History:\n"
|
||||
+ "\n".join(
|
||||
[
|
||||
f"{message['role'].upper()}: \"\"\"{message['content']}\"\"\""
|
||||
for message in messages[::-1][:4]
|
||||
]
|
||||
)
|
||||
+ f"\nQuery: {user_message}"
|
||||
)
|
||||
|
||||
print(prompt)
|
||||
|
||||
payload = {
|
||||
"model": task_model_id,
|
||||
"messages": [
|
||||
{"role": "system", "content": content},
|
||||
{"role": "user", "content": f"Query: {prompt}"},
|
||||
],
|
||||
"stream": False,
|
||||
}
|
||||
|
||||
payload = filter_pipeline(payload, user)
|
||||
model = app.state.MODELS[task_model_id]
|
||||
|
||||
response = None
|
||||
try:
|
||||
if model["owned_by"] == "ollama":
|
||||
response = await generate_ollama_chat_completion(
|
||||
OpenAIChatCompletionForm(**payload), user=user
|
||||
)
|
||||
else:
|
||||
response = await generate_openai_chat_completion(payload, user=user)
|
||||
|
||||
content = None
|
||||
|
||||
if hasattr(response, "body_iterator"):
|
||||
async for chunk in response.body_iterator:
|
||||
data = json.loads(chunk.decode("utf-8"))
|
||||
content = data["choices"][0]["message"]["content"]
|
||||
|
||||
# Cleanup any remaining background tasks if necessary
|
||||
if response.background is not None:
|
||||
await response.background()
|
||||
else:
|
||||
content = response["choices"][0]["message"]["content"]
|
||||
|
||||
# Parse the function response
|
||||
if content is not None:
|
||||
print(f"content: {content}")
|
||||
result = json.loads(content)
|
||||
print(result)
|
||||
|
||||
# Call the function
|
||||
if "name" in result:
|
||||
if tool_id in webui_app.state.TOOLS:
|
||||
toolkit_module = webui_app.state.TOOLS[tool_id]
|
||||
else:
|
||||
toolkit_module = load_toolkit_module_by_id(tool_id)
|
||||
webui_app.state.TOOLS[tool_id] = toolkit_module
|
||||
|
||||
function = getattr(toolkit_module, result["name"])
|
||||
function_result = None
|
||||
try:
|
||||
# Get the signature of the function
|
||||
sig = inspect.signature(function)
|
||||
# Check if '__user__' is a parameter of the function
|
||||
if "__user__" in sig.parameters:
|
||||
# Call the function with the '__user__' parameter included
|
||||
function_result = function(
|
||||
**{
|
||||
**result["parameters"],
|
||||
"__user__": {
|
||||
"id": user.id,
|
||||
"email": user.email,
|
||||
"name": user.name,
|
||||
"role": user.role,
|
||||
},
|
||||
}
|
||||
)
|
||||
else:
|
||||
# Call the function without modifying the parameters
|
||||
function_result = function(**result["parameters"])
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
# Add the function result to the system prompt
|
||||
if function_result:
|
||||
return function_result
|
||||
except Exception as e:
|
||||
print(f"Error: {e}")
|
||||
|
||||
return None
|
||||
|
||||
|
||||
# app.add_middleware(SecurityHeadersMiddleware)
|
||||
|
||||
|
||||
class RAGMiddleware(BaseHTTPMiddleware):
|
||||
class ChatCompletionMiddleware(BaseHTTPMiddleware):
|
||||
async def dispatch(self, request: Request, call_next):
|
||||
return_citations = False
|
||||
|
||||
@@ -182,35 +286,95 @@ class RAGMiddleware(BaseHTTPMiddleware):
|
||||
# Parse string to JSON
|
||||
data = json.loads(body_str) if body_str else {}
|
||||
|
||||
user = get_current_user(
|
||||
get_http_authorization_cred(request.headers.get("Authorization"))
|
||||
)
|
||||
|
||||
# Remove the citations from the body
|
||||
return_citations = data.get("citations", False)
|
||||
if "citations" in data:
|
||||
del data["citations"]
|
||||
|
||||
# Example: Add a new key-value pair or modify existing ones
|
||||
# data["modified"] = True # Example modification
|
||||
# Set the task model
|
||||
task_model_id = data["model"]
|
||||
if task_model_id not in app.state.MODELS:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Model not found",
|
||||
)
|
||||
|
||||
# Check if the user has a custom task model
|
||||
# If the user has a custom task model, use that model
|
||||
if app.state.MODELS[task_model_id]["owned_by"] == "ollama":
|
||||
if (
|
||||
app.state.config.TASK_MODEL
|
||||
and app.state.config.TASK_MODEL in app.state.MODELS
|
||||
):
|
||||
task_model_id = app.state.config.TASK_MODEL
|
||||
else:
|
||||
if (
|
||||
app.state.config.TASK_MODEL_EXTERNAL
|
||||
and app.state.config.TASK_MODEL_EXTERNAL in app.state.MODELS
|
||||
):
|
||||
task_model_id = app.state.config.TASK_MODEL_EXTERNAL
|
||||
|
||||
prompt = get_last_user_message(data["messages"])
|
||||
context = ""
|
||||
|
||||
# If tool_ids field is present, call the functions
|
||||
if "tool_ids" in data:
|
||||
print(data["tool_ids"])
|
||||
for tool_id in data["tool_ids"]:
|
||||
print(tool_id)
|
||||
response = await get_function_call_response(
|
||||
messages=data["messages"],
|
||||
tool_id=tool_id,
|
||||
template=app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
|
||||
task_model_id=task_model_id,
|
||||
user=user,
|
||||
)
|
||||
|
||||
if response:
|
||||
context += ("\n" if context != "" else "") + response
|
||||
del data["tool_ids"]
|
||||
|
||||
print(f"tool_context: {context}")
|
||||
|
||||
# If docs field is present, generate RAG completions
|
||||
if "docs" in data:
|
||||
data = {**data}
|
||||
data["messages"], citations = rag_messages(
|
||||
rag_context, citations = get_rag_context(
|
||||
docs=data["docs"],
|
||||
messages=data["messages"],
|
||||
template=rag_app.state.config.RAG_TEMPLATE,
|
||||
embedding_function=rag_app.state.EMBEDDING_FUNCTION,
|
||||
k=rag_app.state.config.TOP_K,
|
||||
reranking_function=rag_app.state.sentence_transformer_rf,
|
||||
r=rag_app.state.config.RELEVANCE_THRESHOLD,
|
||||
hybrid_search=rag_app.state.config.ENABLE_RAG_HYBRID_SEARCH,
|
||||
)
|
||||
|
||||
if rag_context:
|
||||
context += ("\n" if context != "" else "") + rag_context
|
||||
|
||||
del data["docs"]
|
||||
|
||||
log.debug(
|
||||
f"data['messages']: {data['messages']}, citations: {citations}"
|
||||
log.debug(f"rag_context: {rag_context}, citations: {citations}")
|
||||
|
||||
if context != "":
|
||||
system_prompt = rag_template(
|
||||
rag_app.state.config.RAG_TEMPLATE, context, prompt
|
||||
)
|
||||
|
||||
print(system_prompt)
|
||||
|
||||
data["messages"] = add_or_update_system_message(
|
||||
f"\n{system_prompt}", data["messages"]
|
||||
)
|
||||
|
||||
modified_body_bytes = json.dumps(data).encode("utf-8")
|
||||
|
||||
# Replace the request body with the modified one
|
||||
request._body = modified_body_bytes
|
||||
|
||||
# Set custom header to ensure content-length matches new body length
|
||||
request.headers.__dict__["_list"] = [
|
||||
(b"content-length", str(len(modified_body_bytes)).encode("utf-8")),
|
||||
@@ -253,7 +417,7 @@ class RAGMiddleware(BaseHTTPMiddleware):
|
||||
yield data
|
||||
|
||||
|
||||
app.add_middleware(RAGMiddleware)
|
||||
app.add_middleware(ChatCompletionMiddleware)
|
||||
|
||||
|
||||
def filter_pipeline(payload, user):
|
||||
@@ -515,6 +679,7 @@ async def get_task_config(user=Depends(get_verified_user)):
|
||||
"TITLE_GENERATION_PROMPT_TEMPLATE": app.state.config.TITLE_GENERATION_PROMPT_TEMPLATE,
|
||||
"SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE": app.state.config.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE,
|
||||
"SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD": app.state.config.SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD,
|
||||
"TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE": app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
|
||||
}
|
||||
|
||||
|
||||
@@ -524,6 +689,7 @@ class TaskConfigForm(BaseModel):
|
||||
TITLE_GENERATION_PROMPT_TEMPLATE: str
|
||||
SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE: str
|
||||
SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD: int
|
||||
TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE: str
|
||||
|
||||
|
||||
@app.post("/api/task/config/update")
|
||||
@@ -539,6 +705,9 @@ async def update_task_config(form_data: TaskConfigForm, user=Depends(get_admin_u
|
||||
app.state.config.SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD = (
|
||||
form_data.SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD
|
||||
)
|
||||
app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE = (
|
||||
form_data.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE
|
||||
)
|
||||
|
||||
return {
|
||||
"TASK_MODEL": app.state.config.TASK_MODEL,
|
||||
@@ -546,6 +715,7 @@ async def update_task_config(form_data: TaskConfigForm, user=Depends(get_admin_u
|
||||
"TITLE_GENERATION_PROMPT_TEMPLATE": app.state.config.TITLE_GENERATION_PROMPT_TEMPLATE,
|
||||
"SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE": app.state.config.SEARCH_QUERY_GENERATION_PROMPT_TEMPLATE,
|
||||
"SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD": app.state.config.SEARCH_QUERY_PROMPT_LENGTH_THRESHOLD,
|
||||
"TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE": app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE,
|
||||
}
|
||||
|
||||
|
||||
@@ -659,6 +829,38 @@ async def generate_search_query(form_data: dict, user=Depends(get_verified_user)
|
||||
return await generate_openai_chat_completion(payload, user=user)
|
||||
|
||||
|
||||
@app.post("/api/task/tools/completions")
|
||||
async def get_tools_function_calling(form_data: dict, user=Depends(get_verified_user)):
|
||||
print("get_tools_function_calling")
|
||||
|
||||
model_id = form_data["model"]
|
||||
if model_id not in app.state.MODELS:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Model not found",
|
||||
)
|
||||
|
||||
# Check if the user has a custom task model
|
||||
# If the user has a custom task model, use that model
|
||||
if app.state.MODELS[model_id]["owned_by"] == "ollama":
|
||||
if app.state.config.TASK_MODEL:
|
||||
task_model_id = app.state.config.TASK_MODEL
|
||||
if task_model_id in app.state.MODELS:
|
||||
model_id = task_model_id
|
||||
else:
|
||||
if app.state.config.TASK_MODEL_EXTERNAL:
|
||||
task_model_id = app.state.config.TASK_MODEL_EXTERNAL
|
||||
if task_model_id in app.state.MODELS:
|
||||
model_id = task_model_id
|
||||
|
||||
print(model_id)
|
||||
template = app.state.config.TOOLS_FUNCTION_CALLING_PROMPT_TEMPLATE
|
||||
|
||||
return await get_function_call_response(
|
||||
form_data["messages"], form_data["tool_id"], template, model_id, user
|
||||
)
|
||||
|
||||
|
||||
@app.post("/api/chat/completions")
|
||||
async def generate_chat_completions(form_data: dict, user=Depends(get_verified_user)):
|
||||
model_id = form_data["model"]
|
||||
|
||||
@@ -59,4 +59,5 @@ youtube-transcript-api==0.6.2
|
||||
pytube==15.0.0
|
||||
|
||||
extract_msg
|
||||
pydub
|
||||
pydub
|
||||
duckduckgo-search~=6.1.5
|
||||
@@ -8,6 +8,7 @@ cd /d "%SCRIPT_DIR%" || exit /b
|
||||
|
||||
SET "KEY_FILE=.webui_secret_key"
|
||||
IF "%PORT%"=="" SET PORT=8080
|
||||
IF "%HOST%"=="" SET HOST=0.0.0.0
|
||||
SET "WEBUI_SECRET_KEY=%WEBUI_SECRET_KEY%"
|
||||
SET "WEBUI_JWT_SECRET_KEY=%WEBUI_JWT_SECRET_KEY%"
|
||||
|
||||
@@ -29,4 +30,4 @@ IF "%WEBUI_SECRET_KEY%%WEBUI_JWT_SECRET_KEY%" == " " (
|
||||
|
||||
:: Execute uvicorn
|
||||
SET "WEBUI_SECRET_KEY=%WEBUI_SECRET_KEY%"
|
||||
uvicorn main:app --host 0.0.0.0 --port "%PORT%" --forwarded-allow-ips '*'
|
||||
uvicorn main:app --host "%HOST%" --port "%PORT%" --forwarded-allow-ips '*'
|
||||
|
||||
@@ -110,3 +110,8 @@ def search_query_generation_template(
|
||||
),
|
||||
)
|
||||
return template
|
||||
|
||||
|
||||
def tools_function_calling_generation_template(template: str, tools_specs: str) -> str:
|
||||
template = template.replace("{{TOOLS}}", tools_specs)
|
||||
return template
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
import inspect
|
||||
from typing import get_type_hints, List, Dict, Any
|
||||
|
||||
|
||||
def doc_to_dict(docstring):
|
||||
lines = docstring.split("\n")
|
||||
description = lines[1].strip()
|
||||
param_dict = {}
|
||||
|
||||
for line in lines:
|
||||
if ":param" in line:
|
||||
line = line.replace(":param", "").strip()
|
||||
param, desc = line.split(":", 1)
|
||||
param_dict[param.strip()] = desc.strip()
|
||||
ret_dict = {"description": description, "params": param_dict}
|
||||
return ret_dict
|
||||
|
||||
|
||||
def get_tools_specs(tools) -> List[dict]:
|
||||
function_list = [
|
||||
{"name": func, "function": getattr(tools, func)}
|
||||
for func in dir(tools)
|
||||
if callable(getattr(tools, func)) and not func.startswith("__")
|
||||
]
|
||||
|
||||
specs = []
|
||||
for function_item in function_list:
|
||||
function_name = function_item["name"]
|
||||
function = function_item["function"]
|
||||
|
||||
function_doc = doc_to_dict(function.__doc__ or function_name)
|
||||
specs.append(
|
||||
{
|
||||
"name": function_name,
|
||||
# TODO: multi-line desc?
|
||||
"description": function_doc.get("description", function_name),
|
||||
"parameters": {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
param_name: {
|
||||
"type": param_annotation.__name__.lower(),
|
||||
**(
|
||||
{
|
||||
"enum": (
|
||||
str(param_annotation.__args__)
|
||||
if hasattr(param_annotation, "__args__")
|
||||
else None
|
||||
)
|
||||
}
|
||||
if hasattr(param_annotation, "__args__")
|
||||
else {}
|
||||
),
|
||||
"description": function_doc.get("params", {}).get(
|
||||
param_name, param_name
|
||||
),
|
||||
}
|
||||
for param_name, param_annotation in get_type_hints(
|
||||
function
|
||||
).items()
|
||||
if param_name != "return" and param_name != "__user__"
|
||||
},
|
||||
"required": [
|
||||
name
|
||||
for name, param in inspect.signature(
|
||||
function
|
||||
).parameters.items()
|
||||
if param.default is param.empty
|
||||
],
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
return specs
|
||||
@@ -28,19 +28,6 @@ describe('Settings', () => {
|
||||
});
|
||||
});
|
||||
|
||||
context('Connections', () => {
|
||||
it('user can open the Connections modal and hit save', () => {
|
||||
cy.get('button').contains('Connections').click();
|
||||
cy.get('button').contains('Save').click();
|
||||
});
|
||||
});
|
||||
|
||||
context('Models', () => {
|
||||
it('user can open the Models modal', () => {
|
||||
cy.get('button').contains('Models').click();
|
||||
});
|
||||
});
|
||||
|
||||
context('Interface', () => {
|
||||
it('user can open the Interface modal and hit save', () => {
|
||||
cy.get('button').contains('Interface').click();
|
||||
@@ -55,14 +42,6 @@ describe('Settings', () => {
|
||||
});
|
||||
});
|
||||
|
||||
context('Images', () => {
|
||||
it('user can open the Images modal and hit save', () => {
|
||||
cy.get('button').contains('Images').click();
|
||||
// Currently fails because the backend requires a valid URL
|
||||
// cy.get('button').contains('Save').click();
|
||||
});
|
||||
});
|
||||
|
||||
context('Chats', () => {
|
||||
it('user can open the Chats modal', () => {
|
||||
cy.get('button').contains('Chats').click();
|
||||
|
||||
Generated
+196
-9
@@ -1,17 +1,21 @@
|
||||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.3.1",
|
||||
"version": "0.3.4",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "open-webui",
|
||||
"version": "0.3.1",
|
||||
"version": "0.3.4",
|
||||
"dependencies": {
|
||||
"@codemirror/lang-javascript": "^6.2.2",
|
||||
"@codemirror/lang-python": "^6.1.6",
|
||||
"@codemirror/theme-one-dark": "^6.1.2",
|
||||
"@pyscript/core": "^0.4.32",
|
||||
"@sveltejs/adapter-node": "^1.3.1",
|
||||
"async": "^3.2.5",
|
||||
"bits-ui": "^0.19.7",
|
||||
"codemirror": "^6.0.1",
|
||||
"dayjs": "^1.11.10",
|
||||
"eventsource-parser": "^1.1.2",
|
||||
"file-saver": "^2.0.5",
|
||||
@@ -108,6 +112,119 @@
|
||||
"resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.4.tgz",
|
||||
"integrity": "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A=="
|
||||
},
|
||||
"node_modules/@codemirror/autocomplete": {
|
||||
"version": "6.16.2",
|
||||
"resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.16.2.tgz",
|
||||
"integrity": "sha512-MjfDrHy0gHKlPWsvSsikhO1+BOh+eBHNgfH1OXs1+DAf30IonQldgMM3kxLDTG9ktE7kDLaA1j/l7KMPA4KNfw==",
|
||||
"dependencies": {
|
||||
"@codemirror/language": "^6.0.0",
|
||||
"@codemirror/state": "^6.0.0",
|
||||
"@codemirror/view": "^6.17.0",
|
||||
"@lezer/common": "^1.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@codemirror/language": "^6.0.0",
|
||||
"@codemirror/state": "^6.0.0",
|
||||
"@codemirror/view": "^6.0.0",
|
||||
"@lezer/common": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@codemirror/commands": {
|
||||
"version": "6.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.6.0.tgz",
|
||||
"integrity": "sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg==",
|
||||
"dependencies": {
|
||||
"@codemirror/language": "^6.0.0",
|
||||
"@codemirror/state": "^6.4.0",
|
||||
"@codemirror/view": "^6.27.0",
|
||||
"@lezer/common": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@codemirror/lang-javascript": {
|
||||
"version": "6.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz",
|
||||
"integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==",
|
||||
"dependencies": {
|
||||
"@codemirror/autocomplete": "^6.0.0",
|
||||
"@codemirror/language": "^6.6.0",
|
||||
"@codemirror/lint": "^6.0.0",
|
||||
"@codemirror/state": "^6.0.0",
|
||||
"@codemirror/view": "^6.17.0",
|
||||
"@lezer/common": "^1.0.0",
|
||||
"@lezer/javascript": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@codemirror/lang-python": {
|
||||
"version": "6.1.6",
|
||||
"resolved": "https://registry.npmjs.org/@codemirror/lang-python/-/lang-python-6.1.6.tgz",
|
||||
"integrity": "sha512-ai+01WfZhWqM92UqjnvorkxosZ2aq2u28kHvr+N3gu012XqY2CThD67JPMHnGceRfXPDBmn1HnyqowdpF57bNg==",
|
||||
"dependencies": {
|
||||
"@codemirror/autocomplete": "^6.3.2",
|
||||
"@codemirror/language": "^6.8.0",
|
||||
"@codemirror/state": "^6.0.0",
|
||||
"@lezer/common": "^1.2.1",
|
||||
"@lezer/python": "^1.1.4"
|
||||
}
|
||||
},
|
||||
"node_modules/@codemirror/language": {
|
||||
"version": "6.10.2",
|
||||
"resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.2.tgz",
|
||||
"integrity": "sha512-kgbTYTo0Au6dCSc/TFy7fK3fpJmgHDv1sG1KNQKJXVi+xBTEeBPY/M30YXiU6mMXeH+YIDLsbrT4ZwNRdtF+SA==",
|
||||
"dependencies": {
|
||||
"@codemirror/state": "^6.0.0",
|
||||
"@codemirror/view": "^6.23.0",
|
||||
"@lezer/common": "^1.1.0",
|
||||
"@lezer/highlight": "^1.0.0",
|
||||
"@lezer/lr": "^1.0.0",
|
||||
"style-mod": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@codemirror/lint": {
|
||||
"version": "6.8.0",
|
||||
"resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.0.tgz",
|
||||
"integrity": "sha512-lsFofvaw0lnPRJlQylNsC4IRt/1lI4OD/yYslrSGVndOJfStc58v+8p9dgGiD90ktOfL7OhBWns1ZETYgz0EJA==",
|
||||
"dependencies": {
|
||||
"@codemirror/state": "^6.0.0",
|
||||
"@codemirror/view": "^6.0.0",
|
||||
"crelt": "^1.0.5"
|
||||
}
|
||||
},
|
||||
"node_modules/@codemirror/search": {
|
||||
"version": "6.5.6",
|
||||
"resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.6.tgz",
|
||||
"integrity": "sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==",
|
||||
"dependencies": {
|
||||
"@codemirror/state": "^6.0.0",
|
||||
"@codemirror/view": "^6.0.0",
|
||||
"crelt": "^1.0.5"
|
||||
}
|
||||
},
|
||||
"node_modules/@codemirror/state": {
|
||||
"version": "6.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz",
|
||||
"integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A=="
|
||||
},
|
||||
"node_modules/@codemirror/theme-one-dark": {
|
||||
"version": "6.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz",
|
||||
"integrity": "sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==",
|
||||
"dependencies": {
|
||||
"@codemirror/language": "^6.0.0",
|
||||
"@codemirror/state": "^6.0.0",
|
||||
"@codemirror/view": "^6.0.0",
|
||||
"@lezer/highlight": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@codemirror/view": {
|
||||
"version": "6.28.0",
|
||||
"resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.28.0.tgz",
|
||||
"integrity": "sha512-fo7CelaUDKWIyemw4b+J57cWuRkOu4SWCCPfNDkPvfWkGjM9D5racHQXr4EQeYCD6zEBIBxGCeaKkQo+ysl0gA==",
|
||||
"dependencies": {
|
||||
"@codemirror/state": "^6.4.0",
|
||||
"style-mod": "^4.1.0",
|
||||
"w3c-keyname": "^2.2.4"
|
||||
}
|
||||
},
|
||||
"node_modules/@colors/colors": {
|
||||
"version": "1.5.0",
|
||||
"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
|
||||
@@ -825,6 +942,47 @@
|
||||
"@jridgewell/sourcemap-codec": "^1.4.14"
|
||||
}
|
||||
},
|
||||
"node_modules/@lezer/common": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz",
|
||||
"integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ=="
|
||||
},
|
||||
"node_modules/@lezer/highlight": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz",
|
||||
"integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==",
|
||||
"dependencies": {
|
||||
"@lezer/common": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@lezer/javascript": {
|
||||
"version": "1.4.16",
|
||||
"resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.16.tgz",
|
||||
"integrity": "sha512-84UXR3N7s11MPQHWgMnjb9571fr19MmXnr5zTv2XX0gHXXUvW3uPJ8GCjKrfTXmSdfktjRK0ayKklw+A13rk4g==",
|
||||
"dependencies": {
|
||||
"@lezer/common": "^1.2.0",
|
||||
"@lezer/highlight": "^1.1.3",
|
||||
"@lezer/lr": "^1.3.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@lezer/lr": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.1.tgz",
|
||||
"integrity": "sha512-CHsKq8DMKBf9b3yXPDIU4DbH+ZJd/sJdYOW2llbW/HudP5u0VS6Bfq1hLYfgU7uAYGFIyGGQIsSOXGPEErZiJw==",
|
||||
"dependencies": {
|
||||
"@lezer/common": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@lezer/python": {
|
||||
"version": "1.1.14",
|
||||
"resolved": "https://registry.npmjs.org/@lezer/python/-/python-1.1.14.tgz",
|
||||
"integrity": "sha512-ykDOb2Ti24n76PJsSa4ZoDF0zH12BSw1LGfQXCYJhJyOGiFTfGaX0Du66Ze72R+u/P35U+O6I9m8TFXov1JzsA==",
|
||||
"dependencies": {
|
||||
"@lezer/common": "^1.2.0",
|
||||
"@lezer/highlight": "^1.0.0",
|
||||
"@lezer/lr": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@melt-ui/svelte": {
|
||||
"version": "0.76.0",
|
||||
"resolved": "https://registry.npmjs.org/@melt-ui/svelte/-/svelte-0.76.0.tgz",
|
||||
@@ -2224,12 +2382,12 @@
|
||||
}
|
||||
},
|
||||
"node_modules/braces": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"fill-range": "^7.0.1"
|
||||
"fill-range": "^7.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
@@ -2769,6 +2927,20 @@
|
||||
"plain-tag": "^0.1.3"
|
||||
}
|
||||
},
|
||||
"node_modules/codemirror": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz",
|
||||
"integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==",
|
||||
"dependencies": {
|
||||
"@codemirror/autocomplete": "^6.0.0",
|
||||
"@codemirror/commands": "^6.0.0",
|
||||
"@codemirror/language": "^6.0.0",
|
||||
"@codemirror/lint": "^6.0.0",
|
||||
"@codemirror/search": "^6.0.0",
|
||||
"@codemirror/state": "^6.0.0",
|
||||
"@codemirror/view": "^6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/coincident": {
|
||||
"version": "1.2.3",
|
||||
"resolved": "https://registry.npmjs.org/coincident/-/coincident-1.2.3.tgz",
|
||||
@@ -2891,6 +3063,11 @@
|
||||
"layout-base": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/crelt": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz",
|
||||
"integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g=="
|
||||
},
|
||||
"node_modules/cross-spawn": {
|
||||
"version": "7.0.3",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||
@@ -4429,9 +4606,9 @@
|
||||
"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
|
||||
},
|
||||
"node_modules/fill-range": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
@@ -8278,6 +8455,11 @@
|
||||
"url": "https://github.com/sponsors/antfu"
|
||||
}
|
||||
},
|
||||
"node_modules/style-mod": {
|
||||
"version": "4.1.2",
|
||||
"resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz",
|
||||
"integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw=="
|
||||
},
|
||||
"node_modules/stylis": {
|
||||
"version": "4.3.2",
|
||||
"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz",
|
||||
@@ -10022,6 +10204,11 @@
|
||||
"he": "^1.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/w3c-keyname": {
|
||||
"version": "2.2.8",
|
||||
"resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
|
||||
"integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="
|
||||
},
|
||||
"node_modules/walk-sync": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-2.2.0.tgz",
|
||||
|
||||
+7
-3
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "open-webui",
|
||||
"version": "0.3.1",
|
||||
"version": "0.3.4",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"dev": "npm run pyodide:fetch && vite dev --host",
|
||||
@@ -16,7 +16,7 @@
|
||||
"format:backend": "black . --exclude \".venv/|/venv/\"",
|
||||
"i18n:parse": "i18next --config i18next-parser.config.ts && prettier --write \"src/lib/i18n/**/*.{js,json}\"",
|
||||
"cy:open": "cypress open",
|
||||
"test:frontend": "vitest",
|
||||
"test:frontend": "vitest --passWithNoTests",
|
||||
"pyodide:fetch": "node scripts/prepare-pyodide.js"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -48,10 +48,14 @@
|
||||
},
|
||||
"type": "module",
|
||||
"dependencies": {
|
||||
"@codemirror/lang-javascript": "^6.2.2",
|
||||
"@codemirror/lang-python": "^6.1.6",
|
||||
"@codemirror/theme-one-dark": "^6.1.2",
|
||||
"@pyscript/core": "^0.4.32",
|
||||
"@sveltejs/adapter-node": "^1.3.1",
|
||||
"async": "^3.2.5",
|
||||
"bits-ui": "^0.19.7",
|
||||
"codemirror": "^6.0.1",
|
||||
"dayjs": "^1.11.10",
|
||||
"eventsource-parser": "^1.1.2",
|
||||
"file-saver": "^2.0.5",
|
||||
@@ -71,4 +75,4 @@
|
||||
"tippy.js": "^6.3.7",
|
||||
"uuid": "^9.0.1"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-2
@@ -26,8 +26,6 @@ dependencies = [
|
||||
"PyMySQL==1.1.0",
|
||||
"bcrypt==4.1.3",
|
||||
|
||||
"litellm[proxy]==1.37.20",
|
||||
|
||||
"boto3==1.34.110",
|
||||
|
||||
"argon2-cffi==23.1.0",
|
||||
@@ -66,6 +64,10 @@ dependencies = [
|
||||
"langfuse==2.33.0",
|
||||
"youtube-transcript-api==0.6.2",
|
||||
"pytube==15.0.0",
|
||||
"extract_msg",
|
||||
"pydub",
|
||||
"duckduckgo-search~=6.1.5"
|
||||
|
||||
]
|
||||
readme = "README.md"
|
||||
requires-python = ">= 3.11, < 3.12.0a1"
|
||||
|
||||
+40
-48
@@ -12,7 +12,6 @@
|
||||
aiohttp==3.9.5
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via litellm
|
||||
# via open-webui
|
||||
aiosignal==1.3.1
|
||||
# via aiohttp
|
||||
@@ -20,11 +19,9 @@ annotated-types==0.6.0
|
||||
# via pydantic
|
||||
anyio==4.3.0
|
||||
# via httpx
|
||||
# via openai
|
||||
# via starlette
|
||||
# via watchfiles
|
||||
apscheduler==3.10.4
|
||||
# via litellm
|
||||
# via open-webui
|
||||
argon2-cffi==23.1.0
|
||||
# via open-webui
|
||||
@@ -38,7 +35,6 @@ av==11.0.0
|
||||
# via faster-whisper
|
||||
backoff==2.2.1
|
||||
# via langfuse
|
||||
# via litellm
|
||||
# via posthog
|
||||
# via unstructured
|
||||
bcrypt==4.1.3
|
||||
@@ -46,6 +42,7 @@ bcrypt==4.1.3
|
||||
# via open-webui
|
||||
# via passlib
|
||||
beautifulsoup4==4.12.3
|
||||
# via extract-msg
|
||||
# via unstructured
|
||||
bidict==0.23.1
|
||||
# via python-socketio
|
||||
@@ -83,17 +80,20 @@ chromadb==0.5.0
|
||||
# via open-webui
|
||||
click==8.1.7
|
||||
# via black
|
||||
# via duckduckgo-search
|
||||
# via flask
|
||||
# via litellm
|
||||
# via nltk
|
||||
# via peewee-migrate
|
||||
# via rq
|
||||
# via typer
|
||||
# via uvicorn
|
||||
colorclass==2.2.2
|
||||
# via oletools
|
||||
coloredlogs==15.0.1
|
||||
# via onnxruntime
|
||||
compressed-rtf==1.0.6
|
||||
# via extract-msg
|
||||
cryptography==42.0.7
|
||||
# via litellm
|
||||
# via msoffcrypto-tool
|
||||
# via pyjwt
|
||||
ctranslate2==4.2.1
|
||||
# via faster-whisper
|
||||
@@ -109,33 +109,34 @@ defusedxml==0.7.1
|
||||
deprecated==1.2.14
|
||||
# via opentelemetry-api
|
||||
# via opentelemetry-exporter-otlp-proto-grpc
|
||||
distro==1.9.0
|
||||
# via openai
|
||||
dnspython==2.6.1
|
||||
# via email-validator
|
||||
docx2txt==0.8
|
||||
# via open-webui
|
||||
duckduckgo-search==6.1.5
|
||||
# via open-webui
|
||||
easygui==0.98.3
|
||||
# via oletools
|
||||
ebcdic==1.1.1
|
||||
# via extract-msg
|
||||
ecdsa==0.19.0
|
||||
# via python-jose
|
||||
email-validator==2.1.1
|
||||
# via fastapi
|
||||
# via pydantic
|
||||
emoji==2.11.1
|
||||
# via unstructured
|
||||
et-xmlfile==1.1.0
|
||||
# via openpyxl
|
||||
extract-msg==0.48.5
|
||||
# via open-webui
|
||||
fake-useragent==1.5.1
|
||||
# via open-webui
|
||||
fastapi==0.111.0
|
||||
# via chromadb
|
||||
# via fastapi-sso
|
||||
# via langchain-chroma
|
||||
# via litellm
|
||||
# via open-webui
|
||||
fastapi-cli==0.0.4
|
||||
# via fastapi
|
||||
fastapi-sso==0.10.0
|
||||
# via litellm
|
||||
faster-whisper==1.0.2
|
||||
# via open-webui
|
||||
filelock==3.14.0
|
||||
@@ -191,8 +192,6 @@ grpcio==1.63.0
|
||||
# via opentelemetry-exporter-otlp-proto-grpc
|
||||
grpcio-status==1.62.2
|
||||
# via google-api-core
|
||||
gunicorn==22.0.0
|
||||
# via litellm
|
||||
h11==0.14.0
|
||||
# via httpcore
|
||||
# via uvicorn
|
||||
@@ -206,9 +205,7 @@ httptools==0.6.1
|
||||
# via uvicorn
|
||||
httpx==0.27.0
|
||||
# via fastapi
|
||||
# via fastapi-sso
|
||||
# via langfuse
|
||||
# via openai
|
||||
huggingface-hub==0.23.0
|
||||
# via faster-whisper
|
||||
# via sentence-transformers
|
||||
@@ -225,7 +222,6 @@ idna==3.7
|
||||
# via unstructured-client
|
||||
# via yarl
|
||||
importlib-metadata==7.0.0
|
||||
# via litellm
|
||||
# via opentelemetry-api
|
||||
importlib-resources==6.4.0
|
||||
# via chromadb
|
||||
@@ -234,7 +230,6 @@ itsdangerous==2.2.0
|
||||
jinja2==3.1.4
|
||||
# via fastapi
|
||||
# via flask
|
||||
# via litellm
|
||||
# via torch
|
||||
jmespath==1.0.1
|
||||
# via boto3
|
||||
@@ -272,8 +267,8 @@ langsmith==0.1.57
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langchain-core
|
||||
litellm==1.37.20
|
||||
# via open-webui
|
||||
lark==1.1.8
|
||||
# via rtfde
|
||||
lxml==5.2.2
|
||||
# via unstructured
|
||||
markdown==3.6
|
||||
@@ -294,6 +289,8 @@ monotonic==1.6
|
||||
# via posthog
|
||||
mpmath==1.3.0
|
||||
# via sympy
|
||||
msoffcrypto-tool==5.4.1
|
||||
# via oletools
|
||||
multidict==6.0.5
|
||||
# via aiohttp
|
||||
# via yarl
|
||||
@@ -325,15 +322,19 @@ numpy==1.26.4
|
||||
# via transformers
|
||||
# via unstructured
|
||||
oauthlib==3.2.2
|
||||
# via fastapi-sso
|
||||
# via kubernetes
|
||||
# via requests-oauthlib
|
||||
olefile==0.47
|
||||
# via extract-msg
|
||||
# via msoffcrypto-tool
|
||||
# via oletools
|
||||
oletools==0.60.1
|
||||
# via pcodedmp
|
||||
# via rtfde
|
||||
onnxruntime==1.17.3
|
||||
# via chromadb
|
||||
# via faster-whisper
|
||||
# via rapidocr-onnxruntime
|
||||
openai==1.28.1
|
||||
# via litellm
|
||||
opencv-python==4.9.0.80
|
||||
# via rapidocr-onnxruntime
|
||||
opencv-python-headless==4.9.0.80
|
||||
@@ -375,15 +376,14 @@ ordered-set==4.1.0
|
||||
# via deepdiff
|
||||
orjson==3.10.3
|
||||
# via chromadb
|
||||
# via duckduckgo-search
|
||||
# via fastapi
|
||||
# via langsmith
|
||||
# via litellm
|
||||
overrides==7.7.0
|
||||
# via chromadb
|
||||
packaging==23.2
|
||||
# via black
|
||||
# via build
|
||||
# via gunicorn
|
||||
# via huggingface-hub
|
||||
# via langchain-core
|
||||
# via langfuse
|
||||
@@ -397,6 +397,8 @@ passlib==1.7.4
|
||||
# via open-webui
|
||||
pathspec==0.12.1
|
||||
# via black
|
||||
pcodedmp==1.2.6
|
||||
# via oletools
|
||||
peewee==3.17.5
|
||||
# via open-webui
|
||||
# via peewee-migrate
|
||||
@@ -437,27 +439,27 @@ pycparser==2.22
|
||||
pydantic==2.7.1
|
||||
# via chromadb
|
||||
# via fastapi
|
||||
# via fastapi-sso
|
||||
# via google-generativeai
|
||||
# via langchain
|
||||
# via langchain-core
|
||||
# via langfuse
|
||||
# via langsmith
|
||||
# via open-webui
|
||||
# via openai
|
||||
pydantic-core==2.18.2
|
||||
# via pydantic
|
||||
pydub==0.25.1
|
||||
# via open-webui
|
||||
pygments==2.18.0
|
||||
# via rich
|
||||
pyjwt==2.8.0
|
||||
# via litellm
|
||||
# via open-webui
|
||||
pymysql==1.1.0
|
||||
# via open-webui
|
||||
pypandoc==1.13
|
||||
# via open-webui
|
||||
pyparsing==3.1.2
|
||||
pyparsing==2.4.7
|
||||
# via httplib2
|
||||
# via oletools
|
||||
pypdf==4.2.0
|
||||
# via open-webui
|
||||
# via unstructured-client
|
||||
@@ -465,6 +467,8 @@ pypika==0.48.9
|
||||
# via chromadb
|
||||
pyproject-hooks==1.1.0
|
||||
# via build
|
||||
pyreqwest-impersonate==0.4.7
|
||||
# via duckduckgo-search
|
||||
python-dateutil==2.9.0.post0
|
||||
# via botocore
|
||||
# via kubernetes
|
||||
@@ -472,7 +476,6 @@ python-dateutil==2.9.0.post0
|
||||
# via posthog
|
||||
# via unstructured-client
|
||||
python-dotenv==1.0.1
|
||||
# via litellm
|
||||
# via uvicorn
|
||||
python-engineio==4.9.0
|
||||
# via python-socketio
|
||||
@@ -484,7 +487,6 @@ python-magic==0.4.27
|
||||
# via unstructured
|
||||
python-multipart==0.0.9
|
||||
# via fastapi
|
||||
# via litellm
|
||||
# via open-webui
|
||||
python-socketio==5.11.2
|
||||
# via open-webui
|
||||
@@ -503,7 +505,6 @@ pyyaml==6.0.1
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langchain-core
|
||||
# via litellm
|
||||
# via rapidocr-onnxruntime
|
||||
# via transformers
|
||||
# via uvicorn
|
||||
@@ -513,11 +514,10 @@ rapidfuzz==3.9.0
|
||||
# via unstructured
|
||||
rapidocr-onnxruntime==1.3.22
|
||||
# via open-webui
|
||||
redis==5.0.4
|
||||
# via rq
|
||||
red-black-tree-mod==1.20
|
||||
# via extract-msg
|
||||
regex==2024.5.10
|
||||
# via nltk
|
||||
# via tiktoken
|
||||
# via transformers
|
||||
requests==2.32.2
|
||||
# via chromadb
|
||||
@@ -527,11 +527,9 @@ requests==2.32.2
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langsmith
|
||||
# via litellm
|
||||
# via open-webui
|
||||
# via posthog
|
||||
# via requests-oauthlib
|
||||
# via tiktoken
|
||||
# via transformers
|
||||
# via unstructured
|
||||
# via unstructured-client
|
||||
@@ -540,11 +538,11 @@ requests-oauthlib==2.0.0
|
||||
# via kubernetes
|
||||
rich==13.7.1
|
||||
# via typer
|
||||
rq==1.16.2
|
||||
# via litellm
|
||||
rsa==4.9
|
||||
# via google-auth
|
||||
# via python-jose
|
||||
rtfde==0.1.1
|
||||
# via extract-msg
|
||||
s3transfer==0.10.1
|
||||
# via boto3
|
||||
safetensors==0.4.3
|
||||
@@ -577,7 +575,6 @@ six==1.16.0
|
||||
sniffio==1.3.1
|
||||
# via anyio
|
||||
# via httpx
|
||||
# via openai
|
||||
soupsieve==2.5
|
||||
# via beautifulsoup4
|
||||
sqlalchemy==2.0.30
|
||||
@@ -597,12 +594,9 @@ tenacity==8.3.0
|
||||
# via langchain-core
|
||||
threadpoolctl==3.5.0
|
||||
# via scikit-learn
|
||||
tiktoken==0.6.0
|
||||
# via litellm
|
||||
tokenizers==0.15.2
|
||||
# via chromadb
|
||||
# via faster-whisper
|
||||
# via litellm
|
||||
# via transformers
|
||||
torch==2.3.0
|
||||
# via sentence-transformers
|
||||
@@ -611,7 +605,6 @@ tqdm==4.66.4
|
||||
# via google-generativeai
|
||||
# via huggingface-hub
|
||||
# via nltk
|
||||
# via openai
|
||||
# via sentence-transformers
|
||||
# via transformers
|
||||
transformers==4.39.3
|
||||
@@ -624,7 +617,6 @@ typing-extensions==4.11.0
|
||||
# via fastapi
|
||||
# via google-generativeai
|
||||
# via huggingface-hub
|
||||
# via openai
|
||||
# via opentelemetry-sdk
|
||||
# via pydantic
|
||||
# via pydantic-core
|
||||
@@ -641,6 +633,7 @@ tzdata==2024.1
|
||||
# via pandas
|
||||
tzlocal==5.2
|
||||
# via apscheduler
|
||||
# via extract-msg
|
||||
ujson==5.10.0
|
||||
# via fastapi
|
||||
unstructured==0.14.0
|
||||
@@ -657,7 +650,6 @@ urllib3==2.2.1
|
||||
uvicorn==0.22.0
|
||||
# via chromadb
|
||||
# via fastapi
|
||||
# via litellm
|
||||
# via open-webui
|
||||
uvloop==0.19.0
|
||||
# via uvicorn
|
||||
|
||||
+40
-48
@@ -12,7 +12,6 @@
|
||||
aiohttp==3.9.5
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via litellm
|
||||
# via open-webui
|
||||
aiosignal==1.3.1
|
||||
# via aiohttp
|
||||
@@ -20,11 +19,9 @@ annotated-types==0.6.0
|
||||
# via pydantic
|
||||
anyio==4.3.0
|
||||
# via httpx
|
||||
# via openai
|
||||
# via starlette
|
||||
# via watchfiles
|
||||
apscheduler==3.10.4
|
||||
# via litellm
|
||||
# via open-webui
|
||||
argon2-cffi==23.1.0
|
||||
# via open-webui
|
||||
@@ -38,7 +35,6 @@ av==11.0.0
|
||||
# via faster-whisper
|
||||
backoff==2.2.1
|
||||
# via langfuse
|
||||
# via litellm
|
||||
# via posthog
|
||||
# via unstructured
|
||||
bcrypt==4.1.3
|
||||
@@ -46,6 +42,7 @@ bcrypt==4.1.3
|
||||
# via open-webui
|
||||
# via passlib
|
||||
beautifulsoup4==4.12.3
|
||||
# via extract-msg
|
||||
# via unstructured
|
||||
bidict==0.23.1
|
||||
# via python-socketio
|
||||
@@ -83,17 +80,20 @@ chromadb==0.5.0
|
||||
# via open-webui
|
||||
click==8.1.7
|
||||
# via black
|
||||
# via duckduckgo-search
|
||||
# via flask
|
||||
# via litellm
|
||||
# via nltk
|
||||
# via peewee-migrate
|
||||
# via rq
|
||||
# via typer
|
||||
# via uvicorn
|
||||
colorclass==2.2.2
|
||||
# via oletools
|
||||
coloredlogs==15.0.1
|
||||
# via onnxruntime
|
||||
compressed-rtf==1.0.6
|
||||
# via extract-msg
|
||||
cryptography==42.0.7
|
||||
# via litellm
|
||||
# via msoffcrypto-tool
|
||||
# via pyjwt
|
||||
ctranslate2==4.2.1
|
||||
# via faster-whisper
|
||||
@@ -109,33 +109,34 @@ defusedxml==0.7.1
|
||||
deprecated==1.2.14
|
||||
# via opentelemetry-api
|
||||
# via opentelemetry-exporter-otlp-proto-grpc
|
||||
distro==1.9.0
|
||||
# via openai
|
||||
dnspython==2.6.1
|
||||
# via email-validator
|
||||
docx2txt==0.8
|
||||
# via open-webui
|
||||
duckduckgo-search==6.1.5
|
||||
# via open-webui
|
||||
easygui==0.98.3
|
||||
# via oletools
|
||||
ebcdic==1.1.1
|
||||
# via extract-msg
|
||||
ecdsa==0.19.0
|
||||
# via python-jose
|
||||
email-validator==2.1.1
|
||||
# via fastapi
|
||||
# via pydantic
|
||||
emoji==2.11.1
|
||||
# via unstructured
|
||||
et-xmlfile==1.1.0
|
||||
# via openpyxl
|
||||
extract-msg==0.48.5
|
||||
# via open-webui
|
||||
fake-useragent==1.5.1
|
||||
# via open-webui
|
||||
fastapi==0.111.0
|
||||
# via chromadb
|
||||
# via fastapi-sso
|
||||
# via langchain-chroma
|
||||
# via litellm
|
||||
# via open-webui
|
||||
fastapi-cli==0.0.4
|
||||
# via fastapi
|
||||
fastapi-sso==0.10.0
|
||||
# via litellm
|
||||
faster-whisper==1.0.2
|
||||
# via open-webui
|
||||
filelock==3.14.0
|
||||
@@ -191,8 +192,6 @@ grpcio==1.63.0
|
||||
# via opentelemetry-exporter-otlp-proto-grpc
|
||||
grpcio-status==1.62.2
|
||||
# via google-api-core
|
||||
gunicorn==22.0.0
|
||||
# via litellm
|
||||
h11==0.14.0
|
||||
# via httpcore
|
||||
# via uvicorn
|
||||
@@ -206,9 +205,7 @@ httptools==0.6.1
|
||||
# via uvicorn
|
||||
httpx==0.27.0
|
||||
# via fastapi
|
||||
# via fastapi-sso
|
||||
# via langfuse
|
||||
# via openai
|
||||
huggingface-hub==0.23.0
|
||||
# via faster-whisper
|
||||
# via sentence-transformers
|
||||
@@ -225,7 +222,6 @@ idna==3.7
|
||||
# via unstructured-client
|
||||
# via yarl
|
||||
importlib-metadata==7.0.0
|
||||
# via litellm
|
||||
# via opentelemetry-api
|
||||
importlib-resources==6.4.0
|
||||
# via chromadb
|
||||
@@ -234,7 +230,6 @@ itsdangerous==2.2.0
|
||||
jinja2==3.1.4
|
||||
# via fastapi
|
||||
# via flask
|
||||
# via litellm
|
||||
# via torch
|
||||
jmespath==1.0.1
|
||||
# via boto3
|
||||
@@ -272,8 +267,8 @@ langsmith==0.1.57
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langchain-core
|
||||
litellm==1.37.20
|
||||
# via open-webui
|
||||
lark==1.1.8
|
||||
# via rtfde
|
||||
lxml==5.2.2
|
||||
# via unstructured
|
||||
markdown==3.6
|
||||
@@ -294,6 +289,8 @@ monotonic==1.6
|
||||
# via posthog
|
||||
mpmath==1.3.0
|
||||
# via sympy
|
||||
msoffcrypto-tool==5.4.1
|
||||
# via oletools
|
||||
multidict==6.0.5
|
||||
# via aiohttp
|
||||
# via yarl
|
||||
@@ -325,15 +322,19 @@ numpy==1.26.4
|
||||
# via transformers
|
||||
# via unstructured
|
||||
oauthlib==3.2.2
|
||||
# via fastapi-sso
|
||||
# via kubernetes
|
||||
# via requests-oauthlib
|
||||
olefile==0.47
|
||||
# via extract-msg
|
||||
# via msoffcrypto-tool
|
||||
# via oletools
|
||||
oletools==0.60.1
|
||||
# via pcodedmp
|
||||
# via rtfde
|
||||
onnxruntime==1.17.3
|
||||
# via chromadb
|
||||
# via faster-whisper
|
||||
# via rapidocr-onnxruntime
|
||||
openai==1.28.1
|
||||
# via litellm
|
||||
opencv-python==4.9.0.80
|
||||
# via rapidocr-onnxruntime
|
||||
opencv-python-headless==4.9.0.80
|
||||
@@ -375,15 +376,14 @@ ordered-set==4.1.0
|
||||
# via deepdiff
|
||||
orjson==3.10.3
|
||||
# via chromadb
|
||||
# via duckduckgo-search
|
||||
# via fastapi
|
||||
# via langsmith
|
||||
# via litellm
|
||||
overrides==7.7.0
|
||||
# via chromadb
|
||||
packaging==23.2
|
||||
# via black
|
||||
# via build
|
||||
# via gunicorn
|
||||
# via huggingface-hub
|
||||
# via langchain-core
|
||||
# via langfuse
|
||||
@@ -397,6 +397,8 @@ passlib==1.7.4
|
||||
# via open-webui
|
||||
pathspec==0.12.1
|
||||
# via black
|
||||
pcodedmp==1.2.6
|
||||
# via oletools
|
||||
peewee==3.17.5
|
||||
# via open-webui
|
||||
# via peewee-migrate
|
||||
@@ -437,27 +439,27 @@ pycparser==2.22
|
||||
pydantic==2.7.1
|
||||
# via chromadb
|
||||
# via fastapi
|
||||
# via fastapi-sso
|
||||
# via google-generativeai
|
||||
# via langchain
|
||||
# via langchain-core
|
||||
# via langfuse
|
||||
# via langsmith
|
||||
# via open-webui
|
||||
# via openai
|
||||
pydantic-core==2.18.2
|
||||
# via pydantic
|
||||
pydub==0.25.1
|
||||
# via open-webui
|
||||
pygments==2.18.0
|
||||
# via rich
|
||||
pyjwt==2.8.0
|
||||
# via litellm
|
||||
# via open-webui
|
||||
pymysql==1.1.0
|
||||
# via open-webui
|
||||
pypandoc==1.13
|
||||
# via open-webui
|
||||
pyparsing==3.1.2
|
||||
pyparsing==2.4.7
|
||||
# via httplib2
|
||||
# via oletools
|
||||
pypdf==4.2.0
|
||||
# via open-webui
|
||||
# via unstructured-client
|
||||
@@ -465,6 +467,8 @@ pypika==0.48.9
|
||||
# via chromadb
|
||||
pyproject-hooks==1.1.0
|
||||
# via build
|
||||
pyreqwest-impersonate==0.4.7
|
||||
# via duckduckgo-search
|
||||
python-dateutil==2.9.0.post0
|
||||
# via botocore
|
||||
# via kubernetes
|
||||
@@ -472,7 +476,6 @@ python-dateutil==2.9.0.post0
|
||||
# via posthog
|
||||
# via unstructured-client
|
||||
python-dotenv==1.0.1
|
||||
# via litellm
|
||||
# via uvicorn
|
||||
python-engineio==4.9.0
|
||||
# via python-socketio
|
||||
@@ -484,7 +487,6 @@ python-magic==0.4.27
|
||||
# via unstructured
|
||||
python-multipart==0.0.9
|
||||
# via fastapi
|
||||
# via litellm
|
||||
# via open-webui
|
||||
python-socketio==5.11.2
|
||||
# via open-webui
|
||||
@@ -503,7 +505,6 @@ pyyaml==6.0.1
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langchain-core
|
||||
# via litellm
|
||||
# via rapidocr-onnxruntime
|
||||
# via transformers
|
||||
# via uvicorn
|
||||
@@ -513,11 +514,10 @@ rapidfuzz==3.9.0
|
||||
# via unstructured
|
||||
rapidocr-onnxruntime==1.3.22
|
||||
# via open-webui
|
||||
redis==5.0.4
|
||||
# via rq
|
||||
red-black-tree-mod==1.20
|
||||
# via extract-msg
|
||||
regex==2024.5.10
|
||||
# via nltk
|
||||
# via tiktoken
|
||||
# via transformers
|
||||
requests==2.32.2
|
||||
# via chromadb
|
||||
@@ -527,11 +527,9 @@ requests==2.32.2
|
||||
# via langchain
|
||||
# via langchain-community
|
||||
# via langsmith
|
||||
# via litellm
|
||||
# via open-webui
|
||||
# via posthog
|
||||
# via requests-oauthlib
|
||||
# via tiktoken
|
||||
# via transformers
|
||||
# via unstructured
|
||||
# via unstructured-client
|
||||
@@ -540,11 +538,11 @@ requests-oauthlib==2.0.0
|
||||
# via kubernetes
|
||||
rich==13.7.1
|
||||
# via typer
|
||||
rq==1.16.2
|
||||
# via litellm
|
||||
rsa==4.9
|
||||
# via google-auth
|
||||
# via python-jose
|
||||
rtfde==0.1.1
|
||||
# via extract-msg
|
||||
s3transfer==0.10.1
|
||||
# via boto3
|
||||
safetensors==0.4.3
|
||||
@@ -577,7 +575,6 @@ six==1.16.0
|
||||
sniffio==1.3.1
|
||||
# via anyio
|
||||
# via httpx
|
||||
# via openai
|
||||
soupsieve==2.5
|
||||
# via beautifulsoup4
|
||||
sqlalchemy==2.0.30
|
||||
@@ -597,12 +594,9 @@ tenacity==8.3.0
|
||||
# via langchain-core
|
||||
threadpoolctl==3.5.0
|
||||
# via scikit-learn
|
||||
tiktoken==0.6.0
|
||||
# via litellm
|
||||
tokenizers==0.15.2
|
||||
# via chromadb
|
||||
# via faster-whisper
|
||||
# via litellm
|
||||
# via transformers
|
||||
torch==2.3.0
|
||||
# via sentence-transformers
|
||||
@@ -611,7 +605,6 @@ tqdm==4.66.4
|
||||
# via google-generativeai
|
||||
# via huggingface-hub
|
||||
# via nltk
|
||||
# via openai
|
||||
# via sentence-transformers
|
||||
# via transformers
|
||||
transformers==4.39.3
|
||||
@@ -624,7 +617,6 @@ typing-extensions==4.11.0
|
||||
# via fastapi
|
||||
# via google-generativeai
|
||||
# via huggingface-hub
|
||||
# via openai
|
||||
# via opentelemetry-sdk
|
||||
# via pydantic
|
||||
# via pydantic-core
|
||||
@@ -641,6 +633,7 @@ tzdata==2024.1
|
||||
# via pandas
|
||||
tzlocal==5.2
|
||||
# via apscheduler
|
||||
# via extract-msg
|
||||
ujson==5.10.0
|
||||
# via fastapi
|
||||
unstructured==0.14.0
|
||||
@@ -657,7 +650,6 @@ urllib3==2.2.1
|
||||
uvicorn==0.22.0
|
||||
# via chromadb
|
||||
# via fastapi
|
||||
# via litellm
|
||||
# via open-webui
|
||||
uvloop==0.19.0
|
||||
# via uvicorn
|
||||
|
||||
+21
@@ -92,10 +92,18 @@ select {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.scrollbar-hidden::-webkit-scrollbar-corner {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.scrollbar-none::-webkit-scrollbar {
|
||||
display: none; /* for Chrome, Safari and Opera */
|
||||
}
|
||||
|
||||
.scrollbar-none::-webkit-scrollbar-corner {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.scrollbar-none {
|
||||
-ms-overflow-style: none; /* IE and Edge */
|
||||
scrollbar-width: none; /* Firefox */
|
||||
@@ -111,3 +119,16 @@ input::-webkit-inner-spin-button {
|
||||
input[type='number'] {
|
||||
-moz-appearance: textfield; /* Firefox */
|
||||
}
|
||||
|
||||
.cm-editor {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.cm-scroller {
|
||||
@apply scrollbar-hidden;
|
||||
}
|
||||
|
||||
.cm-editor.cm-focused {
|
||||
outline: none;
|
||||
}
|
||||
|
||||
+106
-2
@@ -32,6 +32,9 @@
|
||||
} else if (localStorage.theme && localStorage.theme === 'system') {
|
||||
systemTheme = window.matchMedia('(prefers-color-scheme: dark)').matches;
|
||||
document.documentElement.classList.add(systemTheme ? 'dark' : 'light');
|
||||
} else if (localStorage.theme && localStorage.theme === 'her') {
|
||||
document.documentElement.classList.add('dark');
|
||||
document.documentElement.classList.add('her');
|
||||
} else {
|
||||
document.documentElement.classList.add('dark');
|
||||
}
|
||||
@@ -68,17 +71,66 @@
|
||||
</style>
|
||||
|
||||
<img
|
||||
id="logo"
|
||||
style="
|
||||
position: absolute;
|
||||
width: 6rem;
|
||||
height: 6rem;
|
||||
top: 46%;
|
||||
top: 41%;
|
||||
left: 50%;
|
||||
margin: -40px 0 0 -40px;
|
||||
margin-left: -3rem;
|
||||
"
|
||||
src="/logo.svg"
|
||||
/>
|
||||
|
||||
<div
|
||||
style="
|
||||
position: absolute;
|
||||
top: 33%;
|
||||
left: 50%;
|
||||
|
||||
width: 24rem;
|
||||
margin-left: -12rem;
|
||||
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
"
|
||||
>
|
||||
<img
|
||||
id="logo-her"
|
||||
style="width: 13rem; height: 13rem"
|
||||
src="/logo.svg"
|
||||
class="animate-pulse-fast"
|
||||
/>
|
||||
|
||||
<div style="position: relative; width: 24rem; margin-top: 0.5rem">
|
||||
<div
|
||||
id="progress-background"
|
||||
style="
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 0.75rem;
|
||||
|
||||
border-radius: 9999px;
|
||||
background-color: #fafafa9a;
|
||||
"
|
||||
></div>
|
||||
|
||||
<div
|
||||
id="progress-bar"
|
||||
style="
|
||||
position: absolute;
|
||||
width: 0%;
|
||||
height: 0.75rem;
|
||||
border-radius: 9999px;
|
||||
background-color: #fff;
|
||||
"
|
||||
class="bg-white"
|
||||
></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <span style="position: absolute; bottom: 32px; left: 50%; margin: -36px 0 0 -36px">
|
||||
Footer content
|
||||
</span> -->
|
||||
@@ -101,4 +153,56 @@
|
||||
html.dark #splash-screen img {
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
html.her #splash-screen {
|
||||
background: #983724;
|
||||
}
|
||||
|
||||
#logo-her {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#progress-background {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#progress-bar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
html.her #logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
html.her #logo-her {
|
||||
display: block;
|
||||
filter: invert(1);
|
||||
}
|
||||
|
||||
html.her #progress-background {
|
||||
display: block;
|
||||
}
|
||||
|
||||
html.her #progress-bar {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@media (max-width: 24rem) {
|
||||
html.her #progress-background {
|
||||
display: none;
|
||||
}
|
||||
|
||||
html.her #progress-bar {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
50% {
|
||||
opacity: 0.65;
|
||||
}
|
||||
}
|
||||
.animate-pulse-fast {
|
||||
animation: pulse 1.5s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -0,0 +1,193 @@
|
||||
import { WEBUI_API_BASE_URL } from '$lib/constants';
|
||||
|
||||
export const createNewTool = async (token: string, tool: object) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/create`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
authorization: `Bearer ${token}`
|
||||
},
|
||||
body: JSON.stringify({
|
||||
...tool
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
error = err.detail;
|
||||
console.log(err);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const getTools = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
authorization: `Bearer ${token}`
|
||||
}
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.then((json) => {
|
||||
return json;
|
||||
})
|
||||
.catch((err) => {
|
||||
error = err.detail;
|
||||
console.log(err);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const exportTools = async (token: string = '') => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/export`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
authorization: `Bearer ${token}`
|
||||
}
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.then((json) => {
|
||||
return json;
|
||||
})
|
||||
.catch((err) => {
|
||||
error = err.detail;
|
||||
console.log(err);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const getToolById = async (token: string, id: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/id/${id}`, {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
authorization: `Bearer ${token}`
|
||||
}
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.then((json) => {
|
||||
return json;
|
||||
})
|
||||
.catch((err) => {
|
||||
error = err.detail;
|
||||
|
||||
console.log(err);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const updateToolById = async (token: string, id: string, tool: object) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/id/${id}/update`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
authorization: `Bearer ${token}`
|
||||
},
|
||||
body: JSON.stringify({
|
||||
...tool
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.then((json) => {
|
||||
return json;
|
||||
})
|
||||
.catch((err) => {
|
||||
error = err.detail;
|
||||
|
||||
console.log(err);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const deleteToolById = async (token: string, id: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/tools/id/${id}/delete`, {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
Accept: 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
authorization: `Bearer ${token}`
|
||||
}
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.then((json) => {
|
||||
return json;
|
||||
})
|
||||
.catch((err) => {
|
||||
error = err.detail;
|
||||
|
||||
console.log(err);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
@@ -22,6 +22,39 @@ export const getGravatarUrl = async (email: string) => {
|
||||
return res;
|
||||
};
|
||||
|
||||
export const formatPythonCode = async (code: string) => {
|
||||
let error = null;
|
||||
|
||||
const res = await fetch(`${WEBUI_API_BASE_URL}/utils/code/format`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({
|
||||
code: code
|
||||
})
|
||||
})
|
||||
.then(async (res) => {
|
||||
if (!res.ok) throw await res.json();
|
||||
return res.json();
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
|
||||
error = err;
|
||||
if (err.detail) {
|
||||
error = err.detail;
|
||||
}
|
||||
return null;
|
||||
});
|
||||
|
||||
if (error) {
|
||||
throw error;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
export const downloadChatAsPDF = async (chat: object) => {
|
||||
let error = null;
|
||||
|
||||
|
||||
@@ -166,6 +166,8 @@
|
||||
chunk_size: chunkSize
|
||||
}
|
||||
});
|
||||
|
||||
await updateQuerySettings(localStorage.token, querySettings);
|
||||
};
|
||||
|
||||
const setEmbeddingConfig = async () => {
|
||||
|
||||
@@ -11,7 +11,15 @@
|
||||
export let saveHandler: Function;
|
||||
|
||||
let webConfig = null;
|
||||
let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper'];
|
||||
let webSearchEngines = [
|
||||
'searxng',
|
||||
'google_pse',
|
||||
'brave',
|
||||
'serpstack',
|
||||
'serper',
|
||||
'serply',
|
||||
'duckduckgo'
|
||||
];
|
||||
|
||||
let youtubeLanguage = 'en';
|
||||
let youtubeTranslation = null;
|
||||
@@ -188,6 +196,24 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{:else if webConfig.search.engine === 'serply'}
|
||||
<div>
|
||||
<div class=" self-center text-xs font-medium mb-1">
|
||||
{$i18n.t('Serply API Key')}
|
||||
</div>
|
||||
|
||||
<div class="flex w-full">
|
||||
<div class="flex-1">
|
||||
<input
|
||||
class="w-full rounded-lg py-2 px-4 text-sm dark:text-gray-300 dark:bg-gray-850 outline-none"
|
||||
type="text"
|
||||
placeholder={$i18n.t('Enter Serply API Key')}
|
||||
bind:value={webConfig.search.serply_api_key}
|
||||
autocomplete="off"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -24,7 +24,8 @@
|
||||
banners,
|
||||
user,
|
||||
socket,
|
||||
showCallOverlay
|
||||
showCallOverlay,
|
||||
tools
|
||||
} from '$lib/stores';
|
||||
import {
|
||||
convertMessagesToHistory,
|
||||
@@ -73,6 +74,10 @@
|
||||
let selectedModels = [''];
|
||||
let atSelectedModel: Model | undefined;
|
||||
|
||||
let selectedModelIds = [];
|
||||
$: selectedModelIds = atSelectedModel !== undefined ? [atSelectedModel.id] : selectedModels;
|
||||
|
||||
let selectedToolIds = [];
|
||||
let webSearchEnabled = false;
|
||||
|
||||
let chat = null;
|
||||
@@ -327,6 +332,9 @@
|
||||
chatTextAreaElement.style.height = '';
|
||||
}
|
||||
|
||||
const _files = JSON.parse(JSON.stringify(files));
|
||||
files = [];
|
||||
|
||||
prompt = '';
|
||||
|
||||
// Create user message
|
||||
@@ -338,7 +346,7 @@
|
||||
role: 'user',
|
||||
user: _user ?? undefined,
|
||||
content: userPrompt,
|
||||
files: files.length > 0 ? files : undefined,
|
||||
files: _files.length > 0 ? _files : undefined,
|
||||
timestamp: Math.floor(Date.now() / 1000), // Unix epoch
|
||||
models: selectedModels.filter((m, mIdx) => selectedModels.indexOf(m) === mIdx)
|
||||
};
|
||||
@@ -355,32 +363,6 @@
|
||||
// Wait until history/message have been updated
|
||||
await tick();
|
||||
|
||||
// Create new chat if only one message in messages
|
||||
if (messages.length == 1) {
|
||||
if ($settings.saveChatHistory ?? true) {
|
||||
chat = await createNewChat(localStorage.token, {
|
||||
id: $chatId,
|
||||
title: $i18n.t('New Chat'),
|
||||
models: selectedModels,
|
||||
system: $settings.system ?? undefined,
|
||||
options: {
|
||||
...($settings.params ?? {})
|
||||
},
|
||||
messages: messages,
|
||||
history: history,
|
||||
tags: [],
|
||||
timestamp: Date.now()
|
||||
});
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
await chatId.set(chat.id);
|
||||
} else {
|
||||
await chatId.set('local');
|
||||
}
|
||||
await tick();
|
||||
}
|
||||
|
||||
files = [];
|
||||
|
||||
// Send prompt
|
||||
_responses = await sendPrompt(userPrompt, userMessageId);
|
||||
}
|
||||
@@ -388,17 +370,80 @@
|
||||
return _responses;
|
||||
};
|
||||
|
||||
const sendPrompt = async (prompt, parentId, modelId = null) => {
|
||||
const sendPrompt = async (prompt, parentId, modelId = null, newChat = true) => {
|
||||
let _responses = [];
|
||||
|
||||
// If modelId is provided, use it, else use selected model
|
||||
let selectedModelIds = modelId
|
||||
? [modelId]
|
||||
: atSelectedModel !== undefined
|
||||
? [atSelectedModel.id]
|
||||
: selectedModels;
|
||||
|
||||
// Create response messages for each selected model
|
||||
const responseMessageIds = {};
|
||||
for (const modelId of selectedModelIds) {
|
||||
const model = $models.filter((m) => m.id === modelId).at(0);
|
||||
|
||||
if (model) {
|
||||
let responseMessageId = uuidv4();
|
||||
let responseMessage = {
|
||||
parentId: parentId,
|
||||
id: responseMessageId,
|
||||
childrenIds: [],
|
||||
role: 'assistant',
|
||||
content: '',
|
||||
model: model.id,
|
||||
modelName: model.name ?? model.id,
|
||||
userContext: null,
|
||||
timestamp: Math.floor(Date.now() / 1000) // Unix epoch
|
||||
};
|
||||
|
||||
// Add message to history and Set currentId to messageId
|
||||
history.messages[responseMessageId] = responseMessage;
|
||||
history.currentId = responseMessageId;
|
||||
|
||||
// Append messageId to childrenIds of parent message
|
||||
if (parentId !== null) {
|
||||
history.messages[parentId].childrenIds = [
|
||||
...history.messages[parentId].childrenIds,
|
||||
responseMessageId
|
||||
];
|
||||
}
|
||||
|
||||
responseMessageIds[modelId] = responseMessageId;
|
||||
}
|
||||
}
|
||||
await tick();
|
||||
|
||||
// Create new chat if only one message in messages
|
||||
if (newChat && messages.length == 2) {
|
||||
if ($settings.saveChatHistory ?? true) {
|
||||
chat = await createNewChat(localStorage.token, {
|
||||
id: $chatId,
|
||||
title: $i18n.t('New Chat'),
|
||||
models: selectedModels,
|
||||
system: $settings.system ?? undefined,
|
||||
options: {
|
||||
...($settings.params ?? {})
|
||||
},
|
||||
messages: messages,
|
||||
history: history,
|
||||
tags: [],
|
||||
timestamp: Date.now()
|
||||
});
|
||||
await chats.set(await getChatList(localStorage.token));
|
||||
await chatId.set(chat.id);
|
||||
} else {
|
||||
await chatId.set('local');
|
||||
}
|
||||
await tick();
|
||||
}
|
||||
|
||||
const _chatId = JSON.parse(JSON.stringify($chatId));
|
||||
|
||||
await Promise.all(
|
||||
(modelId
|
||||
? [modelId]
|
||||
: atSelectedModel !== undefined
|
||||
? [atSelectedModel.id]
|
||||
: selectedModels
|
||||
).map(async (modelId) => {
|
||||
selectedModelIds.map(async (modelId) => {
|
||||
console.log('modelId', modelId);
|
||||
const model = $models.filter((m) => m.id === modelId).at(0);
|
||||
|
||||
@@ -416,33 +461,8 @@
|
||||
);
|
||||
}
|
||||
|
||||
// Create response message
|
||||
let responseMessageId = uuidv4();
|
||||
let responseMessage = {
|
||||
parentId: parentId,
|
||||
id: responseMessageId,
|
||||
childrenIds: [],
|
||||
role: 'assistant',
|
||||
content: '',
|
||||
model: model.id,
|
||||
modelName: model.name ?? model.id,
|
||||
userContext: null,
|
||||
timestamp: Math.floor(Date.now() / 1000) // Unix epoch
|
||||
};
|
||||
|
||||
// Add message to history and Set currentId to messageId
|
||||
history.messages[responseMessageId] = responseMessage;
|
||||
history.currentId = responseMessageId;
|
||||
|
||||
// Append messageId to childrenIds of parent message
|
||||
if (parentId !== null) {
|
||||
history.messages[parentId].childrenIds = [
|
||||
...history.messages[parentId].childrenIds,
|
||||
responseMessageId
|
||||
];
|
||||
}
|
||||
|
||||
await tick();
|
||||
let responseMessageId = responseMessageIds[modelId];
|
||||
let responseMessage = history.messages[responseMessageId];
|
||||
|
||||
let userContext = null;
|
||||
if ($settings?.memory ?? false) {
|
||||
@@ -451,7 +471,6 @@
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
if (res.documents[0].length > 0) {
|
||||
userContext = res.documents.reduce((acc, doc, index) => {
|
||||
@@ -477,7 +496,6 @@
|
||||
}
|
||||
|
||||
let _response = null;
|
||||
|
||||
if (model?.owned_by === 'openai') {
|
||||
_response = await sendPromptOpenAI(model, prompt, responseMessageId, _chatId);
|
||||
} else if (model) {
|
||||
@@ -502,11 +520,13 @@
|
||||
const getWebSearchResults = async (model: string, parentId: string, responseId: string) => {
|
||||
const responseMessage = history.messages[responseId];
|
||||
|
||||
responseMessage.status = {
|
||||
done: false,
|
||||
action: 'web_search',
|
||||
description: $i18n.t('Generating search query')
|
||||
};
|
||||
responseMessage.statusHistory = [
|
||||
{
|
||||
done: false,
|
||||
action: 'web_search',
|
||||
description: $i18n.t('Generating search query')
|
||||
}
|
||||
];
|
||||
messages = messages;
|
||||
|
||||
const prompt = history.messages[parentId].content;
|
||||
@@ -519,19 +539,21 @@
|
||||
|
||||
if (!searchQuery) {
|
||||
toast.warning($i18n.t('No search query generated'));
|
||||
responseMessage.status = {
|
||||
...responseMessage.status,
|
||||
responseMessage.statusHistory.push({
|
||||
done: true,
|
||||
error: true,
|
||||
action: 'web_search',
|
||||
description: 'No search query generated'
|
||||
};
|
||||
});
|
||||
|
||||
messages = messages;
|
||||
}
|
||||
|
||||
responseMessage.status = {
|
||||
...responseMessage.status,
|
||||
description: $i18n.t("Searching the web for '{{searchQuery}}'", { searchQuery })
|
||||
};
|
||||
responseMessage.statusHistory.push({
|
||||
done: false,
|
||||
action: 'web_search',
|
||||
description: $i18n.t(`Searching "{{searchQuery}}"`, { searchQuery })
|
||||
});
|
||||
messages = messages;
|
||||
|
||||
const results = await runWebSearch(localStorage.token, searchQuery).catch((error) => {
|
||||
@@ -542,12 +564,13 @@
|
||||
});
|
||||
|
||||
if (results) {
|
||||
responseMessage.status = {
|
||||
...responseMessage.status,
|
||||
responseMessage.statusHistory.push({
|
||||
done: true,
|
||||
action: 'web_search',
|
||||
description: $i18n.t('Searched {{count}} sites', { count: results.filenames.length }),
|
||||
query: searchQuery,
|
||||
urls: results.filenames
|
||||
};
|
||||
});
|
||||
|
||||
if (responseMessage?.files ?? undefined === undefined) {
|
||||
responseMessage.files = [];
|
||||
@@ -562,12 +585,12 @@
|
||||
|
||||
messages = messages;
|
||||
} else {
|
||||
responseMessage.status = {
|
||||
...responseMessage.status,
|
||||
responseMessage.statusHistory.push({
|
||||
done: true,
|
||||
error: true,
|
||||
action: 'web_search',
|
||||
description: 'No search results found'
|
||||
};
|
||||
});
|
||||
messages = messages;
|
||||
}
|
||||
};
|
||||
@@ -669,6 +692,7 @@
|
||||
},
|
||||
format: $settings.requestFormat ?? undefined,
|
||||
keep_alive: $settings.keepAlive ?? undefined,
|
||||
tool_ids: selectedToolIds.length > 0 ? selectedToolIds : undefined,
|
||||
docs: docs.length > 0 ? docs : undefined,
|
||||
citations: docs.length > 0,
|
||||
chat_id: $chatId
|
||||
@@ -930,6 +954,7 @@
|
||||
top_p: $settings?.params?.top_p ?? undefined,
|
||||
frequency_penalty: $settings?.params?.frequency_penalty ?? undefined,
|
||||
max_tokens: $settings?.params?.max_tokens ?? undefined,
|
||||
tool_ids: selectedToolIds.length > 0 ? selectedToolIds : undefined,
|
||||
docs: docs.length > 0 ? docs : undefined,
|
||||
citations: docs.length > 0,
|
||||
chat_id: $chatId
|
||||
@@ -1098,9 +1123,9 @@
|
||||
let userPrompt = userMessage.content;
|
||||
|
||||
if ((userMessage?.models ?? [...selectedModels]).length == 1) {
|
||||
await sendPrompt(userPrompt, userMessage.id);
|
||||
await sendPrompt(userPrompt, userMessage.id, undefined, false);
|
||||
} else {
|
||||
await sendPrompt(userPrompt, userMessage.id, message.model);
|
||||
await sendPrompt(userPrompt, userMessage.id, message.model, false);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -1256,8 +1281,16 @@
|
||||
bind:files
|
||||
bind:prompt
|
||||
bind:autoScroll
|
||||
bind:selectedToolIds
|
||||
bind:webSearchEnabled
|
||||
bind:atSelectedModel
|
||||
availableToolIds={selectedModelIds.reduce((a, e, i, arr) => {
|
||||
const model = $models.find((m) => m.id === e);
|
||||
if (model?.info?.meta?.toolIds ?? false) {
|
||||
return [...new Set([...a, ...model.info.meta.toolIds])];
|
||||
}
|
||||
return a;
|
||||
}, [])}
|
||||
{selectedModels}
|
||||
{messages}
|
||||
{submitPrompt}
|
||||
|
||||
@@ -8,7 +8,9 @@
|
||||
showSidebar,
|
||||
models,
|
||||
config,
|
||||
showCallOverlay
|
||||
showCallOverlay,
|
||||
tools,
|
||||
user as _user
|
||||
} from '$lib/stores';
|
||||
import { blobToFile, calculateSHA256, findWordIndices } from '$lib/utils';
|
||||
|
||||
@@ -29,6 +31,7 @@
|
||||
import InputMenu from './MessageInput/InputMenu.svelte';
|
||||
import Headphone from '../icons/Headphone.svelte';
|
||||
import VoiceRecording from './MessageInput/VoiceRecording.svelte';
|
||||
import { transcribeAudio } from '$lib/apis/audio';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -57,6 +60,8 @@
|
||||
|
||||
export let files = [];
|
||||
|
||||
export let availableToolIds = [];
|
||||
export let selectedToolIds = [];
|
||||
export let webSearchEnabled = false;
|
||||
|
||||
export let prompt = '';
|
||||
@@ -652,6 +657,17 @@
|
||||
<div class=" ml-0.5 self-end mb-1.5 flex space-x-1">
|
||||
<InputMenu
|
||||
bind:webSearchEnabled
|
||||
bind:selectedToolIds
|
||||
tools={$tools.reduce((a, e, i, arr) => {
|
||||
if (availableToolIds.includes(e.id) || ($_user?.role ?? 'user') === 'admin') {
|
||||
a[e.id] = {
|
||||
name: e.name,
|
||||
description: e.meta.description,
|
||||
enabled: false
|
||||
};
|
||||
}
|
||||
return a;
|
||||
}, {})}
|
||||
uploadFilesHandler={() => {
|
||||
filesInputElement.click();
|
||||
}}
|
||||
|
||||
@@ -205,7 +205,7 @@
|
||||
|
||||
if (_responses.at(0)) {
|
||||
const content = _responses[0];
|
||||
if (content) {
|
||||
if ((content ?? '').trim() !== '') {
|
||||
assistantSpeakingHandler(content);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,24 +4,33 @@
|
||||
import { getContext } from 'svelte';
|
||||
|
||||
import Dropdown from '$lib/components/common/Dropdown.svelte';
|
||||
import GarbageBin from '$lib/components/icons/GarbageBin.svelte';
|
||||
import Pencil from '$lib/components/icons/Pencil.svelte';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import Tags from '$lib/components/chat/Tags.svelte';
|
||||
import Share from '$lib/components/icons/Share.svelte';
|
||||
import ArchiveBox from '$lib/components/icons/ArchiveBox.svelte';
|
||||
import DocumentArrowUpSolid from '$lib/components/icons/DocumentArrowUpSolid.svelte';
|
||||
import Switch from '$lib/components/common/Switch.svelte';
|
||||
import GlobeAltSolid from '$lib/components/icons/GlobeAltSolid.svelte';
|
||||
import { config } from '$lib/stores';
|
||||
import WrenchSolid from '$lib/components/icons/WrenchSolid.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let uploadFilesHandler: Function;
|
||||
|
||||
export let selectedToolIds: string[] = [];
|
||||
export let webSearchEnabled: boolean;
|
||||
|
||||
export let tools = {};
|
||||
export let onClose: Function;
|
||||
|
||||
$: tools = Object.fromEntries(
|
||||
Object.keys(tools).map((toolId) => [
|
||||
toolId,
|
||||
{
|
||||
...tools[toolId],
|
||||
enabled: selectedToolIds.includes(toolId)
|
||||
}
|
||||
])
|
||||
);
|
||||
|
||||
let show = false;
|
||||
</script>
|
||||
|
||||
@@ -39,20 +48,48 @@
|
||||
|
||||
<div slot="content">
|
||||
<DropdownMenu.Content
|
||||
class="w-full max-w-[190px] rounded-xl px-1 py-1 border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow"
|
||||
class="w-full max-w-[200px] rounded-xl px-1 py-1 border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow"
|
||||
sideOffset={15}
|
||||
alignOffset={-8}
|
||||
side="top"
|
||||
align="start"
|
||||
transition={flyAndScale}
|
||||
>
|
||||
{#if Object.keys(tools).length > 0}
|
||||
<div class=" max-h-28 overflow-y-auto scrollbar-hidden">
|
||||
{#each Object.keys(tools) as toolId}
|
||||
<div
|
||||
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer rounded-xl"
|
||||
>
|
||||
<div class="flex-1 flex items-center gap-2">
|
||||
<WrenchSolid />
|
||||
<Tooltip content={tools[toolId]?.description ?? ''} className="flex-1">
|
||||
<div class=" line-clamp-1">{tools[toolId].name}</div>
|
||||
</Tooltip>
|
||||
</div>
|
||||
|
||||
<Switch
|
||||
bind:state={tools[toolId].enabled}
|
||||
on:change={(e) => {
|
||||
selectedToolIds = e.detail
|
||||
? [...selectedToolIds, toolId]
|
||||
: selectedToolIds.filter((id) => id !== toolId);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<hr class="border-gray-100 dark:border-gray-800 my-1" />
|
||||
{/if}
|
||||
|
||||
{#if $config?.features?.enable_web_search}
|
||||
<div
|
||||
class="flex gap-2 items-center px-3 py-2 text-sm font-medium cursor-pointer rounded-xl"
|
||||
>
|
||||
<div class="flex-1 flex items-center gap-2">
|
||||
<GlobeAltSolid />
|
||||
<div class="flex items-center">{$i18n.t('Web Search')}</div>
|
||||
<div class=" line-clamp-1">{$i18n.t('Web Search')}</div>
|
||||
</div>
|
||||
|
||||
<Switch bind:state={webSearchEnabled} />
|
||||
@@ -68,7 +105,7 @@
|
||||
}}
|
||||
>
|
||||
<DocumentArrowUpSolid />
|
||||
<div class="flex items-center">{$i18n.t('Upload Files')}</div>
|
||||
<div class=" line-clamp-1">{$i18n.t('Upload Files')}</div>
|
||||
</DropdownMenu.Item>
|
||||
</DropdownMenu.Content>
|
||||
</div>
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
history.currentId = userMessageId;
|
||||
|
||||
await tick();
|
||||
await sendPrompt(userPrompt, userMessageId);
|
||||
await sendPrompt(userPrompt, userMessageId, undefined, false);
|
||||
};
|
||||
|
||||
const updateChatMessages = async () => {
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
</script>
|
||||
|
||||
{#key mounted}
|
||||
<div class="m-auto w-full max-w-6xl px-8 lg:px-24 pb-16">
|
||||
<div class="m-auto w-full max-w-6xl px-8 lg:px-24 pb-10">
|
||||
<div class="flex justify-start">
|
||||
<div class="flex -space-x-4 mb-1" in:fade={{ duration: 200 }}>
|
||||
{#each models as model, modelIdx}
|
||||
@@ -85,7 +85,7 @@
|
||||
</div>
|
||||
{/if}
|
||||
{:else}
|
||||
<div class=" font-medium text-gray-400 dark:text-gray-500">
|
||||
<div class=" font-medium text-gray-400 dark:text-gray-500 line-clamp-1">
|
||||
{$i18n.t('How can I help you today?')}
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
@@ -46,8 +46,8 @@
|
||||
}
|
||||
|
||||
onMount(() => {
|
||||
selectedReason = message.annotation.reason;
|
||||
comment = message.annotation.comment;
|
||||
selectedReason = message?.annotation?.reason ?? '';
|
||||
comment = message?.annotation?.comment ?? '';
|
||||
loadReasons();
|
||||
});
|
||||
|
||||
|
||||
@@ -211,93 +211,98 @@
|
||||
speaking = null;
|
||||
speakingIdx = null;
|
||||
} else {
|
||||
speaking = true;
|
||||
if ((message?.content ?? '').trim() !== '') {
|
||||
speaking = true;
|
||||
|
||||
if ($config.audio.tts.engine === 'openai') {
|
||||
loadingSpeech = true;
|
||||
if ($config.audio.tts.engine === 'openai') {
|
||||
loadingSpeech = true;
|
||||
|
||||
const sentences = extractSentences(message.content).reduce((mergedTexts, currentText) => {
|
||||
const lastIndex = mergedTexts.length - 1;
|
||||
if (lastIndex >= 0) {
|
||||
const previousText = mergedTexts[lastIndex];
|
||||
const wordCount = previousText.split(/\s+/).length;
|
||||
if (wordCount < 2) {
|
||||
mergedTexts[lastIndex] = previousText + ' ' + currentText;
|
||||
const sentences = extractSentences(message.content).reduce((mergedTexts, currentText) => {
|
||||
const lastIndex = mergedTexts.length - 1;
|
||||
if (lastIndex >= 0) {
|
||||
const previousText = mergedTexts[lastIndex];
|
||||
const wordCount = previousText.split(/\s+/).length;
|
||||
if (wordCount < 2) {
|
||||
mergedTexts[lastIndex] = previousText + ' ' + currentText;
|
||||
} else {
|
||||
mergedTexts.push(currentText);
|
||||
}
|
||||
} else {
|
||||
mergedTexts.push(currentText);
|
||||
}
|
||||
} else {
|
||||
mergedTexts.push(currentText);
|
||||
return mergedTexts;
|
||||
}, []);
|
||||
|
||||
console.log(sentences);
|
||||
|
||||
sentencesAudio = sentences.reduce((a, e, i, arr) => {
|
||||
a[i] = null;
|
||||
return a;
|
||||
}, {});
|
||||
|
||||
let lastPlayedAudioPromise = Promise.resolve(); // Initialize a promise that resolves immediately
|
||||
|
||||
for (const [idx, sentence] of sentences.entries()) {
|
||||
const res = await synthesizeOpenAISpeech(
|
||||
localStorage.token,
|
||||
$settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice,
|
||||
sentence
|
||||
).catch((error) => {
|
||||
toast.error(error);
|
||||
|
||||
speaking = null;
|
||||
loadingSpeech = false;
|
||||
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
const blob = await res.blob();
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
const audio = new Audio(blobUrl);
|
||||
sentencesAudio[idx] = audio;
|
||||
loadingSpeech = false;
|
||||
lastPlayedAudioPromise = lastPlayedAudioPromise.then(() => playAudio(idx));
|
||||
}
|
||||
}
|
||||
return mergedTexts;
|
||||
}, []);
|
||||
} else {
|
||||
let voices = [];
|
||||
const getVoicesLoop = setInterval(async () => {
|
||||
voices = await speechSynthesis.getVoices();
|
||||
if (voices.length > 0) {
|
||||
clearInterval(getVoicesLoop);
|
||||
|
||||
console.log(sentences);
|
||||
const voice =
|
||||
voices
|
||||
?.filter(
|
||||
(v) =>
|
||||
v.voiceURI === ($settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice)
|
||||
)
|
||||
?.at(0) ?? undefined;
|
||||
|
||||
sentencesAudio = sentences.reduce((a, e, i, arr) => {
|
||||
a[i] = null;
|
||||
return a;
|
||||
}, {});
|
||||
console.log(voice);
|
||||
|
||||
let lastPlayedAudioPromise = Promise.resolve(); // Initialize a promise that resolves immediately
|
||||
const speak = new SpeechSynthesisUtterance(message.content);
|
||||
|
||||
for (const [idx, sentence] of sentences.entries()) {
|
||||
const res = await synthesizeOpenAISpeech(
|
||||
localStorage.token,
|
||||
$settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice,
|
||||
sentence
|
||||
).catch((error) => {
|
||||
toast.error(error);
|
||||
console.log(speak);
|
||||
|
||||
speaking = null;
|
||||
loadingSpeech = false;
|
||||
speak.onend = () => {
|
||||
speaking = null;
|
||||
if ($settings.conversationMode) {
|
||||
document.getElementById('voice-input-button')?.click();
|
||||
}
|
||||
};
|
||||
|
||||
return null;
|
||||
});
|
||||
if (voice) {
|
||||
speak.voice = voice;
|
||||
}
|
||||
|
||||
if (res) {
|
||||
const blob = await res.blob();
|
||||
const blobUrl = URL.createObjectURL(blob);
|
||||
const audio = new Audio(blobUrl);
|
||||
sentencesAudio[idx] = audio;
|
||||
loadingSpeech = false;
|
||||
lastPlayedAudioPromise = lastPlayedAudioPromise.then(() => playAudio(idx));
|
||||
}
|
||||
speechSynthesis.speak(speak);
|
||||
}
|
||||
}, 100);
|
||||
}
|
||||
} else {
|
||||
let voices = [];
|
||||
const getVoicesLoop = setInterval(async () => {
|
||||
voices = await speechSynthesis.getVoices();
|
||||
if (voices.length > 0) {
|
||||
clearInterval(getVoicesLoop);
|
||||
|
||||
const voice =
|
||||
voices
|
||||
?.filter(
|
||||
(v) => v.voiceURI === ($settings?.audio?.tts?.voice ?? $config?.audio?.tts?.voice)
|
||||
)
|
||||
?.at(0) ?? undefined;
|
||||
|
||||
console.log(voice);
|
||||
|
||||
const speak = new SpeechSynthesisUtterance(message.content);
|
||||
|
||||
console.log(speak);
|
||||
|
||||
speak.onend = () => {
|
||||
speaking = null;
|
||||
if ($settings.conversationMode) {
|
||||
document.getElementById('voice-input-button')?.click();
|
||||
}
|
||||
};
|
||||
|
||||
if (voice) {
|
||||
speak.voice = voice;
|
||||
}
|
||||
|
||||
speechSynthesis.speak(speak);
|
||||
}
|
||||
}, 100);
|
||||
toast.error('No content to speak');
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -415,26 +420,29 @@
|
||||
class="prose chat-{message.role} w-full max-w-full dark:prose-invert prose-headings:my-0 prose-headings:-mb-4 prose-p:m-0 prose-p:-mb-6 prose-pre:my-0 prose-table:my-0 prose-blockquote:my-0 prose-img:my-0 prose-ul:-my-4 prose-ol:-my-4 prose-li:-my-3 prose-ul:-mb-6 prose-ol:-mb-8 prose-ol:p-0 prose-li:-mb-4 whitespace-pre-line"
|
||||
>
|
||||
<div>
|
||||
{#if message?.status}
|
||||
{#if (message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]).length > 0}
|
||||
{@const status = (
|
||||
message?.statusHistory ?? [...(message?.status ? [message?.status] : [])]
|
||||
).at(-1)}
|
||||
<div class="flex items-center gap-2 pt-1 pb-1">
|
||||
{#if message?.status?.done === false}
|
||||
{#if status.done === false}
|
||||
<div class="">
|
||||
<Spinner className="size-4" />
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{#if message?.status?.action === 'web_search' && message?.status?.urls}
|
||||
<WebSearchResults urls={message?.status?.urls}>
|
||||
{#if status?.action === 'web_search' && status?.urls}
|
||||
<WebSearchResults {status}>
|
||||
<div class="flex flex-col justify-center -space-y-0.5">
|
||||
<div class="text-base line-clamp-1 text-wrap">
|
||||
{message.status.description}
|
||||
{status?.description}
|
||||
</div>
|
||||
</div>
|
||||
</WebSearchResults>
|
||||
{:else}
|
||||
<div class="flex flex-col justify-center -space-y-0.5">
|
||||
<div class=" text-gray-500 dark:text-gray-500 text-base line-clamp-1 text-wrap">
|
||||
{message.status.description}
|
||||
{status?.description}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
@@ -868,8 +876,8 @@
|
||||
<button
|
||||
class="{isLastMessage
|
||||
? 'visible'
|
||||
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {message
|
||||
?.annotation?.rating === 1
|
||||
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {(message
|
||||
?.annotation?.rating ?? null) === 1
|
||||
? 'bg-gray-100 dark:bg-gray-800'
|
||||
: ''} dark:hover:text-white hover:text-black transition"
|
||||
on:click={() => {
|
||||
@@ -903,8 +911,8 @@
|
||||
<button
|
||||
class="{isLastMessage
|
||||
? 'visible'
|
||||
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {message
|
||||
?.annotation?.rating === -1
|
||||
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg {(message
|
||||
?.annotation?.rating ?? null) === -1
|
||||
? 'bg-gray-100 dark:bg-gray-800'
|
||||
: ''} dark:hover:text-white hover:text-black transition"
|
||||
on:click={() => {
|
||||
@@ -974,6 +982,7 @@
|
||||
? 'visible'
|
||||
: 'invisible group-hover:visible'} p-1.5 hover:bg-black/5 dark:hover:bg-white/5 rounded-lg dark:hover:text-white hover:text-black transition regenerate-response-button"
|
||||
on:click={() => {
|
||||
showRateComment = false;
|
||||
regenerateResponse(message);
|
||||
}}
|
||||
>
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
<script lang="ts">
|
||||
import ChevronDown from '$lib/components/icons/ChevronDown.svelte';
|
||||
import ChevronUp from '$lib/components/icons/ChevronUp.svelte';
|
||||
import MagnifyingGlass from '$lib/components/icons/MagnifyingGlass.svelte';
|
||||
import { Collapsible } from 'bits-ui';
|
||||
import { slide } from 'svelte/transition';
|
||||
|
||||
export let urls = [];
|
||||
export let status = { urls: [], query: '' };
|
||||
let state = false;
|
||||
</script>
|
||||
|
||||
@@ -27,11 +28,45 @@
|
||||
class=" text-sm border border-gray-300/30 dark:border-gray-700/50 rounded-xl"
|
||||
transition={slide}
|
||||
>
|
||||
{#each urls as url, urlIdx}
|
||||
{#if status?.query}
|
||||
<a
|
||||
href="https://www.google.com/search?q={status.query}"
|
||||
target="_blank"
|
||||
class="flex w-full items-center p-3 px-4 border-b border-gray-300/30 dark:border-gray-700/50 group/item justify-between font-normal text-gray-800 dark:text-gray-300 no-underline"
|
||||
>
|
||||
<div class="flex gap-2 items-center">
|
||||
<MagnifyingGlass />
|
||||
|
||||
<div class=" line-clamp-1">
|
||||
{status.query}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
class=" ml-1 text-white dark:text-gray-900 group-hover/item:text-gray-600 dark:group-hover/item:text-white transition"
|
||||
>
|
||||
<!-- -->
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="size-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M4.22 11.78a.75.75 0 0 1 0-1.06L9.44 5.5H5.75a.75.75 0 0 1 0-1.5h5.5a.75.75 0 0 1 .75.75v5.5a.75.75 0 0 1-1.5 0V6.56l-5.22 5.22a.75.75 0 0 1-1.06 0Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
</a>
|
||||
{/if}
|
||||
|
||||
{#each status.urls as url, urlIdx}
|
||||
<a
|
||||
href={url}
|
||||
target="_blank"
|
||||
class="flex w-full items-center p-3 px-4 {urlIdx === urls.length - 1
|
||||
class="flex w-full items-center p-3 px-4 {urlIdx === status.urls.length - 1
|
||||
? ''
|
||||
: 'border-b border-gray-300/30 dark:border-gray-700/50'} group/item justify-between font-normal text-gray-800 dark:text-gray-300"
|
||||
>
|
||||
|
||||
@@ -152,6 +152,7 @@
|
||||
|
||||
toast.error(error);
|
||||
// opts.callback({ success: false, error, modelName: opts.modelName });
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -5,21 +5,23 @@
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
export let admin = false;
|
||||
|
||||
export let params = {
|
||||
// Advanced
|
||||
seed: 0,
|
||||
seed: null,
|
||||
stop: null,
|
||||
temperature: '',
|
||||
frequency_penalty: '',
|
||||
repeat_last_n: '',
|
||||
mirostat: '',
|
||||
mirostat_eta: '',
|
||||
mirostat_tau: '',
|
||||
top_k: '',
|
||||
top_p: '',
|
||||
tfs_z: '',
|
||||
num_ctx: '',
|
||||
max_tokens: '',
|
||||
temperature: null,
|
||||
frequency_penalty: null,
|
||||
repeat_last_n: null,
|
||||
mirostat: null,
|
||||
mirostat_eta: null,
|
||||
mirostat_tau: null,
|
||||
top_k: null,
|
||||
top_p: null,
|
||||
tfs_z: null,
|
||||
num_ctx: null,
|
||||
max_tokens: null,
|
||||
use_mmap: null,
|
||||
use_mlock: null,
|
||||
num_thread: null,
|
||||
@@ -112,10 +114,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.temperature = (params?.temperature ?? '') === '' ? 0.8 : '';
|
||||
params.temperature = (params?.temperature ?? null) === null ? 0.8 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.temperature ?? '') === ''}
|
||||
{#if (params?.temperature ?? null) === null}
|
||||
<span class="ml-2 self-center"> {$i18n.t('Default')} </span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center"> {$i18n.t('Custom')} </span>
|
||||
@@ -123,7 +125,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.temperature ?? '') !== ''}
|
||||
{#if (params?.temperature ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -143,7 +145,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="1"
|
||||
step="0.05"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -158,10 +160,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.mirostat = (params?.mirostat ?? '') === '' ? 0 : '';
|
||||
params.mirostat = (params?.mirostat ?? null) === null ? 0 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.mirostat ?? '') === ''}
|
||||
{#if (params?.mirostat ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -169,7 +171,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.mirostat ?? '') !== ''}
|
||||
{#if (params?.mirostat ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -204,10 +206,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.mirostat_eta = (params?.mirostat_eta ?? '') === '' ? 0.1 : '';
|
||||
params.mirostat_eta = (params?.mirostat_eta ?? null) === null ? 0.1 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.mirostat_eta ?? '') === ''}
|
||||
{#if (params?.mirostat_eta ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -215,7 +217,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.mirostat_eta ?? '') !== ''}
|
||||
{#if (params?.mirostat_eta ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -235,7 +237,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="1"
|
||||
step="0.05"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -250,10 +252,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.mirostat_tau = (params?.mirostat_tau ?? '') === '' ? 5.0 : '';
|
||||
params.mirostat_tau = (params?.mirostat_tau ?? null) === null ? 5.0 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.mirostat_tau ?? '') === ''}
|
||||
{#if (params?.mirostat_tau ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -261,7 +263,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.mirostat_tau ?? '') !== ''}
|
||||
{#if (params?.mirostat_tau ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -281,7 +283,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="10"
|
||||
step="0.5"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -296,10 +298,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.top_k = (params?.top_k ?? '') === '' ? 40 : '';
|
||||
params.top_k = (params?.top_k ?? null) === null ? 40 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.top_k ?? '') === ''}
|
||||
{#if (params?.top_k ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -307,7 +309,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.top_k ?? '') !== ''}
|
||||
{#if (params?.top_k ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -327,7 +329,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="100"
|
||||
step="0.5"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -342,10 +344,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.top_p = (params?.top_p ?? '') === '' ? 0.9 : '';
|
||||
params.top_p = (params?.top_p ?? null) === null ? 0.9 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.top_p ?? '') === ''}
|
||||
{#if (params?.top_p ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -353,7 +355,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.top_p ?? '') !== ''}
|
||||
{#if (params?.top_p ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -373,7 +375,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="1"
|
||||
step="0.05"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -388,10 +390,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.frequency_penalty = (params?.frequency_penalty ?? '') === '' ? 1.1 : '';
|
||||
params.frequency_penalty = (params?.frequency_penalty ?? null) === null ? 1.1 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.frequency_penalty ?? '') === ''}
|
||||
{#if (params?.frequency_penalty ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -399,7 +401,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.frequency_penalty ?? '') !== ''}
|
||||
{#if (params?.frequency_penalty ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -419,7 +421,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="2"
|
||||
step="0.05"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -434,10 +436,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.repeat_last_n = (params?.repeat_last_n ?? '') === '' ? 64 : '';
|
||||
params.repeat_last_n = (params?.repeat_last_n ?? null) === null ? 64 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.repeat_last_n ?? '') === ''}
|
||||
{#if (params?.repeat_last_n ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -445,7 +447,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.repeat_last_n ?? '') !== ''}
|
||||
{#if (params?.repeat_last_n ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -480,10 +482,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.tfs_z = (params?.tfs_z ?? '') === '' ? 1 : '';
|
||||
params.tfs_z = (params?.tfs_z ?? null) === null ? 1 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.tfs_z ?? '') === ''}
|
||||
{#if (params?.tfs_z ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -491,7 +493,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.tfs_z ?? '') !== ''}
|
||||
{#if (params?.tfs_z ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -511,7 +513,7 @@
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="0"
|
||||
max="2"
|
||||
step="0.05"
|
||||
step="any"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@@ -526,10 +528,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.num_ctx = (params?.num_ctx ?? '') === '' ? 2048 : '';
|
||||
params.num_ctx = (params?.num_ctx ?? null) === null ? 2048 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.num_ctx ?? '') === ''}
|
||||
{#if (params?.num_ctx ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -537,7 +539,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.num_ctx ?? '') !== ''}
|
||||
{#if (params?.num_ctx ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -571,10 +573,10 @@
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.max_tokens = (params?.max_tokens ?? '') === '' ? 128 : '';
|
||||
params.max_tokens = (params?.max_tokens ?? null) === null ? 128 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.max_tokens ?? '') === ''}
|
||||
{#if (params?.max_tokens ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
@@ -582,7 +584,7 @@
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.max_tokens ?? '') !== ''}
|
||||
{#if (params?.max_tokens ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
@@ -609,122 +611,124 @@
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('use_mmap (Ollama)')}</div>
|
||||
{#if admin}
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('use_mmap (Ollama)')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.use_mmap = (params?.use_mmap ?? null) === null ? true : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.use_mmap ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('use_mlock (Ollama)')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.use_mlock = (params?.use_mlock ?? null) === null ? true : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.use_mlock ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('num_thread (Ollama)')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.num_thread = (params?.num_thread ?? null) === null ? 2 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.num_thread ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.num_thread ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
id="steps-range"
|
||||
type="range"
|
||||
min="1"
|
||||
max="256"
|
||||
step="1"
|
||||
bind:value={params.num_thread}
|
||||
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
|
||||
/>
|
||||
</div>
|
||||
<div class="">
|
||||
<input
|
||||
bind:value={params.num_thread}
|
||||
type="number"
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="1"
|
||||
max="256"
|
||||
step="1"
|
||||
/>
|
||||
</div>
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.use_mmap = (params?.use_mmap ?? null) === null ? true : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.use_mmap ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Template')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.template = (params?.template ?? null) === null ? '' : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.template ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.template ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<textarea
|
||||
class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
|
||||
placeholder="Write your model template content here"
|
||||
rows="4"
|
||||
bind:value={params.template}
|
||||
/>
|
||||
</div>
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('use_mlock (Ollama)')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.use_mlock = (params?.use_mlock ?? null) === null ? true : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.use_mlock ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('On')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('num_thread (Ollama)')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.num_thread = (params?.num_thread ?? null) === null ? 2 : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.num_thread ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.num_thread ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<input
|
||||
id="steps-range"
|
||||
type="range"
|
||||
min="1"
|
||||
max="256"
|
||||
step="1"
|
||||
bind:value={params.num_thread}
|
||||
class="w-full h-2 rounded-lg appearance-none cursor-pointer dark:bg-gray-700"
|
||||
/>
|
||||
</div>
|
||||
<div class="">
|
||||
<input
|
||||
bind:value={params.num_thread}
|
||||
type="number"
|
||||
class=" bg-transparent text-center w-14"
|
||||
min="1"
|
||||
max="256"
|
||||
step="1"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<!-- <div class=" py-0.5 w-full justify-between">
|
||||
<div class="flex w-full justify-between">
|
||||
<div class=" self-center text-xs font-medium">{$i18n.t('Template')}</div>
|
||||
|
||||
<button
|
||||
class="p-1 px-3 text-xs flex rounded transition"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
params.template = (params?.template ?? null) === null ? '' : null;
|
||||
}}
|
||||
>
|
||||
{#if (params?.template ?? null) === null}
|
||||
<span class="ml-2 self-center">{$i18n.t('Default')}</span>
|
||||
{:else}
|
||||
<span class="ml-2 self-center">{$i18n.t('Custom')}</span>
|
||||
{/if}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{#if (params?.template ?? null) !== null}
|
||||
<div class="flex mt-0.5 space-x-2">
|
||||
<div class=" flex-1">
|
||||
<textarea
|
||||
class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg -mb-1"
|
||||
placeholder="Write your model template content here"
|
||||
rows="4"
|
||||
bind:value={params.template}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</div> -->
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
import { getLanguages } from '$lib/i18n';
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
import { models, settings, theme } from '$lib/stores';
|
||||
import { models, settings, theme, user } from '$lib/stores';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -43,19 +43,19 @@
|
||||
|
||||
let params = {
|
||||
// Advanced
|
||||
seed: 0,
|
||||
temperature: '',
|
||||
frequency_penalty: '',
|
||||
repeat_last_n: '',
|
||||
mirostat: '',
|
||||
mirostat_eta: '',
|
||||
mirostat_tau: '',
|
||||
top_k: '',
|
||||
top_p: '',
|
||||
seed: null,
|
||||
temperature: null,
|
||||
frequency_penalty: null,
|
||||
repeat_last_n: null,
|
||||
mirostat: null,
|
||||
mirostat_eta: null,
|
||||
mirostat_tau: null,
|
||||
top_k: null,
|
||||
top_p: null,
|
||||
stop: null,
|
||||
tfs_z: '',
|
||||
num_ctx: '',
|
||||
max_tokens: ''
|
||||
tfs_z: null,
|
||||
num_ctx: null,
|
||||
max_tokens: null
|
||||
};
|
||||
|
||||
const toggleRequestFormat = async () => {
|
||||
@@ -79,12 +79,6 @@
|
||||
requestFormat = $settings.requestFormat ?? '';
|
||||
keepAlive = $settings.keepAlive ?? null;
|
||||
|
||||
params.seed = $settings.seed ?? 0;
|
||||
params.temperature = $settings.temperature ?? '';
|
||||
params.frequency_penalty = $settings.frequency_penalty ?? '';
|
||||
params.top_k = $settings.top_k ?? '';
|
||||
params.top_p = $settings.top_p ?? '';
|
||||
params.num_ctx = $settings.num_ctx ?? '';
|
||||
params = { ...params, ...$settings.params };
|
||||
params.stop = $settings?.params?.stop ? ($settings?.params?.stop ?? []).join(',') : null;
|
||||
});
|
||||
@@ -146,6 +140,7 @@
|
||||
<option value="dark">🌑 {$i18n.t('Dark')}</option>
|
||||
<option value="oled-dark">🌃 {$i18n.t('OLED Dark')}</option>
|
||||
<option value="light">☀️ {$i18n.t('Light')}</option>
|
||||
<option value="her">🌷 Her</option>
|
||||
<!-- <option value="rose-pine dark">🪻 {$i18n.t('Rosé Pine')}</option>
|
||||
<option value="rose-pine-dawn light">🌷 {$i18n.t('Rosé Pine Dawn')}</option> -->
|
||||
</select>
|
||||
@@ -227,7 +222,7 @@
|
||||
</div>
|
||||
|
||||
{#if showAdvanced}
|
||||
<AdvancedParams bind:params />
|
||||
<AdvancedParams admin={$user?.role === 'admin'} bind:params />
|
||||
<hr class=" dark:border-gray-850" />
|
||||
|
||||
<div class=" py-1 w-full justify-between">
|
||||
@@ -300,20 +295,23 @@
|
||||
saveSettings({
|
||||
system: system !== '' ? system : undefined,
|
||||
params: {
|
||||
seed: (params.seed !== 0 ? params.seed : undefined) ?? undefined,
|
||||
seed: (params.seed !== null ? params.seed : undefined) ?? undefined,
|
||||
stop: params.stop ? params.stop.split(',').filter((e) => e) : undefined,
|
||||
temperature: params.temperature !== '' ? params.temperature : undefined,
|
||||
temperature: params.temperature !== null ? params.temperature : undefined,
|
||||
frequency_penalty:
|
||||
params.frequency_penalty !== '' ? params.frequency_penalty : undefined,
|
||||
repeat_last_n: params.repeat_last_n !== '' ? params.repeat_last_n : undefined,
|
||||
mirostat: params.mirostat !== '' ? params.mirostat : undefined,
|
||||
mirostat_eta: params.mirostat_eta !== '' ? params.mirostat_eta : undefined,
|
||||
mirostat_tau: params.mirostat_tau !== '' ? params.mirostat_tau : undefined,
|
||||
top_k: params.top_k !== '' ? params.top_k : undefined,
|
||||
top_p: params.top_p !== '' ? params.top_p : undefined,
|
||||
tfs_z: params.tfs_z !== '' ? params.tfs_z : undefined,
|
||||
num_ctx: params.num_ctx !== '' ? params.num_ctx : undefined,
|
||||
max_tokens: params.max_tokens !== '' ? params.max_tokens : undefined
|
||||
params.frequency_penalty !== null ? params.frequency_penalty : undefined,
|
||||
repeat_last_n: params.repeat_last_n !== null ? params.repeat_last_n : undefined,
|
||||
mirostat: params.mirostat !== null ? params.mirostat : undefined,
|
||||
mirostat_eta: params.mirostat_eta !== null ? params.mirostat_eta : undefined,
|
||||
mirostat_tau: params.mirostat_tau !== null ? params.mirostat_tau : undefined,
|
||||
top_k: params.top_k !== null ? params.top_k : undefined,
|
||||
top_p: params.top_p !== null ? params.top_p : undefined,
|
||||
tfs_z: params.tfs_z !== null ? params.tfs_z : undefined,
|
||||
num_ctx: params.num_ctx !== null ? params.num_ctx : undefined,
|
||||
max_tokens: params.max_tokens !== null ? params.max_tokens : undefined,
|
||||
use_mmap: params.use_mmap !== null ? params.use_mmap : undefined,
|
||||
use_mlock: params.use_mlock !== null ? params.use_mlock : undefined,
|
||||
num_thread: params.num_thread !== null ? params.num_thread : undefined
|
||||
},
|
||||
keepAlive: keepAlive ? (isNaN(keepAlive) ? keepAlive : parseInt(keepAlive)) : undefined
|
||||
});
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
<script lang="ts">
|
||||
import { basicSetup, EditorView } from 'codemirror';
|
||||
import { keymap, placeholder } from '@codemirror/view';
|
||||
import { Compartment, EditorState } from '@codemirror/state';
|
||||
|
||||
import { acceptCompletion } from '@codemirror/autocomplete';
|
||||
import { indentWithTab } from '@codemirror/commands';
|
||||
|
||||
import { indentUnit } from '@codemirror/language';
|
||||
import { python } from '@codemirror/lang-python';
|
||||
import { oneDark } from '@codemirror/theme-one-dark';
|
||||
|
||||
import { onMount, createEventDispatcher } from 'svelte';
|
||||
import { formatPythonCode } from '$lib/apis/utils';
|
||||
import { toast } from 'svelte-sonner';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
export let boilerplate = '';
|
||||
export let value = '';
|
||||
|
||||
let codeEditor;
|
||||
|
||||
let isDarkMode = false;
|
||||
let editorTheme = new Compartment();
|
||||
|
||||
export const formatPythonCodeHandler = async () => {
|
||||
if (codeEditor) {
|
||||
const res = await formatPythonCode(value).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res && res.code) {
|
||||
const formattedCode = res.code;
|
||||
codeEditor.dispatch({
|
||||
changes: [{ from: 0, to: codeEditor.state.doc.length, insert: formattedCode }]
|
||||
});
|
||||
|
||||
toast.success('Code formatted successfully');
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
let extensions = [
|
||||
basicSetup,
|
||||
keymap.of([{ key: 'Tab', run: acceptCompletion }, indentWithTab]),
|
||||
python(),
|
||||
indentUnit.of(' '),
|
||||
placeholder('Enter your code here...'),
|
||||
EditorView.updateListener.of((e) => {
|
||||
if (e.docChanged) {
|
||||
value = e.state.doc.toString();
|
||||
}
|
||||
}),
|
||||
editorTheme.of([])
|
||||
];
|
||||
|
||||
onMount(() => {
|
||||
console.log(value);
|
||||
if (value === '') {
|
||||
value = boilerplate;
|
||||
}
|
||||
|
||||
// Check if html class has dark mode
|
||||
isDarkMode = document.documentElement.classList.contains('dark');
|
||||
|
||||
// python code editor, highlight python code
|
||||
codeEditor = new EditorView({
|
||||
state: EditorState.create({
|
||||
doc: value,
|
||||
extensions: extensions
|
||||
}),
|
||||
parent: document.getElementById('code-textarea')
|
||||
});
|
||||
|
||||
if (isDarkMode) {
|
||||
codeEditor.dispatch({
|
||||
effects: editorTheme.reconfigure(oneDark)
|
||||
});
|
||||
}
|
||||
|
||||
// listen to html class changes this should fire only when dark mode is toggled
|
||||
const observer = new MutationObserver((mutations) => {
|
||||
mutations.forEach((mutation) => {
|
||||
if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
|
||||
const _isDarkMode = document.documentElement.classList.contains('dark');
|
||||
|
||||
if (_isDarkMode !== isDarkMode) {
|
||||
isDarkMode = _isDarkMode;
|
||||
if (_isDarkMode) {
|
||||
codeEditor.dispatch({
|
||||
effects: editorTheme.reconfigure(oneDark)
|
||||
});
|
||||
} else {
|
||||
codeEditor.dispatch({
|
||||
effects: editorTheme.reconfigure()
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
observer.observe(document.documentElement, {
|
||||
attributes: true,
|
||||
attributeFilter: ['class']
|
||||
});
|
||||
|
||||
const keydownHandler = async (e) => {
|
||||
if ((e.ctrlKey || e.metaKey) && e.key === 's') {
|
||||
e.preventDefault();
|
||||
dispatch('save');
|
||||
}
|
||||
|
||||
// Format code when Ctrl + Shift + F is pressed
|
||||
if ((e.ctrlKey || e.metaKey) && e.shiftKey && e.key === 'f') {
|
||||
e.preventDefault();
|
||||
await formatPythonCodeHandler();
|
||||
}
|
||||
};
|
||||
|
||||
document.addEventListener('keydown', keydownHandler);
|
||||
|
||||
return () => {
|
||||
observer.disconnect();
|
||||
document.removeEventListener('keydown', keydownHandler);
|
||||
};
|
||||
});
|
||||
</script>
|
||||
|
||||
<div id="code-textarea" class="h-full w-full" />
|
||||
@@ -0,0 +1,106 @@
|
||||
<script lang="ts">
|
||||
import { onMount, createEventDispatcher } from 'svelte';
|
||||
import { fade } from 'svelte/transition';
|
||||
|
||||
import { flyAndScale } from '$lib/utils/transitions';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
export let title = 'Confirm your action';
|
||||
export let message = 'This action cannot be undone. Do you wish to continue?';
|
||||
|
||||
export let show = false;
|
||||
let modalElement = null;
|
||||
let mounted = false;
|
||||
|
||||
const handleKeyDown = (event: KeyboardEvent) => {
|
||||
if (event.key === 'Escape') {
|
||||
console.log('Escape');
|
||||
show = false;
|
||||
}
|
||||
};
|
||||
|
||||
onMount(() => {
|
||||
mounted = true;
|
||||
});
|
||||
|
||||
$: if (mounted) {
|
||||
if (show) {
|
||||
window.addEventListener('keydown', handleKeyDown);
|
||||
document.body.style.overflow = 'hidden';
|
||||
} else {
|
||||
window.removeEventListener('keydown', handleKeyDown);
|
||||
document.body.style.overflow = 'unset';
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
{#if show}
|
||||
<!-- svelte-ignore a11y-click-events-have-key-events -->
|
||||
<!-- svelte-ignore a11y-no-static-element-interactions -->
|
||||
<div
|
||||
bind:this={modalElement}
|
||||
class=" fixed top-0 right-0 left-0 bottom-0 bg-black/60 w-full min-h-screen h-screen flex justify-center z-[9999] overflow-hidden overscroll-contain"
|
||||
in:fade={{ duration: 10 }}
|
||||
on:mousedown={() => {
|
||||
show = false;
|
||||
}}
|
||||
>
|
||||
<div
|
||||
class=" m-auto rounded-2xl max-w-full w-[32rem] mx-2 bg-gray-50 dark:bg-gray-950 shadow-3xl border border-gray-850"
|
||||
in:flyAndScale
|
||||
on:mousedown={(e) => {
|
||||
e.stopPropagation();
|
||||
}}
|
||||
>
|
||||
<div class="px-[1.75rem] py-6">
|
||||
<div class=" text-lg font-semibold dark:text-gray-200 mb-2.5">{title}</div>
|
||||
|
||||
<slot>
|
||||
<div class=" text-sm text-gray-500">
|
||||
{message}
|
||||
</div>
|
||||
</slot>
|
||||
|
||||
<div class="mt-6 flex justify-between gap-1.5">
|
||||
<button
|
||||
class="bg-gray-100 hover:bg-gray-200 text-gray-800 dark:bg-gray-850 dark:hover:bg-gray-800 dark:text-white font-medium w-full py-2.5 rounded-lg transition"
|
||||
on:click={() => {
|
||||
show = false;
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
Cancel
|
||||
</button>
|
||||
<button
|
||||
class="bg-gray-900 hover:bg-gray-850 text-gray-100 dark:bg-gray-100 dark:hover:bg-white dark:text-gray-800 font-medium w-full py-2.5 rounded-lg transition"
|
||||
on:click={() => {
|
||||
show = false;
|
||||
dispatch('confirm');
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
Confirm
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<style>
|
||||
.modal-content {
|
||||
animation: scaleUp 0.1s ease-out forwards;
|
||||
}
|
||||
|
||||
@keyframes scaleUp {
|
||||
from {
|
||||
transform: scale(0.985);
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
transform: scale(1);
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@@ -11,7 +11,7 @@
|
||||
export let saveHandler: Function;
|
||||
|
||||
let webConfig = null;
|
||||
let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper'];
|
||||
let webSearchEngines = ['searxng', 'google_pse', 'brave', 'serpstack', 'serper', 'serply'];
|
||||
|
||||
let youtubeLanguage = 'en';
|
||||
let youtubeTranslation = null;
|
||||
|
||||
@@ -0,0 +1,19 @@
|
||||
<script lang="ts">
|
||||
export let className = 'size-4';
|
||||
export let strokeWidth = '2';
|
||||
</script>
|
||||
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width={strokeWidth}
|
||||
stroke="currentColor"
|
||||
class={className}
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="m21 21-5.197-5.197m0 0A7.5 7.5 0 1 0 5.196 5.196a7.5 7.5 0 0 0 10.607 10.607Z"
|
||||
/>
|
||||
</svg>
|
||||
@@ -0,0 +1,11 @@
|
||||
<script lang="ts">
|
||||
export let className = 'size-4';
|
||||
</script>
|
||||
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class={className}>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M12 6.75a5.25 5.25 0 0 1 6.775-5.025.75.75 0 0 1 .313 1.248l-3.32 3.319c.063.475.276.934.641 1.299.365.365.824.578 1.3.64l3.318-3.319a.75.75 0 0 1 1.248.313 5.25 5.25 0 0 1-5.472 6.756c-1.018-.086-1.87.1-2.309.634L7.344 21.3A3.298 3.298 0 1 1 2.7 16.657l8.684-7.151c.533-.44.72-1.291.634-2.309A5.342 5.342 0 0 1 12 6.75ZM4.117 19.125a.75.75 0 0 1 .75-.75h.008a.75.75 0 0 1 .75.75v.008a.75.75 0 0 1-.75.75h-.008a.75.75 0 0 1-.75-.75v-.008Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
@@ -491,7 +491,7 @@
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<div class=" text-gray-500 text-xs mt-1">
|
||||
<div class=" text-gray-500 text-xs mt-1 mb-2">
|
||||
ⓘ {$i18n.t("Use '#' in the prompt input to load and select your documents.")}
|
||||
</div>
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
</div>
|
||||
|
||||
<div class=" text-xs dark:text-gray-500">
|
||||
To add documents here, upload them to the "Documents" workspace first.
|
||||
{$i18n.t('To add documents here, upload them to the "Documents" workspace first.')}
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col">
|
||||
@@ -97,7 +97,7 @@
|
||||
<Selector bind:knowledge>
|
||||
<button
|
||||
class=" px-3.5 py-1.5 font-medium hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-gray-300 dark:outline-gray-800 rounded-3xl"
|
||||
type="button">Select Documents</button
|
||||
type="button">{$i18n.t('Select Documents')}</button
|
||||
>
|
||||
</Selector>
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
<script lang="ts">
|
||||
import Checkbox from '$lib/components/common/Checkbox.svelte';
|
||||
import { getContext, onMount } from 'svelte';
|
||||
|
||||
export let tools = [];
|
||||
|
||||
let _tools = {};
|
||||
|
||||
export let selectedToolIds = [];
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
onMount(() => {
|
||||
_tools = tools.reduce((acc, tool) => {
|
||||
acc[tool.id] = {
|
||||
...tool,
|
||||
selected: selectedToolIds.includes(tool.id)
|
||||
};
|
||||
|
||||
return acc;
|
||||
}, {});
|
||||
});
|
||||
</script>
|
||||
|
||||
<div>
|
||||
<div class="flex w-full justify-between mb-1">
|
||||
<div class=" self-center text-sm font-semibold">{$i18n.t('Tools')}</div>
|
||||
</div>
|
||||
|
||||
<div class=" text-xs dark:text-gray-500">
|
||||
{$i18n.t('To select toolkits here, add them to the "Tools" workspace first.')}
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col">
|
||||
{#if tools.length > 0}
|
||||
<div class=" flex items-center gap-2 mt-2">
|
||||
{#each Object.keys(_tools) as tool, toolIdx}
|
||||
<div class=" flex items-center gap-2">
|
||||
<div class="self-center flex items-center">
|
||||
<Checkbox
|
||||
state={_tools[tool].selected ? 'checked' : 'unchecked'}
|
||||
on:change={(e) => {
|
||||
_tools[tool].selected = e.detail === 'checked';
|
||||
selectedToolIds = Object.keys(_tools).filter((t) => _tools[t].selected);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class=" py-0.5 text-sm w-full capitalize font-medium">
|
||||
{_tools[tool].name}
|
||||
</div>
|
||||
</div>
|
||||
{/each}
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,358 @@
|
||||
<script lang="ts">
|
||||
import { toast } from 'svelte-sonner';
|
||||
import fileSaver from 'file-saver';
|
||||
const { saveAs } = fileSaver;
|
||||
|
||||
import { onMount, getContext } from 'svelte';
|
||||
import { WEBUI_NAME, prompts, tools } from '$lib/stores';
|
||||
import { createNewPrompt, deletePromptByCommand, getPrompts } from '$lib/apis/prompts';
|
||||
|
||||
import { goto } from '$app/navigation';
|
||||
import {
|
||||
createNewTool,
|
||||
deleteToolById,
|
||||
exportTools,
|
||||
getToolById,
|
||||
getTools
|
||||
} from '$lib/apis/tools';
|
||||
import ArrowDownTray from '../icons/ArrowDownTray.svelte';
|
||||
import Tooltip from '../common/Tooltip.svelte';
|
||||
import ConfirmDialog from '../common/ConfirmDialog.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let toolsImportInputElement: HTMLInputElement;
|
||||
let importFiles;
|
||||
|
||||
let showConfirm = false;
|
||||
let query = '';
|
||||
</script>
|
||||
|
||||
<svelte:head>
|
||||
<title>
|
||||
{$i18n.t('Tools')} | {$WEBUI_NAME}
|
||||
</title>
|
||||
</svelte:head>
|
||||
|
||||
<div class="mb-3 flex justify-between items-center">
|
||||
<div class=" text-lg font-semibold self-center">{$i18n.t('Tools')}</div>
|
||||
</div>
|
||||
|
||||
<div class=" flex w-full space-x-2">
|
||||
<div class="flex flex-1">
|
||||
<div class=" self-center ml-1 mr-3">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M9 3.5a5.5 5.5 0 100 11 5.5 5.5 0 000-11zM2 9a7 7 0 1112.452 4.391l3.328 3.329a.75.75 0 11-1.06 1.06l-3.329-3.328A7 7 0 012 9z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<input
|
||||
class=" w-full text-sm pr-4 py-1 rounded-r-xl outline-none bg-transparent"
|
||||
bind:value={query}
|
||||
placeholder={$i18n.t('Search Tools')}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<a
|
||||
class=" px-2 py-2 rounded-xl border border-gray-200 dark:border-gray-600 dark:border-0 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 transition font-medium text-sm flex items-center space-x-1"
|
||||
href="/workspace/tools/create"
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
d="M8.75 3.75a.75.75 0 0 0-1.5 0v3.5h-3.5a.75.75 0 0 0 0 1.5h3.5v3.5a.75.75 0 0 0 1.5 0v-3.5h3.5a.75.75 0 0 0 0-1.5h-3.5v-3.5Z"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<hr class=" dark:border-gray-850 my-2.5" />
|
||||
|
||||
<div class="my-3 mb-5">
|
||||
{#each $tools.filter((t) => query === '' || t.name
|
||||
.toLowerCase()
|
||||
.includes(query.toLowerCase()) || t.id.toLowerCase().includes(query.toLowerCase())) as tool}
|
||||
<button
|
||||
class=" flex space-x-4 cursor-pointer w-full px-3 py-2 dark:hover:bg-white/5 hover:bg-black/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={() => {
|
||||
goto(`/workspace/tools/edit?id=${encodeURIComponent(tool.id)}`);
|
||||
}}
|
||||
>
|
||||
<div class=" flex flex-1 space-x-4 cursor-pointer w-full">
|
||||
<a
|
||||
href={`/workspace/tools/edit?id=${encodeURIComponent(tool.id)}`}
|
||||
class="flex items-center text-left"
|
||||
>
|
||||
<div class=" flex-1 self-center pl-5">
|
||||
<div class=" font-semibold flex items-center gap-1.5">
|
||||
<div>
|
||||
{tool.name}
|
||||
</div>
|
||||
<div class=" text-gray-500 text-xs font-medium">{tool.id}</div>
|
||||
</div>
|
||||
<div class=" text-xs overflow-hidden text-ellipsis line-clamp-1">
|
||||
{tool.meta.description}
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
</div>
|
||||
<div class="flex flex-row space-x-1 self-center">
|
||||
<Tooltip content="Edit">
|
||||
<a
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
href={`/workspace/tools/edit?id=${encodeURIComponent(tool.id)}`}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M16.862 4.487l1.687-1.688a1.875 1.875 0 112.652 2.652L6.832 19.82a4.5 4.5 0 01-1.897 1.13l-2.685.8.8-2.685a4.5 4.5 0 011.13-1.897L16.863 4.487zm0 0L19.5 7.125"
|
||||
/>
|
||||
</svg>
|
||||
</a>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip content="Clone">
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={async (e) => {
|
||||
e.stopPropagation();
|
||||
|
||||
const _tool = await getToolById(localStorage.token, tool.id).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (_tool) {
|
||||
sessionStorage.tool = JSON.stringify({
|
||||
..._tool,
|
||||
id: `${_tool.id}_clone`,
|
||||
name: `${_tool.name} (Clone)`
|
||||
});
|
||||
goto('/workspace/tools/create');
|
||||
}
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M15.75 17.25v3.375c0 .621-.504 1.125-1.125 1.125h-9.75a1.125 1.125 0 0 1-1.125-1.125V7.875c0-.621.504-1.125 1.125-1.125H6.75a9.06 9.06 0 0 1 1.5.124m7.5 10.376h3.375c.621 0 1.125-.504 1.125-1.125V11.25c0-4.46-3.243-8.161-7.5-8.876a9.06 9.06 0 0 0-1.5-.124H9.375c-.621 0-1.125.504-1.125 1.125v3.5m7.5 10.375H9.375a1.125 1.125 0 0 1-1.125-1.125v-9.25m12 6.625v-1.875a3.375 3.375 0 0 0-3.375-3.375h-1.5a1.125 1.125 0 0 1-1.125-1.125v-1.5a3.375 3.375 0 0 0-3.375-3.375H9.75"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip content="Export">
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={async (e) => {
|
||||
e.stopPropagation();
|
||||
|
||||
const _tool = await getToolById(localStorage.token, tool.id).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (_tool) {
|
||||
let blob = new Blob([JSON.stringify([_tool])], {
|
||||
type: 'application/json'
|
||||
});
|
||||
saveAs(blob, `tool-${_tool.id}-export-${Date.now()}.json`);
|
||||
}
|
||||
}}
|
||||
>
|
||||
<ArrowDownTray />
|
||||
</button>
|
||||
</Tooltip>
|
||||
|
||||
<Tooltip content="Delete">
|
||||
<button
|
||||
class="self-center w-fit text-sm px-2 py-2 dark:text-gray-300 dark:hover:text-white hover:bg-black/5 dark:hover:bg-white/5 rounded-xl"
|
||||
type="button"
|
||||
on:click={async (e) => {
|
||||
e.stopPropagation();
|
||||
|
||||
const res = await deleteToolById(localStorage.token, tool.id).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (res) {
|
||||
toast.success('Tool deleted successfully');
|
||||
tools.set(await getTools(localStorage.token));
|
||||
}
|
||||
}}
|
||||
>
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
fill="none"
|
||||
viewBox="0 0 24 24"
|
||||
stroke-width="1.5"
|
||||
stroke="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
d="M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.964 51.964 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0"
|
||||
/>
|
||||
</svg>
|
||||
</button>
|
||||
</Tooltip>
|
||||
</div>
|
||||
</button>
|
||||
{/each}
|
||||
</div>
|
||||
|
||||
<div class=" text-gray-500 text-xs mt-1 mb-2">
|
||||
ⓘ {$i18n.t(
|
||||
'Admins have access to all tools at all times; users need tools assigned per model in the workspace.'
|
||||
)}
|
||||
</div>
|
||||
|
||||
<div class=" flex justify-end w-full mb-2">
|
||||
<div class="flex space-x-2">
|
||||
<input
|
||||
id="documents-import-input"
|
||||
bind:this={toolsImportInputElement}
|
||||
bind:files={importFiles}
|
||||
type="file"
|
||||
accept=".json"
|
||||
hidden
|
||||
on:change={() => {
|
||||
console.log(importFiles);
|
||||
showConfirm = true;
|
||||
}}
|
||||
/>
|
||||
|
||||
<button
|
||||
class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 transition"
|
||||
on:click={() => {
|
||||
toolsImportInputElement.click();
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2 font-medium">{$i18n.t('Import Tools')}</div>
|
||||
|
||||
<div class=" self-center">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M4 2a1.5 1.5 0 0 0-1.5 1.5v9A1.5 1.5 0 0 0 4 14h8a1.5 1.5 0 0 0 1.5-1.5V6.621a1.5 1.5 0 0 0-.44-1.06L9.94 2.439A1.5 1.5 0 0 0 8.878 2H4Zm4 9.5a.75.75 0 0 1-.75-.75V8.06l-.72.72a.75.75 0 0 1-1.06-1.06l2-2a.75.75 0 0 1 1.06 0l2 2a.75.75 0 1 1-1.06 1.06l-.72-.72v2.69a.75.75 0 0 1-.75.75Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
</button>
|
||||
|
||||
<button
|
||||
class="flex text-xs items-center space-x-1 px-3 py-1.5 rounded-xl bg-gray-50 hover:bg-gray-100 dark:bg-gray-800 dark:hover:bg-gray-700 dark:text-gray-200 transition"
|
||||
on:click={async () => {
|
||||
const _tools = await exportTools(localStorage.token).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
|
||||
if (_tools) {
|
||||
let blob = new Blob([JSON.stringify(_tools)], {
|
||||
type: 'application/json'
|
||||
});
|
||||
saveAs(blob, `tools-export-${Date.now()}.json`);
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div class=" self-center mr-2 font-medium">{$i18n.t('Export Tools')}</div>
|
||||
|
||||
<div class=" self-center">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 16 16"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M4 2a1.5 1.5 0 0 0-1.5 1.5v9A1.5 1.5 0 0 0 4 14h8a1.5 1.5 0 0 0 1.5-1.5V6.621a1.5 1.5 0 0 0-.44-1.06L9.94 2.439A1.5 1.5 0 0 0 8.878 2H4Zm4 3.5a.75.75 0 0 1 .75.75v2.69l.72-.72a.75.75 0 1 1 1.06 1.06l-2 2a.75.75 0 0 1-1.06 0l-2-2a.75.75 0 0 1 1.06-1.06l.72.72V6.25A.75.75 0 0 1 8 5.5Z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ConfirmDialog
|
||||
bind:show={showConfirm}
|
||||
on:confirm={() => {
|
||||
const reader = new FileReader();
|
||||
reader.onload = async (event) => {
|
||||
const _tools = JSON.parse(event.target.result);
|
||||
console.log(_tools);
|
||||
|
||||
for (const tool of _tools) {
|
||||
const res = await createNewTool(localStorage.token, tool).catch((error) => {
|
||||
toast.error(error);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
toast.success('Tool imported successfully');
|
||||
tools.set(await getTools(localStorage.token));
|
||||
};
|
||||
|
||||
reader.readAsText(importFiles[0]);
|
||||
}}
|
||||
>
|
||||
<div class="text-sm text-gray-500">
|
||||
<div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3">
|
||||
<div>Please carefully review the following warnings:</div>
|
||||
|
||||
<ul class=" mt-1 list-disc pl-4 text-xs">
|
||||
<li>Tools have a function calling system that allows arbitrary code execution.</li>
|
||||
<li>Do not install tools from sources you do not fully trust.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="my-3">
|
||||
I acknowledge that I have read and I understand the implications of my action. I am aware of
|
||||
the risks associated with executing arbitrary code and I have verified the trustworthiness of
|
||||
the source.
|
||||
</div>
|
||||
</div>
|
||||
</ConfirmDialog>
|
||||
@@ -0,0 +1,127 @@
|
||||
<script lang="ts">
|
||||
import CodeEditor from '$lib/components/common/CodeEditor.svelte';
|
||||
import { createEventDispatcher } from 'svelte';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
export let value = '';
|
||||
|
||||
let codeEditor;
|
||||
let boilerplate = `import os
|
||||
import requests
|
||||
from datetime import datetime
|
||||
|
||||
|
||||
class Tools:
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
# Add your custom tools using pure Python code here, make sure to add type hints
|
||||
# Use Sphinx-style docstrings to document your tools, they will be used for generating tools specifications
|
||||
# Please refer to function_calling_filter_pipeline.py file from pipelines project for an example
|
||||
|
||||
def get_user_name_and_email_and_id(self, __user__: dict = {}) -> str:
|
||||
"""
|
||||
Get the user name, Email and ID from the user object.
|
||||
"""
|
||||
|
||||
# Do not include :param for __user__ in the docstring as it should not be shown in the tool's specification
|
||||
# The session user object will be passed as a parameter when the function is called
|
||||
|
||||
print(__user__)
|
||||
result = ""
|
||||
|
||||
if "name" in __user__:
|
||||
result += f"User: {__user__['name']}"
|
||||
if "id" in __user__:
|
||||
result += f" (ID: {__user__['id']})"
|
||||
if "email" in __user__:
|
||||
result += f" (Email: {__user__['email']})"
|
||||
|
||||
if result == "":
|
||||
result = "User: Unknown"
|
||||
|
||||
return result
|
||||
|
||||
def get_current_time(self) -> str:
|
||||
"""
|
||||
Get the current time in a more human-readable format.
|
||||
:return: The current time.
|
||||
"""
|
||||
|
||||
now = datetime.now()
|
||||
current_time = now.strftime("%I:%M:%S %p") # Using 12-hour format with AM/PM
|
||||
current_date = now.strftime(
|
||||
"%A, %B %d, %Y"
|
||||
) # Full weekday, month name, day, and year
|
||||
|
||||
return f"Current Date and Time = {current_date}, {current_time}"
|
||||
|
||||
def calculator(self, equation: str) -> str:
|
||||
"""
|
||||
Calculate the result of an equation.
|
||||
:param equation: The equation to calculate.
|
||||
"""
|
||||
|
||||
# Avoid using eval in production code
|
||||
# https://nedbatchelder.com/blog/201206/eval_really_is_dangerous.html
|
||||
try:
|
||||
result = eval(equation)
|
||||
return f"{equation} = {result}"
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return "Invalid equation"
|
||||
|
||||
def get_current_weather(self, city: str) -> str:
|
||||
"""
|
||||
Get the current weather for a given city.
|
||||
:param city: The name of the city to get the weather for.
|
||||
:return: The current weather information or an error message.
|
||||
"""
|
||||
api_key = os.getenv("OPENWEATHER_API_KEY")
|
||||
if not api_key:
|
||||
return (
|
||||
"API key is not set in the environment variable 'OPENWEATHER_API_KEY'."
|
||||
)
|
||||
|
||||
base_url = "http://api.openweathermap.org/data/2.5/weather"
|
||||
params = {
|
||||
"q": city,
|
||||
"appid": api_key,
|
||||
"units": "metric", # Optional: Use 'imperial' for Fahrenheit
|
||||
}
|
||||
|
||||
try:
|
||||
response = requests.get(base_url, params=params)
|
||||
response.raise_for_status() # Raise HTTPError for bad responses (4xx and 5xx)
|
||||
data = response.json()
|
||||
|
||||
if data.get("cod") != 200:
|
||||
return f"Error fetching weather data: {data.get('message')}"
|
||||
|
||||
weather_description = data["weather"][0]["description"]
|
||||
temperature = data["main"]["temp"]
|
||||
humidity = data["main"]["humidity"]
|
||||
wind_speed = data["wind"]["speed"]
|
||||
|
||||
return f"Weather in {city}: {temperature}°C"
|
||||
except requests.RequestException as e:
|
||||
return f"Error fetching weather data: {str(e)}"
|
||||
`;
|
||||
|
||||
export const formatHandler = async () => {
|
||||
if (codeEditor) {
|
||||
return await codeEditor.formatPythonCodeHandler();
|
||||
}
|
||||
return false;
|
||||
};
|
||||
</script>
|
||||
|
||||
<CodeEditor
|
||||
bind:value
|
||||
{boilerplate}
|
||||
bind:this={codeEditor}
|
||||
on:save={() => {
|
||||
dispatch('save');
|
||||
}}
|
||||
/>
|
||||
@@ -0,0 +1,179 @@
|
||||
<script>
|
||||
import { getContext, createEventDispatcher, onMount } from 'svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
import CodeEditor from './CodeEditor.svelte';
|
||||
import { goto } from '$app/navigation';
|
||||
import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte';
|
||||
|
||||
const dispatch = createEventDispatcher();
|
||||
|
||||
let formElement = null;
|
||||
let loading = false;
|
||||
let showConfirm = false;
|
||||
|
||||
export let edit = false;
|
||||
export let clone = false;
|
||||
|
||||
export let id = '';
|
||||
export let name = '';
|
||||
export let meta = {
|
||||
description: ''
|
||||
};
|
||||
export let content = '';
|
||||
|
||||
$: if (name && !edit && !clone) {
|
||||
id = name.replace(/\s+/g, '_').toLowerCase();
|
||||
}
|
||||
|
||||
let codeEditor;
|
||||
|
||||
const saveHandler = async () => {
|
||||
loading = true;
|
||||
dispatch('save', {
|
||||
id,
|
||||
name,
|
||||
meta,
|
||||
content
|
||||
});
|
||||
};
|
||||
|
||||
const submitHandler = async () => {
|
||||
if (codeEditor) {
|
||||
const res = await codeEditor.formatHandler();
|
||||
|
||||
if (res) {
|
||||
console.log('Code formatted successfully');
|
||||
saveHandler();
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<div class=" flex flex-col justify-between w-full overflow-y-auto h-full">
|
||||
<div class="mx-auto w-full md:px-0 h-full">
|
||||
<form
|
||||
bind:this={formElement}
|
||||
class=" flex flex-col max-h-[100dvh] h-full"
|
||||
on:submit|preventDefault={() => {
|
||||
if (edit) {
|
||||
submitHandler();
|
||||
} else {
|
||||
showConfirm = true;
|
||||
}
|
||||
}}
|
||||
>
|
||||
<div class="mb-2.5">
|
||||
<button
|
||||
class="flex space-x-1"
|
||||
on:click={() => {
|
||||
goto('/workspace/tools');
|
||||
}}
|
||||
type="button"
|
||||
>
|
||||
<div class=" self-center">
|
||||
<svg
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
viewBox="0 0 20 20"
|
||||
fill="currentColor"
|
||||
class="w-4 h-4"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
d="M17 10a.75.75 0 01-.75.75H5.612l4.158 3.96a.75.75 0 11-1.04 1.08l-5.5-5.25a.75.75 0 010-1.08l5.5-5.25a.75.75 0 111.04 1.08L5.612 9.25H16.25A.75.75 0 0117 10z"
|
||||
clip-rule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<div class=" self-center font-medium text-sm">{$i18n.t('Back')}</div>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col flex-1 overflow-auto h-0 rounded-lg">
|
||||
<div class="w-full mb-2 flex flex-col gap-1.5">
|
||||
<div class="flex gap-2 w-full">
|
||||
<input
|
||||
class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
|
||||
type="text"
|
||||
placeholder="Toolkit Name (e.g. My ToolKit)"
|
||||
bind:value={name}
|
||||
required
|
||||
/>
|
||||
|
||||
<input
|
||||
class="w-full px-3 py-2 text-sm font-medium disabled:text-gray-300 dark:disabled:text-gray-700 bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
|
||||
type="text"
|
||||
placeholder="Toolkit ID (e.g. my_toolkit)"
|
||||
bind:value={id}
|
||||
required
|
||||
disabled={edit}
|
||||
/>
|
||||
</div>
|
||||
<input
|
||||
class="w-full px-3 py-2 text-sm font-medium bg-gray-50 dark:bg-gray-850 dark:text-gray-200 rounded-lg outline-none"
|
||||
type="text"
|
||||
placeholder="Toolkit Description (e.g. A toolkit for performing various operations)"
|
||||
bind:value={meta.description}
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="mb-2 flex-1 overflow-auto h-0 rounded-lg">
|
||||
<CodeEditor
|
||||
bind:value={content}
|
||||
bind:this={codeEditor}
|
||||
on:save={() => {
|
||||
if (formElement) {
|
||||
formElement.requestSubmit();
|
||||
}
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="pb-3 flex justify-between">
|
||||
<div class="flex-1 pr-3">
|
||||
<div class="text-xs text-gray-500 line-clamp-2">
|
||||
<span class=" font-semibold dark:text-gray-200">Warning:</span> Tools are a function
|
||||
calling system with arbitrary code execution <br />—
|
||||
<span class=" font-medium dark:text-gray-400"
|
||||
>don't install random tools from sources you don't trust.</span
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<button
|
||||
class="px-3 py-1.5 text-sm font-medium bg-emerald-600 hover:bg-emerald-700 text-gray-50 transition rounded-lg"
|
||||
type="submit"
|
||||
>
|
||||
{$i18n.t('Save')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ConfirmDialog
|
||||
bind:show={showConfirm}
|
||||
on:confirm={() => {
|
||||
submitHandler();
|
||||
}}
|
||||
>
|
||||
<div class="text-sm text-gray-500">
|
||||
<div class=" bg-yellow-500/20 text-yellow-700 dark:text-yellow-200 rounded-lg px-4 py-3">
|
||||
<div>Please carefully review the following warnings:</div>
|
||||
|
||||
<ul class=" mt-1 list-disc pl-4 text-xs">
|
||||
<li>Tools have a function calling system that allows arbitrary code execution.</li>
|
||||
<li>Do not install tools from sources you do not fully trust.</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="my-3">
|
||||
I acknowledge that I have read and I understand the implications of my action. I am aware of
|
||||
the risks associated with executing arbitrary code and I have verified the trustworthiness of
|
||||
the source.
|
||||
</div>
|
||||
</div>
|
||||
</ConfirmDialog>
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "لوحة التحكم",
|
||||
"Admin Settings": "اعدادات المشرف",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "التعليمات المتقدمة",
|
||||
"Advanced Params": "المعلمات المتقدمة",
|
||||
"all": "الكل",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "أدخل النتيجة",
|
||||
"Enter Searxng Query URL": "أدخل عنوان URL لاستعلام Searxng",
|
||||
"Enter Serper API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "أدخل مفتاح واجهة برمجة تطبيقات Serpstack",
|
||||
"Enter stop sequence": "أدخل تسلسل التوقف",
|
||||
"Enter Top K": "أدخل Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "تصدير وثائق الخرائط",
|
||||
"Export Models": "نماذج التصدير",
|
||||
"Export Prompts": "مطالبات التصدير",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "فشل في إنشاء مفتاح API.",
|
||||
"Failed to read clipboard contents": "فشل في قراءة محتويات الحافظة",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "استيراد خرائط المستندات",
|
||||
"Import Models": "استيراد النماذج",
|
||||
"Import Prompts": "مطالبات الاستيراد",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "قم بتضمين علامة `-api` عند تشغيل Stable-diffusion-webui",
|
||||
"Info": "معلومات",
|
||||
"Input commands": "إدخال الأوامر",
|
||||
@@ -419,13 +423,14 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "عدد نتائج البحث",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_zero": "تم البحث في {{count}} sites_zero",
|
||||
"Searched {{count}} sites_one": "تم البحث في {{count}} sites_one",
|
||||
"Searched {{count}} sites_two": "تم البحث في {{count}} sites_two",
|
||||
"Searched {{count}} sites_few": "تم البحث في {{count}} sites_few",
|
||||
"Searched {{count}} sites_many": "تم البحث في {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "تم البحث في {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "البحث في الويب عن \"{{searchQuery}}\"",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "عنوان URL لاستعلام Searxng",
|
||||
"See readme.md for instructions": "readme.md للحصول على التعليمات",
|
||||
"See what's new": "ما الجديد",
|
||||
@@ -437,6 +442,7 @@
|
||||
"Select a pipeline": "حدد مسارا",
|
||||
"Select a pipeline url": "حدد عنوان URL لخط الأنابيب",
|
||||
"Select an Ollama instance": "أختار سيرفر ",
|
||||
"Select Documents": "",
|
||||
"Select model": " أختار موديل",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "النموذج (النماذج) المحددة لا تدعم مدخلات الصور",
|
||||
@@ -445,6 +451,7 @@
|
||||
"Send message": "يُرجى إدخال طلبك هنا.",
|
||||
"September": "سبتمبر",
|
||||
"Serper API Key": "مفتاح واجهة برمجة تطبيقات سيربر",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "مفتاح واجهة برمجة تطبيقات Serpstack",
|
||||
"Server connection verified": "تم التحقق من اتصال الخادم",
|
||||
"Set as default": "الافتراضي",
|
||||
@@ -509,10 +516,13 @@
|
||||
"To access the available model names for downloading,": "للوصول إلى أسماء الموديلات المتاحة للتنزيل،",
|
||||
"To access the GGUF models available for downloading,": "للوصول إلى الموديلات GGUF المتاحة للتنزيل،",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "الى كتابة المحادثه",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "اليوم",
|
||||
"Toggle settings": "فتح وأغلاق الاعدادات",
|
||||
"Toggle sidebar": "فتح وأغلاق الشريط الجانبي",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "هل تواجه مشكلة في الوصول",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Панел на Администратор",
|
||||
"Admin Settings": "Настройки на Администратор",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Разширени Параметри",
|
||||
"Advanced Params": "Разширени параметри",
|
||||
"all": "всички",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Въведете оценка",
|
||||
"Enter Searxng Query URL": "Въведете URL адреса на заявката на Searxng",
|
||||
"Enter Serper API Key": "Въведете Serper API ключ",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Въведете Serpstack API ключ",
|
||||
"Enter stop sequence": "Въведете стоп последователност",
|
||||
"Enter Top K": "Въведете Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Експортване на документен мапинг",
|
||||
"Export Models": "Експортиране на модели",
|
||||
"Export Prompts": "Експортване на промптове",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Неуспешно създаване на API ключ.",
|
||||
"Failed to read clipboard contents": "Грешка при четене на съдържанието от клипборда",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Импортване на документен мапинг",
|
||||
"Import Models": "Импортиране на модели",
|
||||
"Import Prompts": "Импортване на промптове",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Включете флага `--api`, когато стартирате stable-diffusion-webui",
|
||||
"Info": "Информация",
|
||||
"Input commands": "Въведете команди",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Брой резултати от търсенето",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Търси се в {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "Търси се в {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Търсене в уеб за '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "URL адрес на заявка на Searxng",
|
||||
"See readme.md for instructions": "Виж readme.md за инструкции",
|
||||
"See what's new": "Виж какво е новото",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "Изберете тръбопровод",
|
||||
"Select a pipeline url": "Избор на URL адрес на канал",
|
||||
"Select an Ollama instance": "Изберете Ollama инстанция",
|
||||
"Select Documents": "",
|
||||
"Select model": "Изберете модел",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Избраният(те) модел(и) не поддържа въвеждане на изображения",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "Изпращане на съобщение",
|
||||
"September": "Септември",
|
||||
"Serper API Key": "Serper API ключ",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API ключ",
|
||||
"Server connection verified": "Server connection verified",
|
||||
"Set as default": "Задай по подразбиране",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "За да получите достъп до наличните имена на модели за изтегляне,",
|
||||
"To access the GGUF models available for downloading,": "За да получите достъп до GGUF моделите, налични за изтегляне,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "към чат входа.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "днес",
|
||||
"Toggle settings": "Toggle settings",
|
||||
"Toggle sidebar": "Toggle sidebar",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Проблеми с достъпът до Ollama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "এডমিন প্যানেল",
|
||||
"Admin Settings": "এডমিন সেটিংস",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "এডভান্সড প্যারামিটার্স",
|
||||
"Advanced Params": "অ্যাডভান্সড প্যারাম",
|
||||
"all": "সব",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "স্কোর দিন",
|
||||
"Enter Searxng Query URL": "Searxng ক্যোয়ারী URL লিখুন",
|
||||
"Enter Serper API Key": "Serper API কী লিখুন",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Serpstack API কী লিখুন",
|
||||
"Enter stop sequence": "স্টপ সিকোয়েন্স লিখুন",
|
||||
"Enter Top K": "Top K লিখুন",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "ডকুমেন্টসমূহ ম্যাপিং এক্সপোর্ট করুন",
|
||||
"Export Models": "রপ্তানি মডেল",
|
||||
"Export Prompts": "প্রম্পটগুলো একপোর্ট করুন",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API Key তৈরি করা যায়নি।",
|
||||
"Failed to read clipboard contents": "ক্লিপবোর্ডের বিষয়বস্তু পড়া সম্ভব হয়নি",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "ডকুমেন্টসমূহ ম্যাপিং ইমপোর্ট করুন",
|
||||
"Import Models": "মডেল আমদানি করুন",
|
||||
"Import Prompts": "প্রম্পটগুলো ইমপোর্ট করুন",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui চালু করার সময় `--api` ফ্ল্যাগ সংযুক্ত করুন",
|
||||
"Info": "তথ্য",
|
||||
"Input commands": "ইনপুট কমান্ডস",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "অনুসন্ধানের ফলাফল গণনা",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "{{কাউন্ট}} অনুসন্ধান করা হয়েছে sites_one",
|
||||
"Searched {{count}} sites_other": "{{কাউন্ট}} অনুসন্ধান করা হয়েছে sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "'{{searchQuery}}' এর জন্য ওয়েবে অনুসন্ধান করা হচ্ছে",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng ক্যোয়ারী URL",
|
||||
"See readme.md for instructions": "নির্দেশিকার জন্য readme.md দেখুন",
|
||||
"See what's new": "নতুন কী আছে দেখুন",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "একটি পাইপলাইন নির্বাচন করুন",
|
||||
"Select a pipeline url": "একটি পাইপলাইন URL নির্বাচন করুন",
|
||||
"Select an Ollama instance": "একটি Ollama ইন্সট্যান্স নির্বাচন করুন",
|
||||
"Select Documents": "",
|
||||
"Select model": "মডেল নির্বাচন করুন",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "নির্বাচিত মডেল(গুলি) চিত্র ইনপুট সমর্থন করে না",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "মেসেজ পাঠান",
|
||||
"September": "সেপ্টেম্বর",
|
||||
"Serper API Key": "Serper API Key",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API Key",
|
||||
"Server connection verified": "সার্ভার কানেকশন যাচাই করা হয়েছে",
|
||||
"Set as default": "ডিফল্ট হিসেবে নির্ধারণ করুন",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "ডাউনলোডের জন্য এভেইলএবল মডেলের নামগুলো এক্সেস করতে,",
|
||||
"To access the GGUF models available for downloading,": "ডাউলোডের জন্য এভেইলএবল GGUF মডেলগুলো এক্সেস করতে,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "চ্যাট ইনপুটে",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "আজ",
|
||||
"Toggle settings": "সেটিংস টোগল",
|
||||
"Toggle sidebar": "সাইডবার টোগল",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Ollama এক্সেস করতে সমস্যা হচ্ছে?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Panell d'Administració",
|
||||
"Admin Settings": "Configuració d'Administració",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Paràmetres Avançats",
|
||||
"Advanced Params": "Paràmetres avançats",
|
||||
"all": "tots",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Introdueix el Puntuació",
|
||||
"Enter Searxng Query URL": "Introduïu l'URL de consulta de Searxng",
|
||||
"Enter Serper API Key": "Introduïu la clau de l'API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Introduïu la clau de l'API Serpstack",
|
||||
"Enter stop sequence": "Introdueix la seqüència de parada",
|
||||
"Enter Top K": "Introdueix Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Exporta el Mapatge de Documents",
|
||||
"Export Models": "Models d'exportació",
|
||||
"Export Prompts": "Exporta Prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "No s'ha pogut crear la clau d'API.",
|
||||
"Failed to read clipboard contents": "No s'ha pogut llegir el contingut del porta-retalls",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Importa el Mapa de Documents",
|
||||
"Import Models": "Models d'importació",
|
||||
"Import Prompts": "Importa Prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui",
|
||||
"Info": "Informació",
|
||||
"Input commands": "Entra ordres",
|
||||
@@ -419,10 +423,11 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Recompte de resultats de cerca",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Cercat {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Cercat {{recompte}} sites_many",
|
||||
"Searched {{count}} sites_other": "Cercat {{recompte}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Cerca a la web de '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng URL de consulta",
|
||||
"See readme.md for instructions": "Consulta el readme.md per a instruccions",
|
||||
"See what's new": "Veure novetats",
|
||||
@@ -434,6 +439,7 @@
|
||||
"Select a pipeline": "Seleccioneu una canonada",
|
||||
"Select a pipeline url": "Seleccionar un URL de canonada",
|
||||
"Select an Ollama instance": "Selecciona una instància d'Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Selecciona un model",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Els models seleccionats no admeten l'entrada d'imatges",
|
||||
@@ -442,6 +448,7 @@
|
||||
"Send message": "Envia missatge",
|
||||
"September": "Setembre",
|
||||
"Serper API Key": "Clau API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API Key",
|
||||
"Server connection verified": "Connexió al servidor verificada",
|
||||
"Set as default": "Estableix com a predeterminat",
|
||||
@@ -506,10 +513,13 @@
|
||||
"To access the available model names for downloading,": "Per accedir als noms dels models disponibles per descarregar,",
|
||||
"To access the GGUF models available for downloading,": "Per accedir als models GGUF disponibles per descarregar,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "a l'entrada del xat.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Avui",
|
||||
"Toggle settings": "Commuta configuracions",
|
||||
"Toggle sidebar": "Commuta barra lateral",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemes accedint a Ollama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Admin Panel",
|
||||
"Admin Settings": "Mga setting sa administratibo",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "advanced settings",
|
||||
"Advanced Params": "",
|
||||
"all": "tanan",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "",
|
||||
"Enter Searxng Query URL": "",
|
||||
"Enter Serper API Key": "",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "Pagsulod sa katapusan nga han-ay",
|
||||
"Enter Top K": "Pagsulod sa Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "I-export ang pagmapa sa dokumento",
|
||||
"Export Models": "",
|
||||
"Export Prompts": "Export prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "",
|
||||
"Failed to read clipboard contents": "Napakyas sa pagbasa sa sulod sa clipboard",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Import nga pagmapa sa dokumento",
|
||||
"Import Models": "",
|
||||
"Import Prompts": "Import prompt",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Iapil ang `--api` nga bandila kung nagdagan nga stable-diffusion-webui",
|
||||
"Info": "",
|
||||
"Input commands": "Pagsulod sa input commands",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "",
|
||||
"Searched {{count}} sites_other": "",
|
||||
"Searching the web for '{{searchQuery}}'": "",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "",
|
||||
"See readme.md for instructions": "Tan-awa ang readme.md alang sa mga panudlo",
|
||||
"See what's new": "Tan-awa unsay bag-o",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select an Ollama instance": "Pagpili usa ka pananglitan sa Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Pagpili og modelo",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "Magpadala ug mensahe",
|
||||
"September": "",
|
||||
"Serper API Key": "",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "",
|
||||
"Server connection verified": "Gipamatud-an nga koneksyon sa server",
|
||||
"Set as default": "Define pinaagi sa default",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "Aron ma-access ang mga ngalan sa modelo nga ma-download,",
|
||||
"To access the GGUF models available for downloading,": "Aron ma-access ang mga modelo sa GGUF nga magamit alang sa pag-download,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "sa entrada sa iring.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
"Toggle settings": "I-toggle ang mga setting",
|
||||
"Toggle sidebar": "I-toggle ang sidebar",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Ibabaw nga P",
|
||||
"Trouble accessing Ollama?": "Adunay mga problema sa pag-access sa Ollama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Admin Panel",
|
||||
"Admin Settings": "Admin Einstellungen",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Erweiterte Parameter",
|
||||
"Advanced Params": "Erweiterte Parameter",
|
||||
"all": "Alle",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Score eingeben",
|
||||
"Enter Searxng Query URL": "Geben Sie die Searxng-Abfrage-URL ein",
|
||||
"Enter Serper API Key": "Serper-API-Schlüssel eingeben",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Geben Sie den Serpstack-API-Schlüssel ein",
|
||||
"Enter stop sequence": "Stop-Sequenz eingeben",
|
||||
"Enter Top K": "Gib Top K ein",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Dokumentenmapping exportieren",
|
||||
"Export Models": "Modelle exportieren",
|
||||
"Export Prompts": "Prompts exportieren",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API Key erstellen fehlgeschlagen",
|
||||
"Failed to read clipboard contents": "Fehler beim Lesen des Zwischenablageninhalts",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Dokumentenmapping importieren",
|
||||
"Import Models": "Modelle importieren",
|
||||
"Import Prompts": "Prompts importieren",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Füge das `--api`-Flag hinzu, wenn du stable-diffusion-webui nutzt",
|
||||
"Info": "Info",
|
||||
"Input commands": "Eingabebefehle",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Anzahl der Suchergebnisse",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Gesucht {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "Gesucht {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Suche im Web nach '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng-Abfrage-URL",
|
||||
"See readme.md for instructions": "Anleitung in readme.md anzeigen",
|
||||
"See what's new": "Was gibt's Neues",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "Wählen Sie eine Pipeline aus",
|
||||
"Select a pipeline url": "Auswählen einer Pipeline-URL",
|
||||
"Select an Ollama instance": "Eine Ollama Instanz auswählen",
|
||||
"Select Documents": "",
|
||||
"Select model": "Modell auswählen",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Ausgewählte Modelle unterstützen keine Bildeingaben",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "Nachricht senden",
|
||||
"September": "September",
|
||||
"Serper API Key": "Serper-API-Schlüssel",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack-API-Schlüssel",
|
||||
"Server connection verified": "Serververbindung überprüft",
|
||||
"Set as default": "Als Standard festlegen",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "Um auf die verfügbaren Modellnamen zum Herunterladen zuzugreifen,",
|
||||
"To access the GGUF models available for downloading,": "Um auf die verfügbaren GGUF Modelle zum Herunterladen zuzugreifen",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "to chat input.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Heute",
|
||||
"Toggle settings": "Einstellungen umschalten",
|
||||
"Toggle sidebar": "Seitenleiste umschalten",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Probleme beim Zugriff auf Ollama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Admin Panel",
|
||||
"Admin Settings": "Admin Settings",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Advanced Parameters",
|
||||
"Advanced Params": "",
|
||||
"all": "all",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "",
|
||||
"Enter Searxng Query URL": "",
|
||||
"Enter Serper API Key": "",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "Enter stop bark",
|
||||
"Enter Top K": "Enter Top Wow",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Export Mappings of Dogos",
|
||||
"Export Models": "",
|
||||
"Export Prompts": "Export Promptos",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "",
|
||||
"Failed to read clipboard contents": "Failed to read clipboard borks",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Import Doge Mapping",
|
||||
"Import Models": "",
|
||||
"Import Prompts": "Import Promptos",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Include `--api` flag when running stable-diffusion-webui",
|
||||
"Info": "",
|
||||
"Input commands": "Input commands",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "",
|
||||
"Searched {{count}} sites_other": "",
|
||||
"Searching the web for '{{searchQuery}}'": "",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "",
|
||||
"See readme.md for instructions": "See readme.md for instructions wow",
|
||||
"See what's new": "See what's new so amaze",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select an Ollama instance": "Select an Ollama instance very choose",
|
||||
"Select Documents": "",
|
||||
"Select model": "Select model much choice",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "Send message very send",
|
||||
"September": "",
|
||||
"Serper API Key": "",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "",
|
||||
"Server connection verified": "Server connection verified much secure",
|
||||
"Set as default": "Set as default very default",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "To access the available model names for downloading, much access",
|
||||
"To access the GGUF models available for downloading,": "To access the GGUF models available for downloading, much access",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "to chat input. Very chat.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
"Toggle settings": "Toggle settings much toggle",
|
||||
"Toggle sidebar": "Toggle sidebar much toggle",
|
||||
"Tools": "",
|
||||
"Top K": "Top K very top",
|
||||
"Top P": "Top P very top",
|
||||
"Trouble accessing Ollama?": "Trouble accessing Ollama? Much trouble?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "",
|
||||
"Admin Settings": "",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "",
|
||||
"Advanced Params": "",
|
||||
"all": "",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "",
|
||||
"Enter Searxng Query URL": "",
|
||||
"Enter Serper API Key": "",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "",
|
||||
"Enter Top K": "",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "",
|
||||
"Export Models": "",
|
||||
"Export Prompts": "",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "",
|
||||
"Failed to read clipboard contents": "",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "",
|
||||
"Import Models": "",
|
||||
"Import Prompts": "",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "",
|
||||
"Info": "",
|
||||
"Input commands": "",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "",
|
||||
"Searched {{count}} sites_other": "",
|
||||
"Searching the web for '{{searchQuery}}'": "",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "",
|
||||
"See readme.md for instructions": "",
|
||||
"See what's new": "",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select an Ollama instance": "",
|
||||
"Select Documents": "",
|
||||
"Select model": "",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "",
|
||||
"September": "",
|
||||
"Serper API Key": "",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "",
|
||||
"Server connection verified": "",
|
||||
"Set as default": "",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "",
|
||||
"To access the GGUF models available for downloading,": "",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
"Toggle settings": "",
|
||||
"Toggle sidebar": "",
|
||||
"Tools": "",
|
||||
"Top K": "",
|
||||
"Top P": "",
|
||||
"Trouble accessing Ollama?": "",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "",
|
||||
"Admin Settings": "",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "",
|
||||
"Advanced Params": "",
|
||||
"all": "",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "",
|
||||
"Enter Searxng Query URL": "",
|
||||
"Enter Serper API Key": "",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "",
|
||||
"Enter Top K": "",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "",
|
||||
"Export Models": "",
|
||||
"Export Prompts": "",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "",
|
||||
"Failed to read clipboard contents": "",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "",
|
||||
"Import Models": "",
|
||||
"Import Prompts": "",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "",
|
||||
"Info": "",
|
||||
"Input commands": "",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "",
|
||||
"Searched {{count}} sites_other": "",
|
||||
"Searching the web for '{{searchQuery}}'": "",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "",
|
||||
"See readme.md for instructions": "",
|
||||
"See what's new": "",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select an Ollama instance": "",
|
||||
"Select Documents": "",
|
||||
"Select model": "",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "",
|
||||
"September": "",
|
||||
"Serper API Key": "",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "",
|
||||
"Server connection verified": "",
|
||||
"Set as default": "",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "",
|
||||
"To access the GGUF models available for downloading,": "",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
"Toggle settings": "",
|
||||
"Toggle sidebar": "",
|
||||
"Tools": "",
|
||||
"Top K": "",
|
||||
"Top P": "",
|
||||
"Trouble accessing Ollama?": "",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Panel de Administración",
|
||||
"Admin Settings": "Configuración de Administrador",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Parámetros Avanzados",
|
||||
"Advanced Params": "Parámetros avanzados",
|
||||
"all": "todo",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Ingrese la puntuación",
|
||||
"Enter Searxng Query URL": "Introduzca la URL de consulta de Searxng",
|
||||
"Enter Serper API Key": "Ingrese la clave API de Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Ingrese la clave API de Serpstack",
|
||||
"Enter stop sequence": "Ingrese la secuencia de parada",
|
||||
"Enter Top K": "Ingrese el Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Exportar el mapeo de documentos",
|
||||
"Export Models": "Modelos de exportación",
|
||||
"Export Prompts": "Exportar Prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "No se pudo crear la clave API.",
|
||||
"Failed to read clipboard contents": "No se pudo leer el contenido del portapapeles",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Importar Mapeo de Documentos",
|
||||
"Import Models": "Importar modelos",
|
||||
"Import Prompts": "Importar Prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Incluir el indicador `--api` al ejecutar stable-diffusion-webui",
|
||||
"Info": "Información",
|
||||
"Input commands": "Ingresar comandos",
|
||||
@@ -419,10 +423,11 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Recuento de resultados de búsqueda",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Buscado {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Buscado {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Buscó {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Buscando en la web '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng URL de consulta",
|
||||
"See readme.md for instructions": "Vea el readme.md para instrucciones",
|
||||
"See what's new": "Ver las novedades",
|
||||
@@ -434,6 +439,7 @@
|
||||
"Select a pipeline": "Selección de una canalización",
|
||||
"Select a pipeline url": "Selección de una dirección URL de canalización",
|
||||
"Select an Ollama instance": "Seleccione una instancia de Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Selecciona un modelo",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Los modelos seleccionados no admiten entradas de imagen",
|
||||
@@ -442,6 +448,7 @@
|
||||
"Send message": "Enviar Mensaje",
|
||||
"September": "Septiembre",
|
||||
"Serper API Key": "Clave API de Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Clave API de Serpstack",
|
||||
"Server connection verified": "Conexión del servidor verificada",
|
||||
"Set as default": "Establecer por defecto",
|
||||
@@ -506,10 +513,13 @@
|
||||
"To access the available model names for downloading,": "Para acceder a los nombres de modelos disponibles para descargar,",
|
||||
"To access the GGUF models available for downloading,": "Para acceder a los modelos GGUF disponibles para descargar,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "a la entrada del chat.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Hoy",
|
||||
"Toggle settings": "Alternar configuración",
|
||||
"Toggle sidebar": "Alternar barra lateral",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "¿Problemas para acceder a Ollama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "پنل مدیریت",
|
||||
"Admin Settings": "تنظیمات مدیریت",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "پارامترهای پیشرفته",
|
||||
"Advanced Params": "پارام های پیشرفته",
|
||||
"all": "همه",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "امتیاز را وارد کنید",
|
||||
"Enter Searxng Query URL": "نشانی وب پرسوجوی Searxng را وارد کنید",
|
||||
"Enter Serper API Key": "کلید API Serper را وارد کنید",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "کلید API Serpstack را وارد کنید",
|
||||
"Enter stop sequence": "توالی توقف را وارد کنید",
|
||||
"Enter Top K": "مقدار Top K را وارد کنید",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "اکسپورت از نگاشت اسناد",
|
||||
"Export Models": "مدل های صادرات",
|
||||
"Export Prompts": "اکسپورت از پرامپت\u200cها",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "ایجاد کلید API با خطا مواجه شد.",
|
||||
"Failed to read clipboard contents": "خواندن محتوای کلیپ بورد ناموفق بود",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "ایمپورت نگاشت اسناد",
|
||||
"Import Models": "واردات مدلها",
|
||||
"Import Prompts": "ایمپورت پرامپت\u200cها",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "فلگ `--api` را هنکام اجرای stable-diffusion-webui استفاده کنید.",
|
||||
"Info": "اطلاعات",
|
||||
"Input commands": "ورودی دستورات",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "تعداد نتایج جستجو",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "جستجو {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "جستجو {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "جستجو در وب برای '{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "نشانی وب جستجوی Searxng",
|
||||
"See readme.md for instructions": "برای مشاهده دستورالعمل\u200cها به readme.md مراجعه کنید",
|
||||
"See what's new": "ببینید موارد جدید چه بوده",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "انتخاب یک خط لوله",
|
||||
"Select a pipeline url": "یک ادرس خط لوله را انتخاب کنید",
|
||||
"Select an Ollama instance": "انتخاب یک نمونه از اولاما",
|
||||
"Select Documents": "",
|
||||
"Select model": "انتخاب یک مدل",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "مدل) های (انتخاب شده ورودیهای تصویر را پشتیبانی نمیکند",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "ارسال پیام",
|
||||
"September": "سپتامبر",
|
||||
"Serper API Key": "کلید API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "کلید API Serpstack",
|
||||
"Server connection verified": "اتصال سرور تأیید شد",
|
||||
"Set as default": "تنظیم به عنوان پیشفرض",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "برای دسترسی به نام مدل های موجود برای دانلود،",
|
||||
"To access the GGUF models available for downloading,": "برای دسترسی به مدل\u200cهای GGUF موجود برای دانلود،",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "در ورودی گپ.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "امروز",
|
||||
"Toggle settings": "نمایش/عدم نمایش تنظیمات",
|
||||
"Toggle sidebar": "نمایش/عدم نمایش نوار کناری",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "در دسترسی به اولاما مشکل دارید؟",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Hallintapaneeli",
|
||||
"Admin Settings": "Hallinta-asetukset",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Edistyneet parametrit",
|
||||
"Advanced Params": "Edistyneet parametrit",
|
||||
"all": "kaikki",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Syötä pisteet",
|
||||
"Enter Searxng Query URL": "Kirjoita Searxng-kyselyn URL-osoite",
|
||||
"Enter Serper API Key": "Anna Serper API -avain",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Anna Serpstack API -avain",
|
||||
"Enter stop sequence": "Syötä lopetussekvenssi",
|
||||
"Enter Top K": "Syötä Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Vie asiakirjakartoitus",
|
||||
"Export Models": "Vie malleja",
|
||||
"Export Prompts": "Vie kehotteet",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API-avaimen luonti epäonnistui.",
|
||||
"Failed to read clipboard contents": "Leikepöydän sisällön lukeminen epäonnistui",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Tuo asiakirjakartoitus",
|
||||
"Import Models": "Mallien tuominen",
|
||||
"Import Prompts": "Tuo kehotteita",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Sisällytä `--api`-parametri suorittaessasi stable-diffusion-webui",
|
||||
"Info": "Info",
|
||||
"Input commands": "Syötä komennot",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Hakutulosten määrä",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Haettu {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "Haku {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Haku verkosta hakusanalla {{searchQuery}}",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng-kyselyn URL-osoite",
|
||||
"See readme.md for instructions": "Katso lisää ohjeita readme.md:stä",
|
||||
"See what's new": "Katso, mitä uutta",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "Valitse putki",
|
||||
"Select a pipeline url": "Valitse putken URL-osoite",
|
||||
"Select an Ollama instance": "Valitse Ollama-instanssi",
|
||||
"Select Documents": "",
|
||||
"Select model": "Valitse malli",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Valitut mallit eivät tue kuvasyötteitä",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "Lähetä viesti",
|
||||
"September": "syyskuu",
|
||||
"Serper API Key": "Serper API -avain",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API -avain",
|
||||
"Server connection verified": "Palvelinyhteys varmennettu",
|
||||
"Set as default": "Aseta oletukseksi",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "Päästäksesi käsiksi ladattavissa oleviin mallinimiin,",
|
||||
"To access the GGUF models available for downloading,": "Päästäksesi käsiksi ladattavissa oleviin GGUF-malleihin,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "keskustelusyötteeseen.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Tänään",
|
||||
"Toggle settings": "Kytke asetukset",
|
||||
"Toggle sidebar": "Kytke sivupalkki",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Ongelmia Ollama-yhteydessä?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Panneau d'administration",
|
||||
"Admin Settings": "Paramètres d'administration",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Paramètres avancés",
|
||||
"Advanced Params": "Params avancés",
|
||||
"all": "tous",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Entrez le score",
|
||||
"Enter Searxng Query URL": "Entrez l’URL de requête Searxng",
|
||||
"Enter Serper API Key": "Entrez la clé API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Entrez dans la clé API Serpstack",
|
||||
"Enter stop sequence": "Entrez la séquence de fin",
|
||||
"Enter Top K": "Entrez Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Exporter le mappage des documents",
|
||||
"Export Models": "Modèles d’exportation",
|
||||
"Export Prompts": "Exporter les prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Impossible de créer la clé API.",
|
||||
"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Importer le mappage des documents",
|
||||
"Import Models": "Importer des modèles",
|
||||
"Import Prompts": "Importer les prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inclure l'indicateur `--api` lors de l'exécution de stable-diffusion-webui",
|
||||
"Info": "L’info",
|
||||
"Input commands": "Entrez des commandes d'entrée",
|
||||
@@ -419,10 +423,11 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Nombre de résultats de la recherche",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Recherche dans {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Recherche dans {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Recherche dans {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Recherche sur le Web pour '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "URL de la requête Searxng",
|
||||
"See readme.md for instructions": "Voir readme.md pour les instructions",
|
||||
"See what's new": "Voir les nouveautés",
|
||||
@@ -434,6 +439,7 @@
|
||||
"Select a pipeline": "Sélectionner un pipeline",
|
||||
"Select a pipeline url": "Sélectionnez une URL de pipeline",
|
||||
"Select an Ollama instance": "Sélectionner une instance Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Sélectionnez un modèle",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Les modèles sélectionnés ne prennent pas en charge les entrées d’image",
|
||||
@@ -442,6 +448,7 @@
|
||||
"Send message": "Envoyer un message",
|
||||
"September": "Septembre",
|
||||
"Serper API Key": "Clé API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Clé API Serpstack",
|
||||
"Server connection verified": "Connexion au serveur vérifiée",
|
||||
"Set as default": "Définir par défaut",
|
||||
@@ -506,10 +513,13 @@
|
||||
"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
|
||||
"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "à l'entrée du chat.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Aujourd'hui",
|
||||
"Toggle settings": "Basculer les paramètres",
|
||||
"Toggle sidebar": "Basculer la barre latérale",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Des problèmes pour accéder à Ollama ?",
|
||||
@@ -523,7 +533,7 @@
|
||||
"Update and Copy Link": "Mettre à jour et copier le lien",
|
||||
"Update password": "Mettre à jour le mot de passe",
|
||||
"Upload a GGUF model": "Téléverser un modèle GGUF",
|
||||
"Upload Files": "Télécharger des fichiers",
|
||||
"Upload Files": "Téléverser des fichiers",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Progression du Téléversement",
|
||||
"URL Mode": "Mode URL",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Panneau d'Administration",
|
||||
"Admin Settings": "Paramètres d'Administration",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Paramètres Avancés",
|
||||
"Advanced Params": "Params Avancés",
|
||||
"all": "tous",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Entrez le Score",
|
||||
"Enter Searxng Query URL": "Entrez l’URL de la requête Searxng",
|
||||
"Enter Serper API Key": "Entrez la clé API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Entrez la clé API Serpstack",
|
||||
"Enter stop sequence": "Entrez la séquence de fin",
|
||||
"Enter Top K": "Entrez Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Exporter la Correspondance des Documents",
|
||||
"Export Models": "Exporter les Modèles",
|
||||
"Export Prompts": "Exporter les Prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Échec de la création de la clé d'API.",
|
||||
"Failed to read clipboard contents": "Échec de la lecture du contenu du presse-papiers",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Importer la Correspondance des Documents",
|
||||
"Import Models": "Importer des Modèles",
|
||||
"Import Prompts": "Importer des Prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inclure le drapeau `--api` lors de l'exécution de stable-diffusion-webui",
|
||||
"Info": "Info",
|
||||
"Input commands": "Entrez les commandes d'entrée",
|
||||
@@ -419,10 +423,11 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Nombre de résultats de recherche",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Recherché {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Recherché {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Recherché {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Recherche sur le web pour '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "URL de requête Searxng",
|
||||
"See readme.md for instructions": "Voir readme.md pour les instructions",
|
||||
"See what's new": "Voir les nouveautés",
|
||||
@@ -434,6 +439,7 @@
|
||||
"Select a pipeline": "Sélectionner un pipeline",
|
||||
"Select a pipeline url": "Sélectionnez une URL de pipeline",
|
||||
"Select an Ollama instance": "Sélectionner une instance Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Sélectionner un modèle",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Modèle(s) séléctionés ne supportent pas les entrées images",
|
||||
@@ -442,6 +448,7 @@
|
||||
"Send message": "Envoyer un message",
|
||||
"September": "Septembre",
|
||||
"Serper API Key": "Clé API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Clé API Serpstack",
|
||||
"Server connection verified": "Connexion au serveur vérifiée",
|
||||
"Set as default": "Définir par défaut",
|
||||
@@ -506,10 +513,13 @@
|
||||
"To access the available model names for downloading,": "Pour accéder aux noms de modèles disponibles pour le téléchargement,",
|
||||
"To access the GGUF models available for downloading,": "Pour accéder aux modèles GGUF disponibles pour le téléchargement,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "à l'entrée du chat.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Aujourd'hui",
|
||||
"Toggle settings": "Basculer les paramètres",
|
||||
"Toggle sidebar": "Basculer la barre latérale",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problèmes d'accès à Ollama ?",
|
||||
@@ -523,7 +533,7 @@
|
||||
"Update and Copy Link": "Mettre à Jour et Copier le Lien",
|
||||
"Update password": "Mettre à Jour le Mot de Passe",
|
||||
"Upload a GGUF model": "Téléverser un modèle GGUF",
|
||||
"Upload Files": "Télécharger des fichiers",
|
||||
"Upload Files": "Téléverser des fichiers",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Progress": "Progression du Téléversement",
|
||||
"URL Mode": "Mode URL",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "לוח בקרה למנהל",
|
||||
"Admin Settings": "הגדרות מנהל",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "פרמטרים מתקדמים",
|
||||
"Advanced Params": "פרמטרים מתקדמים",
|
||||
"all": "הכל",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "הזן ציון",
|
||||
"Enter Searxng Query URL": "הזן כתובת URL של שאילתת Searxng",
|
||||
"Enter Serper API Key": "הזן מפתח API של Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "הזן מפתח API של Serpstack",
|
||||
"Enter stop sequence": "הזן רצף עצירה",
|
||||
"Enter Top K": "הזן Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "ייצוא מיפוי מסמכים",
|
||||
"Export Models": "ייצוא מודלים",
|
||||
"Export Prompts": "ייצוא פקודות",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "יצירת מפתח API נכשלה.",
|
||||
"Failed to read clipboard contents": "קריאת תוכן הלוח נכשלה",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "יבוא מיפוי מסמכים",
|
||||
"Import Models": "ייבוא דגמים",
|
||||
"Import Prompts": "יבוא פקודות",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "כלול את הדגל `--api` בעת הרצת stable-diffusion-webui",
|
||||
"Info": "מידע",
|
||||
"Input commands": "פקודות קלט",
|
||||
@@ -419,10 +423,11 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "ספירת תוצאות חיפוש",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "חיפש {{count}} sites_one",
|
||||
"Searched {{count}} sites_two": "חיפש {{count}} sites_two",
|
||||
"Searched {{count}} sites_other": "חיפש {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "חיפוש באינטרנט אחר '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "כתובת URL של שאילתת Searxng",
|
||||
"See readme.md for instructions": "ראה את readme.md להוראות",
|
||||
"See what's new": "ראה מה חדש",
|
||||
@@ -434,6 +439,7 @@
|
||||
"Select a pipeline": "בחר קו צינור",
|
||||
"Select a pipeline url": "בחר כתובת URL של קו צינור",
|
||||
"Select an Ollama instance": "בחר מופע של Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "בחר מודל",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "דגמים נבחרים אינם תומכים בקלט תמונה",
|
||||
@@ -442,6 +448,7 @@
|
||||
"Send message": "שלח הודעה",
|
||||
"September": "ספטמבר",
|
||||
"Serper API Key": "מפתח Serper API",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "מפתח API של Serpstack",
|
||||
"Server connection verified": "החיבור לשרת אומת",
|
||||
"Set as default": "הגדר כברירת מחדל",
|
||||
@@ -506,10 +513,13 @@
|
||||
"To access the available model names for downloading,": "כדי לגשת לשמות הדגמים הזמינים להורדה,",
|
||||
"To access the GGUF models available for downloading,": "כדי לגשת לדגמי GGUF הזמינים להורדה,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "לקלטת שיחה.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "היום",
|
||||
"Toggle settings": "החלפת מצב של הגדרות",
|
||||
"Toggle sidebar": "החלפת מצב של סרגל הצד",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "קשה לגשת לOllama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "व्यवस्थापक पैनल",
|
||||
"Admin Settings": "व्यवस्थापक सेटिंग्स",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "उन्नत पैरामीटर",
|
||||
"Advanced Params": "उन्नत परम",
|
||||
"all": "सभी",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "स्कोर दर्ज करें",
|
||||
"Enter Searxng Query URL": "Searxng क्वेरी URL दर्ज करें",
|
||||
"Enter Serper API Key": "Serper API कुंजी दर्ज करें",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "सर्पस्टैक एपीआई कुंजी दर्ज करें",
|
||||
"Enter stop sequence": "स्टॉप अनुक्रम दर्ज करें",
|
||||
"Enter Top K": "शीर्ष K दर्ज करें",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "निर्यात दस्तावेज़ मैपिंग",
|
||||
"Export Models": "निर्यात मॉडल",
|
||||
"Export Prompts": "प्रॉम्प्ट निर्यात करें",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "एपीआई कुंजी बनाने में विफल.",
|
||||
"Failed to read clipboard contents": "क्लिपबोर्ड सामग्री पढ़ने में विफल",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "दस्तावेज़ मैपिंग आयात करें",
|
||||
"Import Models": "आयात मॉडल",
|
||||
"Import Prompts": "प्रॉम्प्ट आयात करें",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui चलाते समय `--api` ध्वज शामिल करें",
|
||||
"Info": "सूचना-विषयक",
|
||||
"Input commands": "इनपुट क命",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "खोज परिणामों की संख्या",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "{{count}} sites_one खोजा गया",
|
||||
"Searched {{count}} sites_other": "{{count}} sites_other खोजा गया",
|
||||
"Searching the web for '{{searchQuery}}'": "वेब पर '{{searchQuery}}' खोजना",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng क्वेरी URL",
|
||||
"See readme.md for instructions": "निर्देशों के लिए readme.md देखें",
|
||||
"See what's new": "देखें, क्या नया है",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "एक पाइपलाइन का चयन करें",
|
||||
"Select a pipeline url": "एक पाइपलाइन url चुनें",
|
||||
"Select an Ollama instance": "एक Ollama Instance चुनें",
|
||||
"Select Documents": "",
|
||||
"Select model": "मॉडल चुनें",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "चयनित मॉडल छवि इनपुट का समर्थन नहीं करते हैं",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "मेसेज भेजें",
|
||||
"September": "सितंबर",
|
||||
"Serper API Key": "Serper API कुंजी",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "सर्पस्टैक एपीआई कुंजी",
|
||||
"Server connection verified": "सर्वर कनेक्शन सत्यापित",
|
||||
"Set as default": "डिफाल्ट के रूप में सेट",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "डाउनलोड करने के लिए उपलब्ध मॉडल नामों तक पहुंचने के लिए,",
|
||||
"To access the GGUF models available for downloading,": "डाउनलोडिंग के लिए उपलब्ध GGUF मॉडल तक पहुँचने के लिए,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "इनपुट चैट करने के लिए.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "आज",
|
||||
"Toggle settings": "सेटिंग्स टॉगल करें",
|
||||
"Toggle sidebar": "साइडबार टॉगल करें",
|
||||
"Tools": "",
|
||||
"Top K": "शीर्ष K",
|
||||
"Top P": "शीर्ष P",
|
||||
"Trouble accessing Ollama?": "Ollama तक पहुँचने में परेशानी हो रही है?",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
"(e.g. `sh webui.sh --api`)": "(npr. `sh webui.sh --api`)",
|
||||
"(latest)": "(najnovije)",
|
||||
"{{ models }}": "{{ modeli }}",
|
||||
"{{ owner }}: You cannot delete a base model": "{{ vlasnik }}: ne možete izbrisati osnovni model",
|
||||
"{{ owner }}: You cannot delete a base model": "{{ owner }}: Ne možete obrisati osnovni model",
|
||||
"{{modelName}} is thinking...": "{{modelName}} razmišlja...",
|
||||
"{{user}}'s Chats": "Razgovori korisnika {{user}}",
|
||||
"{{webUIName}} Backend Required": "{{webUIName}} Backend je potreban",
|
||||
@@ -14,7 +14,7 @@
|
||||
"Account": "Račun",
|
||||
"Account Activation Pending": "",
|
||||
"Accurate information": "Točne informacije",
|
||||
"Active Users": "",
|
||||
"Active Users": "Aktivni korisnici",
|
||||
"Add": "Dodaj",
|
||||
"Add a model id": "Dodavanje ID-a modela",
|
||||
"Add a short description about what this model does": "Dodajte kratak opis funkcija ovog modela",
|
||||
@@ -30,17 +30,18 @@
|
||||
"Add User": "Dodaj korisnika",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Podešavanje će se primijeniti univerzalno na sve korisnike.",
|
||||
"admin": "administrator",
|
||||
"Admin": "",
|
||||
"Admin Panel": "Administratorska ploča",
|
||||
"Admin Settings": "Administratorske postavke",
|
||||
"Admin": "Admin",
|
||||
"Admin Panel": "Admin ploča",
|
||||
"Admin Settings": "Admin postavke",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Napredni parametri",
|
||||
"Advanced Params": "Napredni parami",
|
||||
"Advanced Params": "Napredni parametri",
|
||||
"all": "sve",
|
||||
"All Documents": "Svi dokumenti",
|
||||
"All Users": "Svi korisnici",
|
||||
"Allow": "Dopusti",
|
||||
"Allow Chat Deletion": "Dopusti brisanje razgovora",
|
||||
"Allow non-local voices": "",
|
||||
"Allow non-local voices": "Dopusti nelokalne glasove",
|
||||
"alphanumeric characters and hyphens": "alfanumerički znakovi i crtice",
|
||||
"Already have an account?": "Već imate račun?",
|
||||
"an assistant": "asistent",
|
||||
@@ -52,7 +53,7 @@
|
||||
"API keys": "API ključevi",
|
||||
"April": "Travanj",
|
||||
"Archive": "Arhiva",
|
||||
"Archive All Chats": "Arhiviraj sve razgovore",
|
||||
"Archive All Chats": "Arhivirajte sve razgovore",
|
||||
"Archived Chats": "Arhivirani razgovori",
|
||||
"are allowed - Activate this command by typing": "su dopušteni - Aktivirajte ovu naredbu upisivanjem",
|
||||
"Are you sure?": "Jeste li sigurni?",
|
||||
@@ -66,15 +67,15 @@
|
||||
"available!": "dostupno!",
|
||||
"Back": "Natrag",
|
||||
"Bad Response": "Loš odgovor",
|
||||
"Banners": "Bannere",
|
||||
"Base Model (From)": "Osnovni model (šalje)",
|
||||
"Banners": "Baneri",
|
||||
"Base Model (From)": "Osnovni model (Od)",
|
||||
"before": "prije",
|
||||
"Being lazy": "Biti lijen",
|
||||
"Brave Search API Key": "Ključ API-ja za hrabro pretraživanje",
|
||||
"Brave Search API Key": "Brave tražilica - API ključ",
|
||||
"Bypass SSL verification for Websites": "Zaobiđi SSL provjeru za web stranice",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Call": "Poziv",
|
||||
"Call feature is not supported when using Web STT engine": "Značajka poziva nije podržana kada se koristi Web STT mehanizam",
|
||||
"Camera": "Kamera",
|
||||
"Cancel": "Otkaži",
|
||||
"Capabilities": "Mogućnosti",
|
||||
"Change Password": "Promijeni lozinku",
|
||||
@@ -92,7 +93,7 @@
|
||||
"Chunk Params": "Parametri dijelova",
|
||||
"Chunk Size": "Veličina dijela",
|
||||
"Citation": "Citiranje",
|
||||
"Clear memory": "",
|
||||
"Clear memory": "Očisti memoriju",
|
||||
"Click here for help.": "Kliknite ovdje za pomoć.",
|
||||
"Click here to": "Kliknite ovdje za",
|
||||
"Click here to select": "Kliknite ovdje za odabir",
|
||||
@@ -101,7 +102,7 @@
|
||||
"Click here to select documents.": "Kliknite ovdje da odaberete dokumente.",
|
||||
"click here.": "kliknite ovdje.",
|
||||
"Click on the user role button to change a user's role.": "Kliknite na gumb uloge korisnika za promjenu uloge korisnika.",
|
||||
"Clone": "Klon",
|
||||
"Clone": "Kloniraj",
|
||||
"Close": "Zatvori",
|
||||
"Collection": "Kolekcija",
|
||||
"ComfyUI": "ComfyUI",
|
||||
@@ -111,7 +112,7 @@
|
||||
"Concurrent Requests": "Istodobni zahtjevi",
|
||||
"Confirm Password": "Potvrdite lozinku",
|
||||
"Connections": "Povezivanja",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Contact Admin for WebUI Access": "Kontaktirajte admina za WebUI pristup",
|
||||
"Content": "Sadržaj",
|
||||
"Context Length": "Dužina konteksta",
|
||||
"Continue Response": "Nastavi odgovor",
|
||||
@@ -121,7 +122,7 @@
|
||||
"Copy last response": "Kopiraj zadnji odgovor",
|
||||
"Copy Link": "Kopiraj vezu",
|
||||
"Copying to clipboard was successful!": "Kopiranje u međuspremnik je uspješno!",
|
||||
"Create a model": "Stvaranje modela",
|
||||
"Create a model": "Izradite model",
|
||||
"Create Account": "Stvori račun",
|
||||
"Create new key": "Stvori novi ključ",
|
||||
"Create new secret key": "Stvori novi tajni ključ",
|
||||
@@ -132,7 +133,7 @@
|
||||
"Custom": "Prilagođeno",
|
||||
"Customize models for a specific purpose": "Prilagodba modela za određenu svrhu",
|
||||
"Dark": "Tamno",
|
||||
"Dashboard": "",
|
||||
"Dashboard": "Radna ploča",
|
||||
"Database": "Baza podataka",
|
||||
"December": "Prosinac",
|
||||
"Default": "Zadano",
|
||||
@@ -158,11 +159,11 @@
|
||||
"Discover a prompt": "Otkrijte prompt",
|
||||
"Discover, download, and explore custom prompts": "Otkrijte, preuzmite i istražite prilagođene prompte",
|
||||
"Discover, download, and explore model presets": "Otkrijte, preuzmite i istražite unaprijed postavljene modele",
|
||||
"Dismissible": "",
|
||||
"Dismissible": "Odbaciti",
|
||||
"Display the username instead of You in the Chat": "Prikaži korisničko ime umjesto Vas u razgovoru",
|
||||
"Document": "Dokument",
|
||||
"Document Settings": "Postavke dokumenta",
|
||||
"Documentation": "",
|
||||
"Documentation": "Dokumentacija",
|
||||
"Documents": "Dokumenti",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "ne uspostavlja vanjske veze, a vaši podaci ostaju sigurno na vašem lokalno hostiranom poslužitelju.",
|
||||
"Don't Allow": "Ne dopuštaj",
|
||||
@@ -177,7 +178,7 @@
|
||||
"Edit Doc": "Uredi dokument",
|
||||
"Edit User": "Uredi korisnika",
|
||||
"Email": "Email",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Batch Size": "Embedding - Veličina batch-a",
|
||||
"Embedding Model": "Embedding model",
|
||||
"Embedding Model Engine": "Embedding model pogon",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Embedding model postavljen na \"{{embedding_model}}\"",
|
||||
@@ -188,7 +189,7 @@
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Provjerite da vaša CSV datoteka uključuje 4 stupca u ovom redoslijedu: Name, Email, Password, Role.",
|
||||
"Enter {{role}} message here": "Unesite {{role}} poruku ovdje",
|
||||
"Enter a detail about yourself for your LLMs to recall": "Unesite pojedinosti o sebi da bi učitali memoriju u LLM",
|
||||
"Enter Brave Search API Key": "Unesite ključ API-ja za hrabro pretraživanje",
|
||||
"Enter Brave Search API Key": "Unesite Brave Search API ključ",
|
||||
"Enter Chunk Overlap": "Unesite preklapanje dijelova",
|
||||
"Enter Chunk Size": "Unesite veličinu dijela",
|
||||
"Enter Github Raw URL": "Unesite Github sirovi URL",
|
||||
@@ -199,9 +200,10 @@
|
||||
"Enter model tag (e.g. {{modelTag}})": "Unesite oznaku modela (npr. {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Unesite broj koraka (npr. 50)",
|
||||
"Enter Score": "Unesite ocjenu",
|
||||
"Enter Searxng Query URL": "Unos URL-a upita Searxng",
|
||||
"Enter Serper API Key": "Unesite API ključ serpera",
|
||||
"Enter Serpstack API Key": "Unesite API ključ Serpstack",
|
||||
"Enter Searxng Query URL": "Unesite URL upita Searxng",
|
||||
"Enter Serper API Key": "Unesite Serper API ključ",
|
||||
"Enter Serply API Key": "Unesite Serply API ključ",
|
||||
"Enter Serpstack API Key": "Unesite Serpstack API ključ",
|
||||
"Enter stop sequence": "Unesite sekvencu zaustavljanja",
|
||||
"Enter Top K": "Unesite Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Unesite URL (npr. http://127.0.0.1:7860/)",
|
||||
@@ -214,15 +216,16 @@
|
||||
"Experimental": "Eksperimentalno",
|
||||
"Export": "Izvoz",
|
||||
"Export All Chats (All Users)": "Izvoz svih razgovora (svi korisnici)",
|
||||
"Export chat (.json)": "",
|
||||
"Export chat (.json)": "Izvoz četa (.json)",
|
||||
"Export Chats": "Izvoz razgovora",
|
||||
"Export Documents Mapping": "Izvoz mapiranja dokumenata",
|
||||
"Export Models": "Izvezi modele",
|
||||
"Export Models": "Izvoz modela",
|
||||
"Export Prompts": "Izvoz prompta",
|
||||
"External Models": "",
|
||||
"Export Tools": "Izvoz alata",
|
||||
"External Models": "Vanjski modeli",
|
||||
"Failed to create API Key.": "Neuspješno stvaranje API ključa.",
|
||||
"Failed to read clipboard contents": "Neuspješno čitanje sadržaja međuspremnika",
|
||||
"Failed to update settings": "",
|
||||
"Failed to update settings": "Greška kod ažuriranja postavki",
|
||||
"February": "Veljača",
|
||||
"Feel free to add specific details": "Slobodno dodajte specifične detalje",
|
||||
"File Mode": "Način datoteke",
|
||||
@@ -235,7 +238,7 @@
|
||||
"Frequency Penalty": "Kazna za učestalost",
|
||||
"General": "Općenito",
|
||||
"General Settings": "Opće postavke",
|
||||
"Generate Image": "",
|
||||
"Generate Image": "Gneriraj sliku",
|
||||
"Generating search query": "Generiranje upita za pretraživanje",
|
||||
"Generation Info": "Informacije o generaciji",
|
||||
"Good Response": "Dobar odgovor",
|
||||
@@ -256,11 +259,12 @@
|
||||
"Import Documents Mapping": "Uvoz mapiranja dokumenata",
|
||||
"Import Models": "Uvoz modela",
|
||||
"Import Prompts": "Uvoz prompta",
|
||||
"Import Tools": "Uvoz alata",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Uključite zastavicu `--api` prilikom pokretanja stable-diffusion-webui",
|
||||
"Info": "Informacije",
|
||||
"Input commands": "Unos naredbi",
|
||||
"Install from Github URL": "Instaliraj s Github URL-a",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Instant Auto-Send After Voice Transcription": "Trenutačno automatsko slanje nakon glasovne transkripcije",
|
||||
"Interface": "Sučelje",
|
||||
"Invalid Tag": "Nevažeća oznaka",
|
||||
"January": "Siječanj",
|
||||
@@ -273,17 +277,17 @@
|
||||
"JWT Token": "JWT token",
|
||||
"Keep Alive": "Održavanje živim",
|
||||
"Keyboard shortcuts": "Tipkovnički prečaci",
|
||||
"Knowledge": "",
|
||||
"Knowledge": "Znanje",
|
||||
"Language": "Jezik",
|
||||
"Last Active": "Zadnja aktivnost",
|
||||
"Light": "Svijetlo",
|
||||
"Listening...": "",
|
||||
"Listening...": "Slušam...",
|
||||
"LLMs can make mistakes. Verify important information.": "LLM-ovi mogu pogriješiti. Provjerite važne informacije.",
|
||||
"Local Models": "",
|
||||
"Local Models": "Lokalni modeli",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Izradio OpenWebUI Community",
|
||||
"Make sure to enclose them with": "Provjerite da ih zatvorite s",
|
||||
"Manage": "",
|
||||
"Manage": "Upravljaj",
|
||||
"Manage Models": "Upravljanje modelima",
|
||||
"Manage Ollama Models": "Upravljanje Ollama modelima",
|
||||
"Manage Pipelines": "Upravljanje cjevovodima",
|
||||
@@ -303,13 +307,13 @@
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "Model '{{modelName}}' je uspješno preuzet.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "Model '{{modelTag}}' je već u redu za preuzimanje.",
|
||||
"Model {{modelId}} not found": "Model {{modelId}} nije pronađen",
|
||||
"Model {{modelName}} is not vision capable": "Model {{modelName}} nije sposoban za vid",
|
||||
"Model {{modelName}} is not vision capable": "Model {{modelName}} ne čita vizualne impute",
|
||||
"Model {{name}} is now {{status}}": "Model {{name}} sada je {{status}}",
|
||||
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Otkriven put datotečnog sustava modela. Kratko ime modela je potrebno za ažuriranje, nije moguće nastaviti.",
|
||||
"Model ID": "ID modela",
|
||||
"Model not selected": "Model nije odabran",
|
||||
"Model Params": "Model Params",
|
||||
"Model Whitelisting": "Bijela lista modela",
|
||||
"Model Params": "Model parametri",
|
||||
"Model Whitelisting": "Model - Bijela lista",
|
||||
"Model(s) Whitelisted": "Model(i) na bijeloj listi",
|
||||
"Modelfile Content": "Sadržaj datoteke modela",
|
||||
"Models": "Modeli",
|
||||
@@ -319,11 +323,11 @@
|
||||
"Name your model": "Dodijelite naziv modelu",
|
||||
"New Chat": "Novi razgovor",
|
||||
"New Password": "Nova lozinka",
|
||||
"No documents found": "",
|
||||
"No documents found": "Dokumenti nisu pronađeni",
|
||||
"No results found": "Nema rezultata",
|
||||
"No search query generated": "Nije generiran upit za pretraživanje",
|
||||
"No source available": "Nema dostupnog izvora",
|
||||
"None": "Nijedan",
|
||||
"None": "Ništa",
|
||||
"Not factually correct": "Nije činjenično točno",
|
||||
"Note: If you set a minimum score, the search will only return documents with a score greater than or equal to the minimum score.": "Napomena: Ako postavite minimalnu ocjenu, pretraga će vratiti samo dokumente s ocjenom većom ili jednakom minimalnoj ocjeni.",
|
||||
"Notifications": "Obavijesti",
|
||||
@@ -336,7 +340,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "Ollama API je onemogućen",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama API is disabled": "Ollama API je onemogućen",
|
||||
"Ollama Version": "Ollama verzija",
|
||||
"On": "Uključeno",
|
||||
"Only": "Samo",
|
||||
@@ -359,12 +363,12 @@
|
||||
"PDF document (.pdf)": "PDF dokument (.pdf)",
|
||||
"PDF Extract Images (OCR)": "PDF izdvajanje slika (OCR)",
|
||||
"pending": "u tijeku",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing media devices": "Dopuštenje je odbijeno prilikom pristupa medijskim uređajima",
|
||||
"Permission denied when accessing microphone": "Dopuštenje je odbijeno prilikom pristupa mikrofonu",
|
||||
"Permission denied when accessing microphone: {{error}}": "Pristup mikrofonu odbijen: {{error}}",
|
||||
"Personalization": "Prilagodba",
|
||||
"Pipelines": "Cjevovodima",
|
||||
"Pipelines Valves": "Cjevovodi, ventili",
|
||||
"Pipelines": "Cjevovodi",
|
||||
"Pipelines Valves": "Ventili za cjevovode",
|
||||
"Plain text (.txt)": "Običan tekst (.txt)",
|
||||
"Playground": "Igralište",
|
||||
"Positive attitude": "Pozitivan stav",
|
||||
@@ -383,7 +387,7 @@
|
||||
"Read Aloud": "Čitaj naglas",
|
||||
"Record voice": "Snimanje glasa",
|
||||
"Redirecting you to OpenWebUI Community": "Preusmjeravanje na OpenWebUI zajednicu",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Nazivajte se \"Korisnik\" (npr. \"Korisnik uči španjolski\")",
|
||||
"Refused when it shouldn't have": "Odbijen kada nije trebao biti",
|
||||
"Regenerate": "Regeneriraj",
|
||||
"Release Notes": "Bilješke o izdanju",
|
||||
@@ -395,14 +399,14 @@
|
||||
"Reranking Model": "Model za ponovno rangiranje",
|
||||
"Reranking model disabled": "Model za ponovno rangiranje onemogućen",
|
||||
"Reranking model set to \"{{reranking_model}}\"": "Model za ponovno rangiranje postavljen na \"{{reranking_model}}\"",
|
||||
"Reset Upload Directory": "",
|
||||
"Reset Upload Directory": "Poništi upload direktorij",
|
||||
"Reset Vector Storage": "Resetiraj pohranu vektora",
|
||||
"Response AutoCopy to Clipboard": "Automatsko kopiranje odgovora u međuspremnik",
|
||||
"Role": "Uloga",
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Running": "Pokrenuto",
|
||||
"Save": "Spremi",
|
||||
"Save & Create": "Spremi i stvori",
|
||||
"Save & Update": "Spremi i ažuriraj",
|
||||
@@ -414,35 +418,38 @@
|
||||
"Search a model": "Pretraži model",
|
||||
"Search Chats": "Pretraži razgovore",
|
||||
"Search Documents": "Pretraga dokumenata",
|
||||
"Search Models": "Modeli pretraživanja",
|
||||
"Search Models": "Pretražite modele",
|
||||
"Search Prompts": "Pretraga prompta",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Query Generation Prompt": "Upit za generiranje upita za pretraživanje",
|
||||
"Search Query Generation Prompt Length Threshold": "Prag duljine upita za generiranje upita za pretraživanje",
|
||||
"Search Result Count": "Broj rezultata pretraživanja",
|
||||
"Search Tools": "Alati za pretraživanje",
|
||||
"Searched {{count}} sites_one": "Pretraženo {{count}} sites_one",
|
||||
"Searched {{count}} sites_few": "Pretraženo {{count}} sites_few",
|
||||
"Searched {{count}} sites_other": "Pretraženo {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Traženje '{{searchQuery}}' na webu",
|
||||
"Searxng Query URL": "URL upita Searxng",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng URL upita",
|
||||
"See readme.md for instructions": "Pogledajte readme.md za upute",
|
||||
"See what's new": "Pogledajte što je novo",
|
||||
"Seed": "Sjeme",
|
||||
"Select a base model": "Odabir osnovnog modela",
|
||||
"Select a engine": "",
|
||||
"Select a engine": "Odaberite pogon",
|
||||
"Select a mode": "Odaberite način",
|
||||
"Select a model": "Odaberite model",
|
||||
"Select a pipeline": "Odabir kanala",
|
||||
"Select a pipeline url": "Odabir URL-a kanala",
|
||||
"Select an Ollama instance": "Odaberite Ollama instancu",
|
||||
"Select Documents": "Odaberite dokumente",
|
||||
"Select model": "Odaberite model",
|
||||
"Select only one model to call": "",
|
||||
"Select only one model to call": "Odaberite samo jedan model za poziv",
|
||||
"Selected model(s) do not support image inputs": "Odabrani modeli ne podržavaju unose slika",
|
||||
"Send": "Pošalji",
|
||||
"Send a Message": "Pošaljite poruku",
|
||||
"Send message": "Pošalji poruku",
|
||||
"September": "Rujan",
|
||||
"Serper API Key": "Serper API ključ",
|
||||
"Serpstack API Key": "Tipka API za serpstack",
|
||||
"Serply API Key": "Serply API ključ",
|
||||
"Serpstack API Key": "Serpstack API API ključ",
|
||||
"Server connection verified": "Veza s poslužiteljem potvrđena",
|
||||
"Set as default": "Postavi kao zadano",
|
||||
"Set Default Model": "Postavi zadani model",
|
||||
@@ -450,11 +457,11 @@
|
||||
"Set Image Size": "Postavi veličinu slike",
|
||||
"Set reranking model (e.g. {{model}})": "Postavi model za ponovno rangiranje (npr. {{model}})",
|
||||
"Set Steps": "Postavi korake",
|
||||
"Set Task Model": "Postavi model zadatka",
|
||||
"Set Task Model": "Postavite model zadatka",
|
||||
"Set Voice": "Postavi glas",
|
||||
"Settings": "Postavke",
|
||||
"Settings saved successfully!": "Postavke su uspješno spremljene!",
|
||||
"Settings updated successfully": "",
|
||||
"Settings updated successfully": "Postavke uspješno ažurirane",
|
||||
"Share": "Podijeli",
|
||||
"Share Chat": "Podijeli razgovor",
|
||||
"Share to OpenWebUI Community": "Podijeli u OpenWebUI zajednici",
|
||||
@@ -472,7 +479,7 @@
|
||||
"Speech recognition error: {{error}}": "Pogreška prepoznavanja govora: {{error}}",
|
||||
"Speech-to-Text Engine": "Stroj za prepoznavanje govora",
|
||||
"Stop Sequence": "Zaustavi sekvencu",
|
||||
"STT Model": "",
|
||||
"STT Model": "STT model",
|
||||
"STT Settings": "STT postavke",
|
||||
"Submit": "Pošalji",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Podnaslov (npr. o Rimskom carstvu)",
|
||||
@@ -491,9 +498,9 @@
|
||||
"Thanks for your feedback!": "Hvala na povratnim informacijama!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Ocjena treba biti vrijednost između 0,0 (0%) i 1,0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
"Thinking...": "Razmišljam",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Ovo osigurava da su vaši vrijedni razgovori sigurno spremljeni u bazu podataka. Hvala vam!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Ovo je eksperimentalna značajka, možda neće funkcionirati prema očekivanjima i podložna je promjenama u bilo kojem trenutku.",
|
||||
"This setting does not sync across browsers or devices.": "Ova postavka se ne sinkronizira između preglednika ili uređaja.",
|
||||
"Thorough explanation": "Detaljno objašnjenje",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Savjet: Ažurirajte više mjesta za varijable uzastopno pritiskom na tipku tab u unosu razgovora nakon svake zamjene.",
|
||||
@@ -505,17 +512,20 @@
|
||||
"to": "do",
|
||||
"To access the available model names for downloading,": "Za pristup dostupnim nazivima modela za preuzimanje,",
|
||||
"To access the GGUF models available for downloading,": "Za pristup GGUF modelima dostupnim za preuzimanje,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Za pristup WebUI-u obratite se administratoru. Administratori mogu upravljati statusima korisnika s Admin panela.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Da biste ovdje dodali dokumente, prvo ih prenesite u radni prostor \"Dokumenti\".",
|
||||
"to chat input.": "u unos razgovora.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Danas",
|
||||
"Toggle settings": "Prebaci postavke",
|
||||
"Toggle sidebar": "Prebaci bočnu traku",
|
||||
"Tools": "Alati",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemi s pristupom Ollama?",
|
||||
"TTS Model": "",
|
||||
"TTS Model": "TTS model",
|
||||
"TTS Settings": "TTS postavke",
|
||||
"TTS Voice": "",
|
||||
"TTS Voice": "TTS glas",
|
||||
"Type": "Tip",
|
||||
"Type Hugging Face Resolve (Download) URL": "Upišite Hugging Face Resolve (Download) URL",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! Pojavio se problem s povezivanjem na {{provider}}.",
|
||||
@@ -523,8 +533,8 @@
|
||||
"Update and Copy Link": "Ažuriraj i kopiraj vezu",
|
||||
"Update password": "Ažuriraj lozinku",
|
||||
"Upload a GGUF model": "Učitaj GGUF model",
|
||||
"Upload Files": "Prenesi datoteke",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Files": "Prijenos datoteka",
|
||||
"Upload Pipeline": "Prijenos kanala",
|
||||
"Upload Progress": "Napredak učitavanja",
|
||||
"URL Mode": "URL način",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Koristite '#' u unosu prompta za učitavanje i odabir vaših dokumenata.",
|
||||
@@ -543,31 +553,31 @@
|
||||
"Warning": "Upozorenje",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Upozorenje: Ako ažurirate ili promijenite svoj model za umetanje, morat ćete ponovno uvesti sve dokumente.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web API": "Web API",
|
||||
"Web Loader Settings": "Postavke web učitavanja",
|
||||
"Web Params": "Web parametri",
|
||||
"Web Search": "Web-pretraživanje",
|
||||
"Web Search Engine": "Web-tražilica",
|
||||
"Web Search": "Internet pretraga",
|
||||
"Web Search Engine": "Web tražilica",
|
||||
"Webhook URL": "URL webkuke",
|
||||
"WebUI Add-ons": "Dodaci za WebUI",
|
||||
"WebUI Settings": "WebUI postavke",
|
||||
"WebUI will make requests to": "WebUI će slati zahtjeve na",
|
||||
"What’s New in": "Što je novo u",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Kada je povijest isključena, novi razgovori na ovom pregledniku neće se pojaviti u vašoj povijesti na bilo kojem od vaših uređaja.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Whisper (Local)": "Whisper (lokalno)",
|
||||
"Widescreen Mode": "Mod širokog zaslona",
|
||||
"Workspace": "Radna ploča",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Napišite prijedlog prompta (npr. Tko si ti?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Napišite sažetak u 50 riječi koji sažima [temu ili ključnu riječ].",
|
||||
"Yesterday": "Jučer",
|
||||
"You": "Vi",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Možete personalizirati svoje interakcije s LLM-ima dodavanjem uspomena putem gumba 'Upravljanje' u nastavku, čineći ih korisnijima i prilagođenijima vama.",
|
||||
"You cannot clone a base model": "Ne možete klonirati osnovni model",
|
||||
"You have no archived conversations.": "Nemate arhiviranih razgovora.",
|
||||
"You have shared this chat": "Podijelili ste ovaj razgovor",
|
||||
"You're a helpful assistant.": "Vi ste korisni asistent.",
|
||||
"You're now logged in.": "Sada ste prijavljeni.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your account status is currently pending activation.": "Status vašeg računa trenutno čeka aktivaciju.",
|
||||
"Youtube": "YouTube",
|
||||
"Youtube Loader Settings": "YouTube postavke učitavanja"
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Pannello di amministrazione",
|
||||
"Admin Settings": "Impostazioni amministratore",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Parametri avanzati",
|
||||
"Advanced Params": "Parametri avanzati",
|
||||
"all": "tutti",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Inserisci il punteggio",
|
||||
"Enter Searxng Query URL": "Immettere l'URL della query Searxng",
|
||||
"Enter Serper API Key": "Inserisci la chiave API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Inserisci la chiave API Serpstack",
|
||||
"Enter stop sequence": "Inserisci la sequenza di arresto",
|
||||
"Enter Top K": "Inserisci Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Esporta mappatura documenti",
|
||||
"Export Models": "Esporta modelli",
|
||||
"Export Prompts": "Esporta prompt",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Impossibile creare la chiave API.",
|
||||
"Failed to read clipboard contents": "Impossibile leggere il contenuto degli appunti",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Importa mappatura documenti",
|
||||
"Import Models": "Importazione di modelli",
|
||||
"Import Prompts": "Importa prompt",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Includi il flag `--api` quando esegui stable-diffusion-webui",
|
||||
"Info": "Informazioni",
|
||||
"Input commands": "Comandi di input",
|
||||
@@ -419,10 +423,11 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Conteggio dei risultati della ricerca",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Ricercato {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Ricercato {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Ricercato {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Ricerca sul web di '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng Query URL",
|
||||
"See readme.md for instructions": "Vedi readme.md per le istruzioni",
|
||||
"See what's new": "Guarda le novità",
|
||||
@@ -434,6 +439,7 @@
|
||||
"Select a pipeline": "Selezionare una tubazione",
|
||||
"Select a pipeline url": "Selezionare l'URL di una pipeline",
|
||||
"Select an Ollama instance": "Seleziona un'istanza Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Seleziona modello",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "I modelli selezionati non supportano l'input di immagini",
|
||||
@@ -442,6 +448,7 @@
|
||||
"Send message": "Invia messaggio",
|
||||
"September": "Settembre",
|
||||
"Serper API Key": "Chiave API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Chiave API Serpstack",
|
||||
"Server connection verified": "Connessione al server verificata",
|
||||
"Set as default": "Imposta come predefinito",
|
||||
@@ -506,10 +513,13 @@
|
||||
"To access the available model names for downloading,": "Per accedere ai nomi dei modelli disponibili per il download,",
|
||||
"To access the GGUF models available for downloading,": "Per accedere ai modelli GGUF disponibili per il download,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "all'input della chat.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Oggi",
|
||||
"Toggle settings": "Attiva/disattiva impostazioni",
|
||||
"Toggle sidebar": "Attiva/disattiva barra laterale",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemi di accesso a Ollama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "管理者パネル",
|
||||
"Admin Settings": "管理者設定",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "詳細パラメーター",
|
||||
"Advanced Params": "高度なパラメータ",
|
||||
"all": "すべて",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "スコアを入力してください",
|
||||
"Enter Searxng Query URL": "SearxngクエリURLを入力",
|
||||
"Enter Serper API Key": "Serper APIキーの入力",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Serpstack APIキーの入力",
|
||||
"Enter stop sequence": "ストップシーケンスを入力してください",
|
||||
"Enter Top K": "トップ K を入力してください",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "ドキュメントマッピングをエクスポート",
|
||||
"Export Models": "モデルのエクスポート",
|
||||
"Export Prompts": "プロンプトをエクスポート",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "APIキーの作成に失敗しました。",
|
||||
"Failed to read clipboard contents": "クリップボードの内容を読み取れませんでした",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "ドキュメントマッピングをインポート",
|
||||
"Import Models": "モデルのインポート",
|
||||
"Import Prompts": "プロンプトをインポート",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webuiを実行する際に`--api`フラグを含める",
|
||||
"Info": "情報",
|
||||
"Input commands": "入力コマンド",
|
||||
@@ -419,8 +423,9 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "検索結果数",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_other": "{{count}} sites_other検索",
|
||||
"Searching the web for '{{searchQuery}}'": "ウェブで '{{searchQuery}}' を検索する",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng クエリ URL",
|
||||
"See readme.md for instructions": "手順については readme.md を参照してください",
|
||||
"See what's new": "新機能を見る",
|
||||
@@ -432,6 +437,7 @@
|
||||
"Select a pipeline": "パイプラインの選択",
|
||||
"Select a pipeline url": "パイプラインの URL を選択する",
|
||||
"Select an Ollama instance": "Ollama インスタンスを選択",
|
||||
"Select Documents": "",
|
||||
"Select model": "モデルを選択",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "一部のモデルは画像入力をサポートしていません",
|
||||
@@ -440,6 +446,7 @@
|
||||
"Send message": "メッセージを送信",
|
||||
"September": "9月",
|
||||
"Serper API Key": "Serper APIキー",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack APIキー",
|
||||
"Server connection verified": "サーバー接続が確認されました",
|
||||
"Set as default": "デフォルトに設定",
|
||||
@@ -504,10 +511,13 @@
|
||||
"To access the available model names for downloading,": "ダウンロード可能なモデル名にアクセスするには、",
|
||||
"To access the GGUF models available for downloading,": "ダウンロード可能な GGUF モデルにアクセスするには、",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "チャット入力へ。",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "今日",
|
||||
"Toggle settings": "設定を切り替え",
|
||||
"Toggle sidebar": "サイドバーを切り替え",
|
||||
"Tools": "",
|
||||
"Top K": "トップ K",
|
||||
"Top P": "トップ P",
|
||||
"Trouble accessing Ollama?": "Ollama へのアクセスに問題がありますか?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "ადმინ პანელი",
|
||||
"Admin Settings": "ადმინისტრატორის ხელსაწყოები",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "დამატებითი პარამეტრები",
|
||||
"Advanced Params": "მოწინავე პარამები",
|
||||
"all": "ყველა",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "შეიყვანეთ ქულა",
|
||||
"Enter Searxng Query URL": "შეიყვანეთ Searxng Query URL",
|
||||
"Enter Serper API Key": "შეიყვანეთ Serper API Key",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "შეიყვანეთ Serpstack API Key",
|
||||
"Enter stop sequence": "შეიყვანეთ ტოპ თანმიმდევრობა",
|
||||
"Enter Top K": "შეიყვანეთ Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "დოკუმენტების კავშირის ექსპორტი",
|
||||
"Export Models": "ექსპორტის მოდელები",
|
||||
"Export Prompts": "მოთხოვნების ექსპორტი",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API ღილაკის შექმნა ვერ მოხერხდა.",
|
||||
"Failed to read clipboard contents": "ბუფერში შიგთავსის წაკითხვა ვერ მოხერხდა",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "დოკუმენტების კავშირის იმპორტი",
|
||||
"Import Models": "იმპორტის მოდელები",
|
||||
"Import Prompts": "მოთხოვნების იმპორტი",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "ჩართეთ `--api` დროშა stable-diffusion-webui-ის გაშვებისას",
|
||||
"Info": "ინფორმაცია",
|
||||
"Input commands": "შეყვანით ბრძანებებს",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "ძიების შედეგების რაოდენობა",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Searched {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "Searched {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "ეძებს ვებ '{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng Query URL",
|
||||
"See readme.md for instructions": "იხილეთ readme.md ინსტრუქციებისთვის",
|
||||
"See what's new": "სიახლეების ნახვა",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "აირჩიეთ მილსადენი",
|
||||
"Select a pipeline url": "აირჩიეთ მილსადენის url",
|
||||
"Select an Ollama instance": "Ollama ინსტანსის არჩევა",
|
||||
"Select Documents": "",
|
||||
"Select model": "მოდელის არჩევა",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "შერჩეული მოდელი (ებ) ი არ უჭერს მხარს გამოსახულების შეყვანას",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "შეტყობინების გაგზავნა",
|
||||
"September": "სექტემბერი",
|
||||
"Serper API Key": "Serper API Key",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API Key",
|
||||
"Server connection verified": "სერვერთან კავშირი დადასტურებულია",
|
||||
"Set as default": "დეფოლტად დაყენება",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "ჩამოტვირთვისთვის ხელმისაწვდომი მოდელების სახელებზე წვდომისთვის",
|
||||
"To access the GGUF models available for downloading,": "ჩასატვირთად ხელმისაწვდომი GGUF მოდელებზე წვდომისთვის",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "ჩატში",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "დღეს",
|
||||
"Toggle settings": "პარამეტრების გადართვა",
|
||||
"Toggle sidebar": "გვერდითი ზოლის გადართვა",
|
||||
"Tools": "",
|
||||
"Top K": "ტოპ K",
|
||||
"Top P": "ტოპ P",
|
||||
"Trouble accessing Ollama?": "Ollama-ს ვერ უკავშირდები?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "관리자 패널",
|
||||
"Admin Settings": "관리자 설정",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "고급 매개변수",
|
||||
"Advanced Params": "고급 매개 변수",
|
||||
"all": "모두",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "점수 입력",
|
||||
"Enter Searxng Query URL": "Searxng 쿼리 URL 입력",
|
||||
"Enter Serper API Key": "Serper API Key 입력",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Serpstack API Key 입력",
|
||||
"Enter stop sequence": "중지 시퀀스 입력",
|
||||
"Enter Top K": "Top K 입력",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "문서 매핑 내보내기",
|
||||
"Export Models": "모델 내보내기",
|
||||
"Export Prompts": "프롬프트 내보내기",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API 키 생성에 실패했습니다.",
|
||||
"Failed to read clipboard contents": "클립보드 내용을 읽는 데 실패했습니다.",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "문서 매핑 가져오기",
|
||||
"Import Models": "모델 가져오기",
|
||||
"Import Prompts": "프롬프트 가져오기",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui를 실행할 때 '--api' 플래그 포함",
|
||||
"Info": "정보",
|
||||
"Input commands": "입력 명령",
|
||||
@@ -419,8 +423,9 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "검색 결과 개수",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_other": "{{count}} sites_other 검색됨",
|
||||
"Searching the web for '{{searchQuery}}'": "웹에서 '{{searchQuery}}' 검색",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng 쿼리 URL",
|
||||
"See readme.md for instructions": "설명은 readme.md를 참조하세요.",
|
||||
"See what's new": "새로운 기능 보기",
|
||||
@@ -432,6 +437,7 @@
|
||||
"Select a pipeline": "파이프라인 선택",
|
||||
"Select a pipeline url": "파이프라인 URL 선택",
|
||||
"Select an Ollama instance": "Ollama 인스턴스 선택",
|
||||
"Select Documents": "",
|
||||
"Select model": "모델 선택",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "선택한 모델은 이미지 입력을 지원하지 않습니다.",
|
||||
@@ -440,6 +446,7 @@
|
||||
"Send message": "메시지 보내기",
|
||||
"September": "9월",
|
||||
"Serper API Key": "Serper API 키",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API 키",
|
||||
"Server connection verified": "서버 연결 확인됨",
|
||||
"Set as default": "기본값으로 설정",
|
||||
@@ -504,10 +511,13 @@
|
||||
"To access the available model names for downloading,": "다운로드 가능한 모델명을 확인하려면,",
|
||||
"To access the GGUF models available for downloading,": "다운로드 가능한 GGUF 모델을 확인하려면,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "채팅 입력으로.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "오늘",
|
||||
"Toggle settings": "설정 전환",
|
||||
"Toggle sidebar": "사이드바 전환",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Ollama에 접근하는 데 문제가 있나요?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Administratorių panelė",
|
||||
"Admin Settings": "Administratorių nustatymai",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Gilieji nustatymai",
|
||||
"Advanced Params": "",
|
||||
"all": "visi",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Įveskite rezultatą",
|
||||
"Enter Searxng Query URL": "",
|
||||
"Enter Serper API Key": "",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "Įveskite pabaigos sekvenciją",
|
||||
"Enter Top K": "Įveskite Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Eksportuoti dokumentų žemėlapį",
|
||||
"Export Models": "",
|
||||
"Export Prompts": "Eksportuoti užklausas",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Nepavyko sukurti API rakto",
|
||||
"Failed to read clipboard contents": "Nepavyko perskaityti kopijuoklės",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Importuoti dokumentų žemėlapį",
|
||||
"Import Models": "",
|
||||
"Import Prompts": "Importuoti užklausas",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Pridėti `--api` kai vykdomas stable-diffusion-webui",
|
||||
"Info": "",
|
||||
"Input commands": "Įvesties komandos",
|
||||
@@ -419,11 +423,12 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "",
|
||||
"Searched {{count}} sites_few": "",
|
||||
"Searched {{count}} sites_many": "",
|
||||
"Searched {{count}} sites_other": "",
|
||||
"Searching the web for '{{searchQuery}}'": "",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "",
|
||||
"See readme.md for instructions": "Žiūrėti readme.md papildomoms instrukcijoms",
|
||||
"See what's new": "Žiūrėti naujoves",
|
||||
@@ -435,6 +440,7 @@
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select an Ollama instance": "Pasirinkti Ollama instanciją",
|
||||
"Select Documents": "",
|
||||
"Select model": "Pasirinkti modelį",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
@@ -443,6 +449,7 @@
|
||||
"Send message": "Siųsti žinutę",
|
||||
"September": "rugsėjis",
|
||||
"Serper API Key": "",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "",
|
||||
"Server connection verified": "Serverio sujungimas patvirtintas",
|
||||
"Set as default": "Nustatyti numatytąjį",
|
||||
@@ -507,10 +514,13 @@
|
||||
"To access the available model names for downloading,": "Tam, kad prieiti prie galimų parsisiųsti modelių",
|
||||
"To access the GGUF models available for downloading,": "Tam, kad prieiti prie galimų parsisiųsti GGUF,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "į pokalbio įvestį",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Šiandien",
|
||||
"Toggle settings": "Atverti/užverti parametrus",
|
||||
"Toggle sidebar": "Atverti/užverti šoninį meniu",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemos prieinant prie Ollama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Administrasjonspanel",
|
||||
"Admin Settings": "Administrasjonsinnstillinger",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Avanserte parametere",
|
||||
"Advanced Params": "Avanserte parametere",
|
||||
"all": "alle",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Skriv inn poengsum",
|
||||
"Enter Searxng Query URL": "Skriv inn Searxng forespørsels-URL",
|
||||
"Enter Serper API Key": "Skriv inn Serper API-nøkkel",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Skriv inn Serpstack API-nøkkel",
|
||||
"Enter stop sequence": "Skriv inn stoppsekvens",
|
||||
"Enter Top K": "Skriv inn Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Eksporter dokumentkartlegging",
|
||||
"Export Models": "Eksporter modeller",
|
||||
"Export Prompts": "Eksporter prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Kunne ikke opprette API-nøkkel.",
|
||||
"Failed to read clipboard contents": "Kunne ikke lese utklippstavleinnhold",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Importer dokumentkartlegging",
|
||||
"Import Models": "Importer modeller",
|
||||
"Import Prompts": "Importer prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inkluder `--api`-flagget når du kjører stable-diffusion-webui",
|
||||
"Info": "Info",
|
||||
"Input commands": "Inntast kommandoer",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Antall søkeresultater",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Søkte på {{count}} side",
|
||||
"Searched {{count}} sites_other": "Søkte på {{count}} sider",
|
||||
"Searching the web for '{{searchQuery}}'": "Søker på nettet etter '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng forespørsels-URL",
|
||||
"See readme.md for instructions": "Se readme.md for instruksjoner",
|
||||
"See what's new": "Se hva som er nytt",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "Velg en pipeline",
|
||||
"Select a pipeline url": "Velg en pipeline-URL",
|
||||
"Select an Ollama instance": "Velg en Ollama-instans",
|
||||
"Select Documents": "",
|
||||
"Select model": "Velg modell",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Valgte modell(er) støtter ikke bildeforslag",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "Send melding",
|
||||
"September": "September",
|
||||
"Serper API Key": "Serper API-nøkkel",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API-nøkkel",
|
||||
"Server connection verified": "Servertilkobling bekreftet",
|
||||
"Set as default": "Sett som standard",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "For å få tilgang til tilgjengelige modelnavn for nedlasting,",
|
||||
"To access the GGUF models available for downloading,": "For å få tilgang til GGUF-modellene som er tilgjengelige for nedlasting,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "til chatinput.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "I dag",
|
||||
"Toggle settings": "Veksle innstillinger",
|
||||
"Toggle sidebar": "Veksle sidefelt",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemer med tilgang til Ollama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Administratieve Paneel",
|
||||
"Admin Settings": "Administratieve Settings",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Geavanceerde Parameters",
|
||||
"Advanced Params": "Geavanceerde parameters",
|
||||
"all": "alle",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Voeg score toe",
|
||||
"Enter Searxng Query URL": "Voer de URL van de Searxng-query in",
|
||||
"Enter Serper API Key": "Voer de Serper API-sleutel in",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Voer de Serpstack API-sleutel in",
|
||||
"Enter stop sequence": "Zet stop sequentie",
|
||||
"Enter Top K": "Voeg Top K toe",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Exporteer Documenten Mapping",
|
||||
"Export Models": "Modellen exporteren",
|
||||
"Export Prompts": "Exporteer Prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Kan API Key niet aanmaken.",
|
||||
"Failed to read clipboard contents": "Kan klembord inhoud niet lezen",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Importeer Documenten Mapping",
|
||||
"Import Models": "Modellen importeren",
|
||||
"Import Prompts": "Importeer Prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Voeg `--api` vlag toe bij het uitvoeren van stable-diffusion-webui",
|
||||
"Info": "Info",
|
||||
"Input commands": "Voer commando's in",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Aantal zoekresultaten",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Gezocht op {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "Gezocht op {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Zoeken op internet naar '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng Query URL",
|
||||
"See readme.md for instructions": "Zie readme.md voor instructies",
|
||||
"See what's new": "Zie wat er nieuw is",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "Selecteer een pijplijn",
|
||||
"Select a pipeline url": "Selecteer een pijplijn-URL",
|
||||
"Select an Ollama instance": "Selecteer een Ollama instantie",
|
||||
"Select Documents": "",
|
||||
"Select model": "Selecteer een model",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Geselecteerde modellen ondersteunen geen beeldinvoer",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "Stuur bericht",
|
||||
"September": "September",
|
||||
"Serper API Key": "Serper API-sleutel",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API-sleutel",
|
||||
"Server connection verified": "Server verbinding geverifieerd",
|
||||
"Set as default": "Stel in als standaard",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "Om de beschikbare modelnamen voor downloaden te openen,",
|
||||
"To access the GGUF models available for downloading,": "Om toegang te krijgen tot de GGUF modellen die beschikbaar zijn voor downloaden,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "naar chat input.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Vandaag",
|
||||
"Toggle settings": "Wissel instellingen",
|
||||
"Toggle sidebar": "Wissel sidebar",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemen met toegang tot Ollama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "ਪ੍ਰਬੰਧਕ ਪੈਨਲ",
|
||||
"Admin Settings": "ਪ੍ਰਬੰਧਕ ਸੈਟਿੰਗਾਂ",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "ਉੱਚ ਸਤਰ ਦੇ ਪੈਰਾਮੀਟਰ",
|
||||
"Advanced Params": "ਐਡਵਾਂਸਡ ਪਰਮਜ਼",
|
||||
"all": "ਸਾਰੇ",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "ਸਕੋਰ ਦਰਜ ਕਰੋ",
|
||||
"Enter Searxng Query URL": "Searxng Query URL ਦਾਖਲ ਕਰੋ",
|
||||
"Enter Serper API Key": "Serper API ਕੁੰਜੀ ਦਾਖਲ ਕਰੋ",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Serpstack API ਕੁੰਜੀ ਦਾਖਲ ਕਰੋ",
|
||||
"Enter stop sequence": "ਰੋਕਣ ਦਾ ਕ੍ਰਮ ਦਰਜ ਕਰੋ",
|
||||
"Enter Top K": "ਸਿਖਰ K ਦਰਜ ਕਰੋ",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਨਿਰਯਾਤ ਕਰੋ",
|
||||
"Export Models": "ਨਿਰਯਾਤ ਮਾਡਲ",
|
||||
"Export Prompts": "ਪ੍ਰੰਪਟ ਨਿਰਯਾਤ ਕਰੋ",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API ਕੁੰਜੀ ਬਣਾਉਣ ਵਿੱਚ ਅਸਫਲ।",
|
||||
"Failed to read clipboard contents": "ਕਲਿੱਪਬੋਰਡ ਸਮੱਗਰੀ ਪੜ੍ਹਣ ਵਿੱਚ ਅਸਫਲ",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "ਡਾਕੂਮੈਂਟ ਮੈਪਿੰਗ ਆਯਾਤ ਕਰੋ",
|
||||
"Import Models": "ਮਾਡਲ ਆਯਾਤ ਕਰੋ",
|
||||
"Import Prompts": "ਪ੍ਰੰਪਟ ਆਯਾਤ ਕਰੋ",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "ਸਟੇਬਲ-ਡਿਫਿਊਸ਼ਨ-ਵੈਬਯੂਆਈ ਚਲਾਉਣ ਸਮੇਂ `--api` ਝੰਡਾ ਸ਼ਾਮਲ ਕਰੋ",
|
||||
"Info": "ਜਾਣਕਾਰੀ",
|
||||
"Input commands": "ਇਨਪੁਟ ਕਮਾਂਡਾਂ",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "ਖੋਜ ਨਤੀਜੇ ਦੀ ਗਿਣਤੀ",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "ਖੋਜਿਆ {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "ਖੋਜਿਆ {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "'{{searchQuery}}' ਲਈ ਵੈੱਬ 'ਤੇ ਖੋਜ ਕਰਨਾ",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng Query URL",
|
||||
"See readme.md for instructions": "ਹਦਾਇਤਾਂ ਲਈ readme.md ਵੇਖੋ",
|
||||
"See what's new": "ਨਵਾਂ ਕੀ ਹੈ ਵੇਖੋ",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "ਪਾਈਪਲਾਈਨ ਚੁਣੋ",
|
||||
"Select a pipeline url": "ਪਾਈਪਲਾਈਨ URL ਚੁਣੋ",
|
||||
"Select an Ollama instance": "ਇੱਕ ਓਲਾਮਾ ਇੰਸਟੈਂਸ ਚੁਣੋ",
|
||||
"Select Documents": "",
|
||||
"Select model": "ਮਾਡਲ ਚੁਣੋ",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "ਚੁਣੇ ਗਏ ਮਾਡਲ(ਆਂ) ਚਿੱਤਰ ਇਨਪੁੱਟਾਂ ਦਾ ਸਮਰਥਨ ਨਹੀਂ ਕਰਦੇ",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "ਸੁਨੇਹਾ ਭੇਜੋ",
|
||||
"September": "ਸਤੰਬਰ",
|
||||
"Serper API Key": "Serper API ਕੁੰਜੀ",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API ਕੁੰਜੀ",
|
||||
"Server connection verified": "ਸਰਵਰ ਕਨੈਕਸ਼ਨ ਦੀ ਪੁਸ਼ਟੀ ਕੀਤੀ ਗਈ",
|
||||
"Set as default": "ਮੂਲ ਵਜੋਂ ਸੈੱਟ ਕਰੋ",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਉਪਲਬਧ ਮਾਡਲ ਨਾਮਾਂ ਤੱਕ ਪਹੁੰਚਣ ਲਈ,",
|
||||
"To access the GGUF models available for downloading,": "ਡਾਊਨਲੋਡ ਕਰਨ ਲਈ ਉਪਲਬਧ GGUF ਮਾਡਲਾਂ ਤੱਕ ਪਹੁੰਚਣ ਲਈ,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "ਗੱਲਬਾਤ ਇਨਪੁਟ ਲਈ।",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "ਅੱਜ",
|
||||
"Toggle settings": "ਸੈਟਿੰਗਾਂ ਟੌਗਲ ਕਰੋ",
|
||||
"Toggle sidebar": "ਸਾਈਡਬਾਰ ਟੌਗਲ ਕਰੋ",
|
||||
"Tools": "",
|
||||
"Top K": "ਸਿਖਰ K",
|
||||
"Top P": "ਸਿਖਰ P",
|
||||
"Trouble accessing Ollama?": "ਓਲਾਮਾ ਤੱਕ ਪਹੁੰਚਣ ਵਿੱਚ ਮੁਸ਼ਕਲ?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Panel administracyjny",
|
||||
"Admin Settings": "Ustawienia administratora",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Zaawansowane parametry",
|
||||
"Advanced Params": "Zaawansowane parametry",
|
||||
"all": "wszyscy",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Wprowadź wynik",
|
||||
"Enter Searxng Query URL": "Wprowadź adres URL zapytania Searxng",
|
||||
"Enter Serper API Key": "Wprowadź klucz API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Wprowadź klucz API Serpstack",
|
||||
"Enter stop sequence": "Wprowadź sekwencję zatrzymania",
|
||||
"Enter Top K": "Wprowadź Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Eksportuj mapowanie dokumentów",
|
||||
"Export Models": "Eksportuj modele",
|
||||
"Export Prompts": "Eksportuj prompty",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Nie udało się utworzyć klucza API.",
|
||||
"Failed to read clipboard contents": "Nie udało się odczytać zawartości schowka",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Importuj mapowanie dokumentów",
|
||||
"Import Models": "Importowanie modeli",
|
||||
"Import Prompts": "Importuj prompty",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Dołącz flagę `--api` podczas uruchamiania stable-diffusion-webui",
|
||||
"Info": "Informacji",
|
||||
"Input commands": "Wprowadź komendy",
|
||||
@@ -419,11 +423,12 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Liczba wyników wyszukiwania",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Wyszukiwano {{count}} sites_one",
|
||||
"Searched {{count}} sites_few": "Wyszukiwano {{count}} sites_few",
|
||||
"Searched {{count}} sites_many": "Wyszukiwano {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Wyszukiwano {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Wyszukiwanie w Internecie \"{{searchQuery}}\"",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Adres URL zapytania Searxng",
|
||||
"See readme.md for instructions": "Zajrzyj do readme.md po instrukcje",
|
||||
"See what's new": "Zobacz co nowego",
|
||||
@@ -435,6 +440,7 @@
|
||||
"Select a pipeline": "Wybieranie potoku",
|
||||
"Select a pipeline url": "Wybieranie adresu URL potoku",
|
||||
"Select an Ollama instance": "Wybierz instancję Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Wybierz model",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Wybrane modele nie obsługują danych wejściowych obrazu",
|
||||
@@ -443,6 +449,7 @@
|
||||
"Send message": "Wyślij wiadomość",
|
||||
"September": "Wrzesień",
|
||||
"Serper API Key": "Klucz API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Klucz API Serpstack",
|
||||
"Server connection verified": "Połączenie z serwerem zweryfikowane",
|
||||
"Set as default": "Ustaw jako domyślne",
|
||||
@@ -507,10 +514,13 @@
|
||||
"To access the available model names for downloading,": "Aby uzyskać dostęp do dostępnych nazw modeli do pobrania,",
|
||||
"To access the GGUF models available for downloading,": "Aby uzyskać dostęp do dostępnych modeli GGUF do pobrania,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "do pola wprowadzania czatu.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Dzisiaj",
|
||||
"Toggle settings": "Przełącz ustawienia",
|
||||
"Toggle sidebar": "Przełącz panel boczny",
|
||||
"Tools": "",
|
||||
"Top K": "Najlepsze K",
|
||||
"Top P": "Najlepsze P",
|
||||
"Trouble accessing Ollama?": "Problemy z dostępem do Ollama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Painel do Administrador",
|
||||
"Admin Settings": "Configurações do Administrador",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Parâmetros Avançados",
|
||||
"Advanced Params": "Params Avançados",
|
||||
"all": "todos",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Digite a Pontuação",
|
||||
"Enter Searxng Query URL": "Insira a URL de consulta do Searxng",
|
||||
"Enter Serper API Key": "Digite a chave da API do Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Digite a chave da API Serpstack",
|
||||
"Enter stop sequence": "Digite a sequência de parada",
|
||||
"Enter Top K": "Digite o Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Exportar Mapeamento de Documentos",
|
||||
"Export Models": "Modelos de Exportação",
|
||||
"Export Prompts": "Exportar Prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Falha ao criar a Chave da API.",
|
||||
"Failed to read clipboard contents": "Falha ao ler o conteúdo da área de transferência",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Importar Mapeamento de Documentos",
|
||||
"Import Models": "Modelos de Importação",
|
||||
"Import Prompts": "Importar Prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inclua a flag `--api` ao executar stable-diffusion-webui",
|
||||
"Info": "Informação",
|
||||
"Input commands": "Comandos de entrada",
|
||||
@@ -419,10 +423,11 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Contagem de resultados de pesquisa",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Pesquisado {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Pesquisado {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Pesquisado {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Pesquisando na Web por '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "URL de consulta Searxng",
|
||||
"See readme.md for instructions": "Consulte readme.md para obter instruções",
|
||||
"See what's new": "Veja o que há de novo",
|
||||
@@ -434,6 +439,7 @@
|
||||
"Select a pipeline": "Selecione um pipeline",
|
||||
"Select a pipeline url": "Selecione uma URL de pipeline",
|
||||
"Select an Ollama instance": "Selecione uma instância Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Selecione um modelo",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "O(s) modelo(s) selecionado(s) não suporta(m) entrada(s) de imagem",
|
||||
@@ -442,6 +448,7 @@
|
||||
"Send message": "Enviar mensagem",
|
||||
"September": "Setembro",
|
||||
"Serper API Key": "Chave de API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Chave de API Serpstack",
|
||||
"Server connection verified": "Conexão com o servidor verificada",
|
||||
"Set as default": "Definir como padrão",
|
||||
@@ -506,10 +513,13 @@
|
||||
"To access the available model names for downloading,": "Para acessar os nomes de modelo disponíveis para download,",
|
||||
"To access the GGUF models available for downloading,": "Para acessar os modelos GGUF disponíveis para download,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "para a entrada de bate-papo.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Hoje",
|
||||
"Toggle settings": "Alternar configurações",
|
||||
"Toggle sidebar": "Alternar barra lateral",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemas para acessar o Ollama?",
|
||||
|
||||
@@ -5,16 +5,16 @@
|
||||
"(latest)": "(mais recente)",
|
||||
"{{ models }}": "{{ modelos }}",
|
||||
"{{ owner }}: You cannot delete a base model": "{{ owner }}: Não é possível excluir um modelo base",
|
||||
"{{modelName}} is thinking...": "{{modelName}} está pensando...",
|
||||
"{{modelName}} is thinking...": "{{modelName}} está a pensar...",
|
||||
"{{user}}'s Chats": "{{user}}'s Chats",
|
||||
"{{webUIName}} Backend Required": "{{webUIName}} Backend Necessário",
|
||||
"A task model is used when performing tasks such as generating titles for chats and web search queries": "Um modelo de tarefa é usado ao executar tarefas como gerar títulos para bate-papos e consultas de pesquisa na Web",
|
||||
"a user": "um usuário",
|
||||
"About": "Sobre",
|
||||
"a user": "um utilizador",
|
||||
"About": "Acerca de",
|
||||
"Account": "Conta",
|
||||
"Account Activation Pending": "",
|
||||
"Account Activation Pending": "Ativação da Conta Pendente",
|
||||
"Accurate information": "Informações precisas",
|
||||
"Active Users": "",
|
||||
"Active Users": "Utilizadores Ativos",
|
||||
"Add": "Adicionar",
|
||||
"Add a model id": "Adicionar um ID de modelo",
|
||||
"Add a short description about what this model does": "Adicione uma breve descrição sobre o que este modelo faz",
|
||||
@@ -22,30 +22,31 @@
|
||||
"Add a tag": "Adicionar uma tag",
|
||||
"Add custom prompt": "Adicionar um prompt curto",
|
||||
"Add Docs": "Adicionar Documentos",
|
||||
"Add Files": "Adicionar Arquivos",
|
||||
"Add Files": "Adicionar Ficheiros",
|
||||
"Add Memory": "Adicionar memória",
|
||||
"Add message": "Adicionar mensagem",
|
||||
"Add Model": "Adicionar modelo",
|
||||
"Add Tags": "adicionar tags",
|
||||
"Add User": "Adicionar Usuário",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Ajustar essas configurações aplicará alterações universalmente a todos os usuários.",
|
||||
"Add User": "Adicionar Utilizador",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Ajustar essas configurações aplicará alterações universalmente a todos os utilizadores.",
|
||||
"admin": "administrador",
|
||||
"Admin": "",
|
||||
"Admin": "Admin",
|
||||
"Admin Panel": "Painel do Administrador",
|
||||
"Admin Settings": "Configurações do Administrador",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Parâmetros Avançados",
|
||||
"Advanced Params": "Params Avançados",
|
||||
"all": "todos",
|
||||
"All Documents": "Todos os Documentos",
|
||||
"All Users": "Todos os Usuários",
|
||||
"All Users": "Todos os utilizadores",
|
||||
"Allow": "Permitir",
|
||||
"Allow Chat Deletion": "Permitir Exclusão de Bate-papo",
|
||||
"Allow non-local voices": "",
|
||||
"Allow Chat Deletion": "Permitir Exclusão de Conversa",
|
||||
"Allow non-local voices": "Permitir vozes não locais",
|
||||
"alphanumeric characters and hyphens": "caracteres alfanuméricos e hífens",
|
||||
"Already have an account?": "Já tem uma conta?",
|
||||
"an assistant": "um assistente",
|
||||
"and": "e",
|
||||
"and create a new shared link.": "e criar um novo link compartilhado.",
|
||||
"and create a new shared link.": "e criar um novo link partilhado.",
|
||||
"API Base URL": "URL Base da API",
|
||||
"API Key": "Chave da API",
|
||||
"API Key created.": "Chave da API criada.",
|
||||
@@ -53,69 +54,69 @@
|
||||
"April": "Abril",
|
||||
"Archive": "Arquivo",
|
||||
"Archive All Chats": "Arquivar todos os chats",
|
||||
"Archived Chats": "Bate-papos arquivados",
|
||||
"are allowed - Activate this command by typing": "são permitidos - Ative este comando digitando",
|
||||
"Are you sure?": "Tem certeza?",
|
||||
"Attach file": "Anexar arquivo",
|
||||
"Archived Chats": "Conversas arquivadas",
|
||||
"are allowed - Activate this command by typing": "são permitidos - Ative este comando escrevendo",
|
||||
"Are you sure?": "Tem a certeza?",
|
||||
"Attach file": "Anexar ficheiro",
|
||||
"Attention to detail": "Detalhado",
|
||||
"Audio": "Áudio",
|
||||
"August": "Agosto",
|
||||
"Auto-playback response": "Reprodução automática da resposta",
|
||||
"AUTOMATIC1111 Base URL": "URL Base do AUTOMATIC1111",
|
||||
"AUTOMATIC1111 Base URL is required.": "A URL Base do AUTOMATIC1111 é obrigatória.",
|
||||
"AUTOMATIC1111 Base URL is required.": "O URL Base do AUTOMATIC1111 é obrigatório.",
|
||||
"available!": "disponível!",
|
||||
"Back": "Voltar",
|
||||
"Bad Response": "Resposta ruim",
|
||||
"Bad Response": "Resposta má",
|
||||
"Banners": "Estandartes",
|
||||
"Base Model (From)": "Modelo Base (De)",
|
||||
"before": "antes",
|
||||
"Being lazy": "Ser preguiçoso",
|
||||
"Brave Search API Key": "Chave da API de Pesquisa Admirável",
|
||||
"Brave Search API Key": "Chave da API de Pesquisa Brave",
|
||||
"Bypass SSL verification for Websites": "Ignorar verificação SSL para sites",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Camera": "",
|
||||
"Call": "Chamar",
|
||||
"Call feature is not supported when using Web STT engine": "A funcionalide de Chamar não é suportada quando usa um motor Web STT",
|
||||
"Camera": "Camera",
|
||||
"Cancel": "Cancelar",
|
||||
"Capabilities": "Capacidades",
|
||||
"Change Password": "Alterar Senha",
|
||||
"Chat": "Bate-papo",
|
||||
"Chat Bubble UI": "UI de Bala de Bate-papo",
|
||||
"Chat direction": "Direção do Bate-papo",
|
||||
"Chat History": "Histórico de Bate-papo",
|
||||
"Chat History is off for this browser.": "O histórico de bate-papo está desativado para este navegador.",
|
||||
"Chats": "Bate-papos",
|
||||
"Chat": "Conversa",
|
||||
"Chat Bubble UI": "Bolha UI da Conversa",
|
||||
"Chat direction": "Direção da Conversa",
|
||||
"Chat History": "Histórico da Conversa",
|
||||
"Chat History is off for this browser.": "O histórico da conversa está desativado para este navegador.",
|
||||
"Chats": "Conversas",
|
||||
"Check Again": "Verifique novamente",
|
||||
"Check for updates": "Verificar atualizações",
|
||||
"Checking for updates...": "Verificando atualizações...",
|
||||
"Choose a model before saving...": "Escolha um modelo antes de salvar...",
|
||||
"Choose a model before saving...": "Escolha um modelo antes de guardar...",
|
||||
"Chunk Overlap": "Sobreposição de Fragmento",
|
||||
"Chunk Params": "Parâmetros de Fragmento",
|
||||
"Chunk Size": "Tamanho do Fragmento",
|
||||
"Citation": "Citação",
|
||||
"Clear memory": "",
|
||||
"Clear memory": "Limpar memória",
|
||||
"Click here for help.": "Clique aqui para obter ajuda.",
|
||||
"Click here to": "Clique aqui para",
|
||||
"Click here to select": "Clique aqui para selecionar",
|
||||
"Click here to select a csv file.": "Clique aqui para selecionar um arquivo csv.",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select a csv file.": "Clique aqui para selecionar um ficheiro csv.",
|
||||
"Click here to select a py file.": "Clique aqui para selecionar um ficheiro py",
|
||||
"Click here to select documents.": "Clique aqui para selecionar documentos.",
|
||||
"click here.": "clique aqui.",
|
||||
"Click on the user role button to change a user's role.": "Clique no botão de função do usuário para alterar a função de um usuário.",
|
||||
"Clone": "Clone",
|
||||
"Click on the user role button to change a user's role.": "Clique no botão de função do utilizador para alterar a função de um utilizador.",
|
||||
"Clone": "Clonar",
|
||||
"Close": "Fechar",
|
||||
"Collection": "Coleção",
|
||||
"ComfyUI": "ComfyUI",
|
||||
"ComfyUI Base URL": "URL Base do ComfyUI",
|
||||
"ComfyUI Base URL is required.": "A URL Base do ComfyUI é obrigatória.",
|
||||
"ComfyUI Base URL is required.": "O URL Base do ComfyUI é obrigatório.",
|
||||
"Command": "Comando",
|
||||
"Concurrent Requests": "Solicitações simultâneas",
|
||||
"Confirm Password": "Confirmar Senha",
|
||||
"Connections": "Conexões",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Contact Admin for WebUI Access": "Contatar Admin para acesso ao WebUI",
|
||||
"Content": "Conteúdo",
|
||||
"Context Length": "Comprimento do Contexto",
|
||||
"Continue Response": "Continuar resposta",
|
||||
"Copied shared chat URL to clipboard!": "URL de bate-papo compartilhado copiada com sucesso!",
|
||||
"Copied shared chat URL to clipboard!": "URL de Conversa partilhado copiada com sucesso!",
|
||||
"Copy": "Copiar",
|
||||
"Copy last code block": "Copiar último bloco de código",
|
||||
"Copy last response": "Copiar última resposta",
|
||||
@@ -132,8 +133,8 @@
|
||||
"Custom": "Personalizado",
|
||||
"Customize models for a specific purpose": "Personalizar modelos para uma finalidade específica",
|
||||
"Dark": "Escuro",
|
||||
"Dashboard": "",
|
||||
"Database": "Banco de dados",
|
||||
"Dashboard": "Painel",
|
||||
"Database": "Base de dados",
|
||||
"December": "Dezembro",
|
||||
"Default": "Padrão",
|
||||
"Default (Automatic1111)": "Padrão (Automatic1111)",
|
||||
@@ -141,126 +142,129 @@
|
||||
"Default Model": "Modelo padrão",
|
||||
"Default model updated": "Modelo padrão atualizado",
|
||||
"Default Prompt Suggestions": "Sugestões de Prompt Padrão",
|
||||
"Default User Role": "Função de Usuário Padrão",
|
||||
"delete": "excluir",
|
||||
"Delete": "Excluir",
|
||||
"Delete a model": "Excluir um modelo",
|
||||
"Delete All Chats": "Excluir todos os chats",
|
||||
"Delete chat": "Excluir bate-papo",
|
||||
"Delete Chat": "Excluir Bate-papo",
|
||||
"delete this link": "excluir este link",
|
||||
"Delete User": "Excluir Usuário",
|
||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} excluído",
|
||||
"Deleted {{name}}": "Suprimido {{name}}",
|
||||
"Default User Role": "Função de Utilizador Padrão",
|
||||
"delete": "apagar",
|
||||
"Delete": "Apagar",
|
||||
"Delete a model": "Apagar um modelo",
|
||||
"Delete All Chats": "Apagar todas as conversas",
|
||||
"Delete chat": "Apagar conversa",
|
||||
"Delete Chat": "Apagar Conversa",
|
||||
"delete this link": "apagar este link",
|
||||
"Delete User": "Apagar Utilizador",
|
||||
"Deleted {{deleteModelTag}}": "{{deleteModelTag}} apagado",
|
||||
"Deleted {{name}}": "Apagado {{name}}",
|
||||
"Description": "Descrição",
|
||||
"Didn't fully follow instructions": "Não seguiu instruções com precisão",
|
||||
"Discover a model": "Descubra um modelo",
|
||||
"Discover a prompt": "Descobrir um prompt",
|
||||
"Discover, download, and explore custom prompts": "Descubra, baixe e explore prompts personalizados",
|
||||
"Discover, download, and explore model presets": "Descubra, baixe e explore predefinições de modelo",
|
||||
"Dismissible": "",
|
||||
"Display the username instead of You in the Chat": "Exibir o nome de usuário em vez de Você no Bate-papo",
|
||||
"Discover, download, and explore custom prompts": "Descubra, descarregue e explore prompts personalizados",
|
||||
"Discover, download, and explore model presets": "Descubra, descarregue e explore predefinições de modelo",
|
||||
"Dismissible": "Dispensável",
|
||||
"Display the username instead of You in the Chat": "Exibir o nome de utilizador em vez de Você na Conversa",
|
||||
"Document": "Documento",
|
||||
"Document Settings": "Configurações de Documento",
|
||||
"Documentation": "",
|
||||
"Documentation": "Documentação",
|
||||
"Documents": "Documentos",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "não faz conexões externas e seus dados permanecem seguros em seu servidor hospedado localmente.",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "não faz conexões externas e os seus dados permanecem seguros no seu servidor alojado localmente.",
|
||||
"Don't Allow": "Não Permitir",
|
||||
"Don't have an account?": "Não tem uma conta?",
|
||||
"Don't like the style": "Não gosta do estilo",
|
||||
"Download": "Baixar",
|
||||
"Download": "Descarregar",
|
||||
"Download canceled": "Download cancelado",
|
||||
"Download Database": "Baixar Banco de Dados",
|
||||
"Drop any files here to add to the conversation": "Solte os arquivos aqui para adicionar à conversa",
|
||||
"Download Database": "Descarregar Base de Dados",
|
||||
"Drop any files here to add to the conversation": "Largue os ficheiros aqui para adicionar à conversa",
|
||||
"e.g. '30s','10m'. Valid time units are 's', 'm', 'h'.": "por exemplo, '30s', '10m'. Unidades de tempo válidas são 's', 'm', 'h'.",
|
||||
"Edit": "Editar",
|
||||
"Edit Doc": "Editar Documento",
|
||||
"Edit User": "Editar Usuário",
|
||||
"Edit User": "Editar Utilizador",
|
||||
"Email": "E-mail",
|
||||
"Embedding Batch Size": "",
|
||||
"Embedding Batch Size": "Tamanho do Lote do Embedding",
|
||||
"Embedding Model": "Modelo de Embedding",
|
||||
"Embedding Model Engine": "Motor de Modelo de Embedding",
|
||||
"Embedding model set to \"{{embedding_model}}\"": "Modelo de Embedding definido como \"{{embedding_model}}\"",
|
||||
"Enable Chat History": "Ativar Histórico de Bate-papo",
|
||||
"Enable Community Sharing": "Habilite o compartilhamento da comunidade",
|
||||
"Enable Chat History": "Ativar Histórico de Conversas",
|
||||
"Enable Community Sharing": "Active a Partilha da Comunidade",
|
||||
"Enable New Sign Ups": "Ativar Novas Inscrições",
|
||||
"Enable Web Search": "Ativar pesquisa na Web",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Garanta que seu arquivo CSV inclua 4 colunas nesta ordem: Nome, E-mail, Senha, Função.",
|
||||
"Enter {{role}} message here": "Digite a mensagem de {{role}} aqui",
|
||||
"Enter a detail about yourself for your LLMs to recall": "Digite um detalhe sobre você para que seus LLMs possam lembrá-lo",
|
||||
"Enter Brave Search API Key": "Insira a chave da API do Brave Search",
|
||||
"Enter Chunk Overlap": "Digite a Sobreposição de Fragmento",
|
||||
"Enter Chunk Size": "Digite o Tamanho do Fragmento",
|
||||
"Enter Github Raw URL": "Insira o URL bruto do Github",
|
||||
"Enter Google PSE API Key": "Insira a chave da API PSE do Google",
|
||||
"Enter Google PSE Engine Id": "Insira o ID do mecanismo PSE do Google",
|
||||
"Enter Image Size (e.g. 512x512)": "Digite o Tamanho da Imagem (por exemplo, 512x512)",
|
||||
"Enter language codes": "Digite os códigos de idioma",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Digite a tag do modelo (por exemplo, {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Digite o Número de Etapas (por exemplo, 50)",
|
||||
"Enter Score": "Digite a Pontuação",
|
||||
"Enter Searxng Query URL": "Insira o URL da Consulta Searxng",
|
||||
"Enter Serper API Key": "Insira a chave da API Serper",
|
||||
"Enter Serpstack API Key": "Insira a chave da API Serpstack",
|
||||
"Enter stop sequence": "Digite a sequência de parada",
|
||||
"Enter Top K": "Digite o Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Digite a URL (por exemplo, http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Digite a URL (por exemplo, http://localhost:11434)",
|
||||
"Enter Your Email": "Digite seu E-mail",
|
||||
"Enter Your Full Name": "Digite seu Nome Completo",
|
||||
"Enter Your Password": "Digite sua Senha",
|
||||
"Enter Your Role": "Digite sua Função",
|
||||
"Ensure your CSV file includes 4 columns in this order: Name, Email, Password, Role.": "Confirme que o seu ficheiro CSV inclui 4 colunas nesta ordem: Nome, E-mail, Senha, Função.",
|
||||
"Enter {{role}} message here": "Escreva a mensagem de {{role}} aqui",
|
||||
"Enter a detail about yourself for your LLMs to recall": "Escreva um detalhe sobre você para que os seus LLMs possam lembrar-se",
|
||||
"Enter Brave Search API Key": "Escreva a chave da API do Brave Search",
|
||||
"Enter Chunk Overlap": "Escreva a Sobreposição de Fragmento",
|
||||
"Enter Chunk Size": "Escreva o Tamanho do Fragmento",
|
||||
"Enter Github Raw URL": "Escreva o URL cru do Github",
|
||||
"Enter Google PSE API Key": "Escreva a chave da API PSE do Google",
|
||||
"Enter Google PSE Engine Id": "Escreva o ID do mecanismo PSE do Google",
|
||||
"Enter Image Size (e.g. 512x512)": "Escreva o Tamanho da Imagem (por exemplo, 512x512)",
|
||||
"Enter language codes": "Escreva os códigos de idioma",
|
||||
"Enter model tag (e.g. {{modelTag}})": "Escreva a tag do modelo (por exemplo, {{modelTag}})",
|
||||
"Enter Number of Steps (e.g. 50)": "Escreva o Número de Etapas (por exemplo, 50)",
|
||||
"Enter Score": "Escreva a Pontuação",
|
||||
"Enter Searxng Query URL": "Escreva o URL da Pesquisa Searxng",
|
||||
"Enter Serper API Key": "Escreva a chave da API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Escreva a chave da API Serpstack",
|
||||
"Enter stop sequence": "Escreva a sequência de paragem",
|
||||
"Enter Top K": "Escreva o Top K",
|
||||
"Enter URL (e.g. http://127.0.0.1:7860/)": "Escreva o URL (por exemplo, http://127.0.0.1:7860/)",
|
||||
"Enter URL (e.g. http://localhost:11434)": "Escreva o URL (por exemplo, http://localhost:11434)",
|
||||
"Enter Your Email": "Escreva o seu E-mail",
|
||||
"Enter Your Full Name": "Escreva o seu Nome Completo",
|
||||
"Enter Your Password": "Escreva a sua Senha",
|
||||
"Enter Your Role": "Escreva a sua Função",
|
||||
"Error": "Erro",
|
||||
"Experimental": "Experimental",
|
||||
"Export": "Exportação",
|
||||
"Export All Chats (All Users)": "Exportar Todos os Bate-papos (Todos os Usuários)",
|
||||
"Export chat (.json)": "",
|
||||
"Export Chats": "Exportar Bate-papos",
|
||||
"Export": "Exportar",
|
||||
"Export All Chats (All Users)": "Exportar Todas as Conversas (Todos os Utilizadores)",
|
||||
"Export chat (.json)": "Exportar Conversa (.json)",
|
||||
"Export Chats": "Exportar Conversas",
|
||||
"Export Documents Mapping": "Exportar Mapeamento de Documentos",
|
||||
"Export Models": "Modelos de Exportação",
|
||||
"Export Prompts": "Exportar Prompts",
|
||||
"External Models": "",
|
||||
"Export Tools": "",
|
||||
"External Models": "Modelos Externos",
|
||||
"Failed to create API Key.": "Falha ao criar a Chave da API.",
|
||||
"Failed to read clipboard contents": "Falha ao ler o conteúdo da área de transferência",
|
||||
"Failed to update settings": "",
|
||||
"Failed to update settings": "Falha ao atualizar as definições",
|
||||
"February": "Fevereiro",
|
||||
"Feel free to add specific details": "Sinta-se à vontade para adicionar detalhes específicos",
|
||||
"File Mode": "Modo de Arquivo",
|
||||
"File not found.": "Arquivo não encontrado.",
|
||||
"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Impostação de impressão digital detectada: Não é possível usar iniciais como avatar. Padronizando para imagem de perfil padrão.",
|
||||
"File Mode": "Modo de Ficheiro",
|
||||
"File not found.": "Ficheiro não encontrado.",
|
||||
"Fingerprint spoofing detected: Unable to use initials as avatar. Defaulting to default profile image.": "Detectada falsificação da impressão digital: Não é possível usar iniciais como avatar. A usar a imagem de perfil padrão.",
|
||||
"Fluidly stream large external response chunks": "Transmita com fluidez grandes blocos de resposta externa",
|
||||
"Focus chat input": "Focar entrada de bate-papo",
|
||||
"Focus chat input": "Focar na conversa",
|
||||
"Followed instructions perfectly": "Seguiu instruções perfeitamente",
|
||||
"Format your variables using square brackets like this:": "Formate suas variáveis usando colchetes como este:",
|
||||
"Format your variables using square brackets like this:": "Formate as suas variáveis usando parenteses rectos como este:",
|
||||
"Frequency Penalty": "Penalidade de Frequência",
|
||||
"General": "Geral",
|
||||
"General Settings": "Configurações Gerais",
|
||||
"Generate Image": "",
|
||||
"Generating search query": "Gerar consulta de pesquisa",
|
||||
"Generate Image": "Gerar imagem",
|
||||
"Generating search query": "A gerar a consulta da pesquisa",
|
||||
"Generation Info": "Informações de Geração",
|
||||
"Good Response": "Boa Resposta",
|
||||
"Google PSE API Key": "Chave da API PSE do Google",
|
||||
"Google PSE Engine Id": "ID do mecanismo PSE do Google",
|
||||
"h:mm a": "h:mm a",
|
||||
"has no conversations.": "não possui bate-papos.",
|
||||
"has no conversations.": "não possui conversas.",
|
||||
"Hello, {{name}}": "Olá, {{name}}",
|
||||
"Help": "Help",
|
||||
"Help": "Ajuda",
|
||||
"Hide": "Ocultar",
|
||||
"How can I help you today?": "Como posso ajudá-lo hoje?",
|
||||
"Hybrid Search": "Pesquisa Híbrida",
|
||||
"Image Generation (Experimental)": "Geração de Imagens (Experimental)",
|
||||
"Image Generation Engine": "Mecanismo de Geração de Imagens",
|
||||
"Image Settings": "Configurações de Imagem",
|
||||
"Image Settings": "Configurações da Imagem",
|
||||
"Images": "Imagens",
|
||||
"Import Chats": "Importar Bate-papos",
|
||||
"Import Chats": "Importar Conversas",
|
||||
"Import Documents Mapping": "Importar Mapeamento de Documentos",
|
||||
"Import Models": "Importar Modelos",
|
||||
"Import Prompts": "Importar Prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inclua a flag `--api` ao executar stable-diffusion-webui",
|
||||
"Info": "Informação",
|
||||
"Input commands": "Comandos de entrada",
|
||||
"Install from Github URL": "Instalar a partir do URL do Github",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Instant Auto-Send After Voice Transcription": "Enviar automaticamente depois da transcrição da voz",
|
||||
"Interface": "Interface",
|
||||
"Invalid Tag": "Etiqueta Inválida",
|
||||
"January": "Janeiro",
|
||||
@@ -273,55 +277,55 @@
|
||||
"JWT Token": "Token JWT",
|
||||
"Keep Alive": "Manter Vivo",
|
||||
"Keyboard shortcuts": "Atalhos de teclado",
|
||||
"Knowledge": "",
|
||||
"Knowledge": "Conhecimento",
|
||||
"Language": "Idioma",
|
||||
"Last Active": "Último Ativo",
|
||||
"Light": "Claro",
|
||||
"Listening...": "",
|
||||
"Listening...": "A escutar...",
|
||||
"LLMs can make mistakes. Verify important information.": "LLMs podem cometer erros. Verifique informações importantes.",
|
||||
"Local Models": "",
|
||||
"Local Models": "Modelos Locais",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Feito pela Comunidade OpenWebUI",
|
||||
"Make sure to enclose them with": "Certifique-se de colocá-los entre",
|
||||
"Manage": "",
|
||||
"Manage Models": "Gerenciar Modelos",
|
||||
"Manage Ollama Models": "Gerenciar Modelos Ollama",
|
||||
"Manage Pipelines": "Gerenciar pipelines",
|
||||
"Manage": "Gerir",
|
||||
"Manage Models": "Gerir Modelos",
|
||||
"Manage Ollama Models": "Gerir Modelos Ollama",
|
||||
"Manage Pipelines": "Gerir pipelines",
|
||||
"March": "Março",
|
||||
"Max Tokens (num_predict)": "Max Tokens (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "Máximo de 3 modelos podem ser baixados simultaneamente. Tente novamente mais tarde.",
|
||||
"Max Tokens (num_predict)": "Máx Tokens (num_predict)",
|
||||
"Maximum of 3 models can be downloaded simultaneously. Please try again later.": "O máximo de 3 modelos podem ser descarregados simultaneamente. Tente novamente mais tarde.",
|
||||
"May": "Maio",
|
||||
"Memories accessible by LLMs will be shown here.": "Memórias acessíveis por LLMs serão mostradas aqui.",
|
||||
"Memory": "Memória",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Mensagens que você enviar após criar seu link não serão compartilhadas. Os usuários com o URL poderão visualizar o bate-papo compartilhado.",
|
||||
"Messages you send after creating your link won't be shared. Users with the URL will be able to view the shared chat.": "Mensagens que você enviar após criar o seu link não serão partilhadas. Os utilizadores com o URL poderão visualizar a conversa partilhada.",
|
||||
"Minimum Score": "Mínimo de Pontuação",
|
||||
"Mirostat": "Mirostat",
|
||||
"Mirostat Eta": "Mirostat Eta",
|
||||
"Mirostat Tau": "Mirostat Tau",
|
||||
"MMMM DD, YYYY": "DD/MM/YYYY",
|
||||
"MMMM DD, YYYY HH:mm": "DD/MM/YYYY HH:mm",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "O modelo '{{modelName}}' foi baixado com sucesso.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "O modelo '{{modelTag}}' já está na fila para download.",
|
||||
"Model {{modelId}} not found": "Modelo {{modelId}} não encontrado",
|
||||
"Model '{{modelName}}' has been successfully downloaded.": "O modelo '{{modelName}}' foi descarregado com sucesso.",
|
||||
"Model '{{modelTag}}' is already in queue for downloading.": "O modelo '{{modelTag}}' já está na fila para descarregar.",
|
||||
"Model {{modelId}} not found": "Modelo {{modelId}} não foi encontrado",
|
||||
"Model {{modelName}} is not vision capable": "O modelo {{modelName}} não é capaz de visão",
|
||||
"Model {{name}} is now {{status}}": "Modelo {{name}} agora é {{status}}",
|
||||
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Caminho do sistema de arquivos do modelo detectado. É necessário o nome curto do modelo para atualização, não é possível continuar.",
|
||||
"Model filesystem path detected. Model shortname is required for update, cannot continue.": "Dtectado caminho do sistema de ficheiros do modelo. É necessário o nome curto do modelo para atualização, não é possível continuar.",
|
||||
"Model ID": "ID do modelo",
|
||||
"Model not selected": "Modelo não selecionado",
|
||||
"Model Params": "Params Modelo",
|
||||
"Model Whitelisting": "Lista de Permissões de Modelo",
|
||||
"Model Whitelisting": "Lista de Permissões do Modelo",
|
||||
"Model(s) Whitelisted": "Modelo(s) na Lista de Permissões",
|
||||
"Modelfile Content": "Conteúdo do Arquivo de Modelo",
|
||||
"Modelfile Content": "Conteúdo do Ficheiro do Modelo",
|
||||
"Models": "Modelos",
|
||||
"More": "Mais",
|
||||
"Name": "Nome",
|
||||
"Name Tag": "Tag de Nome",
|
||||
"Name Tag": "Etiqueta de Nome",
|
||||
"Name your model": "Atribua um nome ao seu modelo",
|
||||
"New Chat": "Novo Bate-papo",
|
||||
"New Chat": "Nova Conversa",
|
||||
"New Password": "Nova Senha",
|
||||
"No documents found": "",
|
||||
"No results found": "Nenhum resultado encontrado",
|
||||
"No search query generated": "Nenhuma consulta de pesquisa gerada",
|
||||
"No documents found": "Não foram encontrados documentos",
|
||||
"No results found": "Não foram encontrados resultados",
|
||||
"No search query generated": "Não foi gerada nenhuma consulta de pesquisa",
|
||||
"No source available": "Nenhuma fonte disponível",
|
||||
"None": "Nenhum",
|
||||
"Not factually correct": "Não é correto em termos factuais",
|
||||
@@ -336,18 +340,18 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "API do Ollama desativada",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama API is disabled": "A API do Ollama está desactivada",
|
||||
"Ollama Version": "Versão do Ollama",
|
||||
"On": "Ligado",
|
||||
"Only": "Somente",
|
||||
"Only alphanumeric characters and hyphens are allowed in the command string.": "Somente caracteres alfanuméricos e hífens são permitidos na string de comando.",
|
||||
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Opa! Aguente firme! Seus arquivos ainda estão no forno de processamento. Estamos cozinhando-os com perfeição. Por favor, seja paciente e avisaremos quando estiverem prontos.",
|
||||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Opa! Parece que a URL é inválida. Verifique novamente e tente outra vez.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Opa! Você está usando um método não suportado (somente frontend). Por favor, sirva o WebUI a partir do backend.",
|
||||
"Only": "Apenas",
|
||||
"Only alphanumeric characters and hyphens are allowed in the command string.": "Apenas caracteres alfanuméricos e hífens são permitidos na string de comando.",
|
||||
"Oops! Hold tight! Your files are still in the processing oven. We're cooking them up to perfection. Please be patient and we'll let you know once they're ready.": "Epá! Segura-te! Os teus ficheiros ainda estão no forno de processamento. Estamos a cozinhá-los com perfeição. Por favor, seja paciente e avisaremos quando estiverem prontos.",
|
||||
"Oops! Looks like the URL is invalid. Please double-check and try again.": "Epá! Parece que o URL é inválido. Verifique novamente e tente outra vez.",
|
||||
"Oops! You're using an unsupported method (frontend only). Please serve the WebUI from the backend.": "Epá! Você está a usar um método não suportado (somente frontend). Por favor, sirva o WebUI a partir do backend.",
|
||||
"Open": "Abrir",
|
||||
"Open AI": "OpenAI",
|
||||
"Open AI (Dall-E)": "OpenAI (Dall-E)",
|
||||
"Open new chat": "Abrir novo bate-papo",
|
||||
"Open AI": "Open AI",
|
||||
"Open AI (Dall-E)": "Open AI (Dall-E)",
|
||||
"Open new chat": "Abrir nova conversa",
|
||||
"OpenAI": "OpenAI",
|
||||
"OpenAI API": "API OpenAI",
|
||||
"OpenAI API Config": "Configuração da API OpenAI",
|
||||
@@ -359,31 +363,31 @@
|
||||
"PDF document (.pdf)": "Documento PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Extrair Imagens de PDF (OCR)",
|
||||
"pending": "pendente",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing microphone: {{error}}": "Permissão negada ao acessar o microfone: {{error}}",
|
||||
"Permission denied when accessing media devices": "A permissão foi negada ao aceder aos dispositivos de media",
|
||||
"Permission denied when accessing microphone": "A permissão foi negada ao aceder ao microfone",
|
||||
"Permission denied when accessing microphone: {{error}}": "A permissão foi negada ao aceder o microfone: {{error}}",
|
||||
"Personalization": "Personalização",
|
||||
"Pipelines": "Condutas",
|
||||
"Pipelines Valves": "Válvulas de Condutas",
|
||||
"Plain text (.txt)": "Texto sem formatação (.txt)",
|
||||
"Playground": "Parque infantil",
|
||||
"Playground": "Recreio",
|
||||
"Positive attitude": "Atitude Positiva",
|
||||
"Previous 30 days": "Últimos 30 dias",
|
||||
"Previous 7 days": "Últimos 7 dias",
|
||||
"Profile Image": "Imagem de Perfil",
|
||||
"Prompt": "Prompt",
|
||||
"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (ex.: Dê-me um fatídico sobre o Império Romano)",
|
||||
"Prompt (e.g. Tell me a fun fact about the Roman Empire)": "Prompt (ex.: Dê-me um facto divertido sobre o Império Romano)",
|
||||
"Prompt Content": "Conteúdo do Prompt",
|
||||
"Prompt suggestions": "Sugestões de Prompt",
|
||||
"Prompts": "Prompts",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Extrair \"{{searchValue}}\" do Ollama.com",
|
||||
"Pull a model from Ollama.com": "Extrair um modelo do Ollama.com",
|
||||
"Pull \"{{searchValue}}\" from Ollama.com": "Puxar \"{{searchValue}}\" do Ollama.com",
|
||||
"Pull a model from Ollama.com": "Puxar um modelo do Ollama.com",
|
||||
"Query Params": "Parâmetros de Consulta",
|
||||
"RAG Template": "Modelo RAG",
|
||||
"Read Aloud": "Ler em Voz Alta",
|
||||
"Record voice": "Gravar voz",
|
||||
"Redirecting you to OpenWebUI Community": "Redirecionando você para a Comunidade OpenWebUI",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Redirecting you to OpenWebUI Community": "Redirecionando-o para a Comunidade OpenWebUI",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Refera-se a si próprio como \"User\" (por exemplo, \"User está a aprender Espanhol\")",
|
||||
"Refused when it shouldn't have": "Recusado quando não deveria",
|
||||
"Regenerate": "Regenerar",
|
||||
"Release Notes": "Notas de Lançamento",
|
||||
@@ -391,57 +395,60 @@
|
||||
"Remove Model": "Remover Modelo",
|
||||
"Rename": "Renomear",
|
||||
"Repeat Last N": "Repetir Últimos N",
|
||||
"Request Mode": "Modo de Solicitação",
|
||||
"Request Mode": "Modo de Pedido",
|
||||
"Reranking Model": "Modelo de Reranking",
|
||||
"Reranking model disabled": "Modelo de Reranking desativado",
|
||||
"Reranking model set to \"{{reranking_model}}\"": "Modelo de Reranking definido como \"{{reranking_model}}\"",
|
||||
"Reset Upload Directory": "",
|
||||
"Reset Upload Directory": "Limpar Pasta de Carregamento",
|
||||
"Reset Vector Storage": "Redefinir Armazenamento de Vetor",
|
||||
"Response AutoCopy to Clipboard": "Cópia Automática da Resposta para a Área de Transferência",
|
||||
"Role": "Função",
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Save": "Salvar",
|
||||
"Save & Create": "Salvar e Criar",
|
||||
"Save & Update": "Salvar e Atualizar",
|
||||
"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": "Salvar logs de bate-papo diretamente no armazenamento do seu navegador não é mais suportado. Reserve um momento para baixar e excluir seus logs de bate-papo clicando no botão abaixo. Não se preocupe, você pode facilmente reimportar seus logs de bate-papo para o backend através de",
|
||||
"Running": "A correr",
|
||||
"Save": "Guardar",
|
||||
"Save & Create": "Guardar e Criar",
|
||||
"Save & Update": "Guardar e Atualizar",
|
||||
"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": "Guardar o registo das conversas diretamente no armazenamento do seu navegador já não é suportado. Reserve um momento para descarregar e eliminar os seus registos de conversas clicando no botão abaixo. Não se preocupe, você pode facilmente reimportar os seus registos de conversas para o backend através de",
|
||||
"Scan": "Digitalizar",
|
||||
"Scan complete!": "Digitalização concluída!",
|
||||
"Scan for documents from {{path}}": "Digitalizar documentos de {{path}}",
|
||||
"Search": "Pesquisar",
|
||||
"Search a model": "Pesquisar um modelo",
|
||||
"Search Chats": "Pesquisar Chats",
|
||||
"Search Chats": "Pesquisar Conversas",
|
||||
"Search Documents": "Pesquisar Documentos",
|
||||
"Search Models": "Modelos de pesquisa",
|
||||
"Search Prompts": "Pesquisar Prompts",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Query Generation Prompt": "Prompt de geração de consulta de pesquisa",
|
||||
"Search Query Generation Prompt Length Threshold": "Limite de comprimento do prompt de geração de consulta de pesquisa",
|
||||
"Search Result Count": "Contagem de resultados da pesquisa",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Pesquisado {{count}} sites_one",
|
||||
"Searched {{count}} sites_many": "Pesquisado {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Pesquisado {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Pesquisando na Web por '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "URL de consulta Searxng",
|
||||
"See readme.md for instructions": "Consulte readme.md para obter instruções",
|
||||
"See what's new": "Veja o que há de novo",
|
||||
"Seed": "Semente",
|
||||
"Select a base model": "Selecione um modelo base",
|
||||
"Select a engine": "",
|
||||
"Select a engine": "Selecione um motor",
|
||||
"Select a mode": "Selecione um modo",
|
||||
"Select a model": "Selecione um modelo",
|
||||
"Select a pipeline": "Selecione um pipeline",
|
||||
"Select a pipeline url": "Selecione um URL de pipeline",
|
||||
"Select an Ollama instance": "Selecione uma instância Ollama",
|
||||
"Select model": "Selecione um modelo",
|
||||
"Select only one model to call": "",
|
||||
"Select Documents": "",
|
||||
"Select model": "Selecione o modelo",
|
||||
"Select only one model to call": "Selecione apenas um modelo para a chamada",
|
||||
"Selected model(s) do not support image inputs": "O(s) modelo(s) selecionado(s) não suporta(m) entradas de imagem",
|
||||
"Send": "Enviar",
|
||||
"Send a Message": "Enviar uma Mensagem",
|
||||
"Send message": "Enviar mensagem",
|
||||
"September": "Setembro",
|
||||
"Serper API Key": "Chave API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Chave da API Serpstack",
|
||||
"Server connection verified": "Conexão com o servidor verificada",
|
||||
"Set as default": "Definir como padrão",
|
||||
@@ -453,26 +460,26 @@
|
||||
"Set Task Model": "Definir modelo de tarefa",
|
||||
"Set Voice": "Definir Voz",
|
||||
"Settings": "Configurações",
|
||||
"Settings saved successfully!": "Configurações salvas com sucesso!",
|
||||
"Settings updated successfully": "",
|
||||
"Share": "Compartilhar",
|
||||
"Share Chat": "Compartilhar Bate-papo",
|
||||
"Share to OpenWebUI Community": "Compartilhar com a Comunidade OpenWebUI",
|
||||
"Settings saved successfully!": "Configurações guardadas com sucesso!",
|
||||
"Settings updated successfully": "Configurações atualizadas com sucesso",
|
||||
"Share": "Partilhar",
|
||||
"Share Chat": "Partilhar Conversa",
|
||||
"Share to OpenWebUI Community": "Partilhar com a Comunidade OpenWebUI",
|
||||
"short-summary": "resumo-curto",
|
||||
"Show": "Mostrar",
|
||||
"Show Admin Details in Account Pending Overlay": "",
|
||||
"Show shortcuts": "Mostrar",
|
||||
"Show Admin Details in Account Pending Overlay": "Mostrar Detalhes do Administrador na sobreposição de Conta Pendente",
|
||||
"Show shortcuts": "Mostrar atalhos",
|
||||
"Showcased creativity": "Criatividade Exibida",
|
||||
"sidebar": "barra lateral",
|
||||
"Sign in": "Entrar",
|
||||
"Sign Out": "Sair",
|
||||
"Sign up": "Inscrever-se",
|
||||
"Signing in": "Entrando",
|
||||
"Signing in": "A entrar",
|
||||
"Source": "Fonte",
|
||||
"Speech recognition error: {{error}}": "Erro de reconhecimento de fala: {{error}}",
|
||||
"Speech-to-Text Engine": "Mecanismo de Fala para Texto",
|
||||
"Stop Sequence": "Sequência de Parada",
|
||||
"STT Model": "",
|
||||
"Speech-to-Text Engine": "Motor de Fala para Texto",
|
||||
"Stop Sequence": "Sequência de Paragem",
|
||||
"STT Model": "Modelo STT",
|
||||
"STT Settings": "Configurações STT",
|
||||
"Submit": "Enviar",
|
||||
"Subtitle (e.g. about the Roman Empire)": "Subtítulo (ex.: sobre o Império Romano)",
|
||||
@@ -481,69 +488,72 @@
|
||||
"Suggested": "Sugerido",
|
||||
"System": "Sistema",
|
||||
"System Prompt": "Prompt do Sistema",
|
||||
"Tags": "Tags",
|
||||
"Tell us more:": "Dê-nos mais:",
|
||||
"Tags": "Etiquetas",
|
||||
"Tell us more:": "Diga-nos mais:",
|
||||
"Temperature": "Temperatura",
|
||||
"Template": "Modelo",
|
||||
"Text Completion": "Complemento de Texto",
|
||||
"Text-to-Speech Engine": "Mecanismo de Texto para Fala",
|
||||
"Text Completion": "Conclusão de Texto",
|
||||
"Text-to-Speech Engine": "Motor de Texto para Fala",
|
||||
"Tfs Z": "Tfs Z",
|
||||
"Thanks for your feedback!": "Obrigado pelo feedback!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "O score deve ser um valor entre 0.0 (0%) e 1.0 (100%).",
|
||||
"Thanks for your feedback!": "Obrigado pelo seu feedback!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "A pontuação deve ser um valor entre 0.0 (0%) e 1.0 (100%).",
|
||||
"Theme": "Tema",
|
||||
"Thinking...": "",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Isso garante que suas conversas valiosas sejam salvas com segurança em seu banco de dados de backend. Obrigado!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"Thinking...": "A pensar...",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Isto garante que suas conversas valiosas sejam guardadas com segurança na sua base de dados de backend. Obrigado!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Isto é um recurso experimental, pode não funcionar conforme o esperado e está sujeito a alterações a qualquer momento.",
|
||||
"This setting does not sync across browsers or devices.": "Esta configuração não sincroniza entre navegadores ou dispositivos.",
|
||||
"Thorough explanation": "Explicação Completa",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Dica: Atualize vários slots de variáveis consecutivamente pressionando a tecla Tab na entrada de bate-papo após cada substituição.",
|
||||
"Thorough explanation": "Explicação Minuciosa",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Dica: Atualize vários slots de variáveis consecutivamente pressionando a tecla Tab na entrada da conversa após cada substituição.",
|
||||
"Title": "Título",
|
||||
"Title (e.g. Tell me a fun fact)": "Título (ex.: Dê-me um fatídico fatídico)",
|
||||
"Title (e.g. Tell me a fun fact)": "Título (ex.: Diz-me um facto divertido)",
|
||||
"Title Auto-Generation": "Geração Automática de Título",
|
||||
"Title cannot be an empty string.": "Título não pode ser uma string vazia.",
|
||||
"Title Generation Prompt": "Prompt de Geração de Título",
|
||||
"to": "para",
|
||||
"To access the available model names for downloading,": "Para acessar os nomes de modelo disponíveis para download,",
|
||||
"To access the GGUF models available for downloading,": "Para acessar os modelos GGUF disponíveis para download,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"to chat input.": "para a entrada de bate-papo.",
|
||||
"To access the available model names for downloading,": "Para aceder aos nomes de modelo disponíveis para descarregar,",
|
||||
"To access the GGUF models available for downloading,": "Para aceder aos modelos GGUF disponíveis para descarregar,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Para aceder ao WebUI, entre em contato com o administrador. Os administradores podem gerir o status dos utilizadores no Painel de Administração.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "para a entrada da conversa.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Hoje",
|
||||
"Toggle settings": "Alternar configurações",
|
||||
"Toggle sidebar": "Alternar barra lateral",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Problemas para acessar o Ollama?",
|
||||
"TTS Model": "",
|
||||
"Trouble accessing Ollama?": "Problemas a aceder ao Ollama?",
|
||||
"TTS Model": "Modelo TTS",
|
||||
"TTS Settings": "Configurações TTS",
|
||||
"TTS Voice": "",
|
||||
"TTS Voice": "Voz TTS",
|
||||
"Type": "Tipo",
|
||||
"Type Hugging Face Resolve (Download) URL": "Digite a URL do Hugging Face Resolve (Download)",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Opa! Houve um problema ao conectar-se a {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipo de arquivo desconhecido '{{file_type}}', mas aceitando e tratando como texto simples",
|
||||
"Type Hugging Face Resolve (Download) URL": "Escreva o URL do Hugging Face Resolve (Descarregar)",
|
||||
"Uh-oh! There was an issue connecting to {{provider}}.": "Uh-oh! Houve um problema ao conectar a {{provider}}.",
|
||||
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipo de ficheiro desconhecido '{{file_type}}', mas aceitando e tratando como texto simples",
|
||||
"Update and Copy Link": "Atualizar e Copiar Link",
|
||||
"Update password": "Atualizar senha",
|
||||
"Upload a GGUF model": "Carregar um modelo GGUF",
|
||||
"Upload Files": "Carregar ficheiros",
|
||||
"Upload Pipeline": "",
|
||||
"Upload Pipeline": "Carregar Pipeline",
|
||||
"Upload Progress": "Progresso do Carregamento",
|
||||
"URL Mode": "Modo de URL",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Use '#' na entrada do prompt para carregar e selecionar seus documentos.",
|
||||
"Use '#' in the prompt input to load and select your documents.": "Use '#' na entrada do prompt para carregar e selecionar os seus documentos.",
|
||||
"Use Gravatar": "Usar Gravatar",
|
||||
"Use Initials": "Usar Iniciais",
|
||||
"use_mlock (Ollama)": "use_mlock (Ollama)",
|
||||
"use_mmap (Ollama)": "use_mmap (Ollama)",
|
||||
"user": "usuário",
|
||||
"User Permissions": "Permissões do Usuário",
|
||||
"Users": "Usuários",
|
||||
"user": "utilizador",
|
||||
"User Permissions": "Permissões do Utilizador",
|
||||
"Users": "Utilizadores",
|
||||
"Utilize": "Utilizar",
|
||||
"Valid time units:": "Unidades de tempo válidas:",
|
||||
"variable": "variável",
|
||||
"variable to have them replaced with clipboard content.": "variável para que sejam substituídos pelo conteúdo da área de transferência.",
|
||||
"Version": "Versão",
|
||||
"Warning": "Advertência",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Aviso: Se você atualizar ou alterar seu modelo de vetorização, você precisará reimportar todos os documentos.",
|
||||
"Warning": "Aviso",
|
||||
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Aviso: Se você atualizar ou alterar o seu modelo de vetorização, você tem de reimportar todos os documentos.",
|
||||
"Web": "Web",
|
||||
"Web API": "",
|
||||
"Web API": "Web API",
|
||||
"Web Loader Settings": "Configurações do Carregador da Web",
|
||||
"Web Params": "Parâmetros da Web",
|
||||
"Web Search": "Pesquisa na Web",
|
||||
@@ -551,23 +561,23 @@
|
||||
"Webhook URL": "URL do Webhook",
|
||||
"WebUI Add-ons": "Complementos WebUI",
|
||||
"WebUI Settings": "Configurações WebUI",
|
||||
"WebUI will make requests to": "WebUI fará solicitações para",
|
||||
"WebUI will make requests to": "WebUI fará pedidos a",
|
||||
"What’s New in": "O que há de novo em",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quando o histórico está desativado, novos bate-papos neste navegador não aparecerão em seu histórico em nenhum dos seus dispositivos.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Quando o histórico está desativado, novas conversas neste navegador não aparecerão em seu histórico em nenhum dos seus dispositivos.",
|
||||
"Whisper (Local)": "Whisper (Local)",
|
||||
"Widescreen Mode": "Modo Widescreen",
|
||||
"Workspace": "Espaço de Trabalho",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Escreva uma sugestão de prompt (por exemplo, Quem é você?)",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Escreva uma sugestão de prompt (por exemplo, Quem és tu?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Escreva um resumo em 50 palavras que resuma [tópico ou palavra-chave].",
|
||||
"Yesterday": "Ontem",
|
||||
"You": "Você",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Você pode personalizar as suas interações com LLMs adicionando memórias através do botão ‘Gerir’ abaixo, tornando-as mais úteis e personalizadas para você.",
|
||||
"You cannot clone a base model": "Não é possível clonar um modelo base",
|
||||
"You have no archived conversations.": "Você não tem bate-papos arquivados.",
|
||||
"You have shared this chat": "Você compartilhou este bate-papo",
|
||||
"You have no archived conversations.": "Você não tem conversas arquivadas.",
|
||||
"You have shared this chat": "Você partilhou esta conversa",
|
||||
"You're a helpful assistant.": "Você é um assistente útil.",
|
||||
"You're now logged in.": "Você está conectado agora.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"You're now logged in.": "Você agora está conectado.",
|
||||
"Your account status is currently pending activation.": "O status da sua conta está atualmente com a ativação pendente.",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Configurações do Carregador do Youtube"
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Панель админ",
|
||||
"Admin Settings": "Настройки админ",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Расширенные Параметры",
|
||||
"Advanced Params": "Расширенные параметры",
|
||||
"all": "всё",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Введите оценку",
|
||||
"Enter Searxng Query URL": "Введите URL-адрес запроса Searxng",
|
||||
"Enter Serper API Key": "Введите ключ API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Введите ключ API Serpstack",
|
||||
"Enter stop sequence": "Введите последовательность остановки",
|
||||
"Enter Top K": "Введите Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Экспортировать отображение документов",
|
||||
"Export Models": "Экспорт моделей",
|
||||
"Export Prompts": "Экспортировать промты",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Не удалось создать ключ API.",
|
||||
"Failed to read clipboard contents": "Не удалось прочитать содержимое буфера обмена",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Импорт сопоставления документов",
|
||||
"Import Models": "Импорт моделей",
|
||||
"Import Prompts": "Импорт подсказок",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Добавьте флаг `--api` при запуске stable-diffusion-webui",
|
||||
"Info": "Информация",
|
||||
"Input commands": "Введите команды",
|
||||
@@ -419,11 +423,12 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Количество результатов поиска",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Поиск {{count}} sites_one",
|
||||
"Searched {{count}} sites_few": "Поиск {{count}} sites_few",
|
||||
"Searched {{count}} sites_many": "Поиск {{count}} sites_many",
|
||||
"Searched {{count}} sites_other": "Поиск {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Поиск в Интернете по запросу '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "URL-адрес запроса Searxng",
|
||||
"See readme.md for instructions": "Смотрите readme.md для инструкций",
|
||||
"See what's new": "Посмотреть, что нового",
|
||||
@@ -435,6 +440,7 @@
|
||||
"Select a pipeline": "Выбор конвейера",
|
||||
"Select a pipeline url": "Выберите URL-адрес конвейера",
|
||||
"Select an Ollama instance": "Выберите экземпляр Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Выберите модель",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Выбранные модели не поддерживают ввод изображений",
|
||||
@@ -443,6 +449,7 @@
|
||||
"Send message": "Отправить сообщение",
|
||||
"September": "Сентябрь",
|
||||
"Serper API Key": "Ключ API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Ключ API Serpstack",
|
||||
"Server connection verified": "Соединение с сервером проверено",
|
||||
"Set as default": "Установить по умолчанию",
|
||||
@@ -507,10 +514,13 @@
|
||||
"To access the available model names for downloading,": "Чтобы получить доступ к доступным для загрузки именам моделей,",
|
||||
"To access the GGUF models available for downloading,": "Чтобы получить доступ к моделям GGUF, доступным для загрузки,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "в чате.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Сегодня",
|
||||
"Toggle settings": "Переключить настройки",
|
||||
"Toggle sidebar": "Переключить боковую панель",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Проблемы с доступом к Ollama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Админ табла",
|
||||
"Admin Settings": "Админ подешавања",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Напредни параметри",
|
||||
"Advanced Params": "Напредни парамови",
|
||||
"all": "сви",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Унесите резултат",
|
||||
"Enter Searxng Query URL": "Унесите УРЛ адресу Сеарxнг упита",
|
||||
"Enter Serper API Key": "Унесите Серпер АПИ кључ",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Унесите Серпстацк АПИ кључ",
|
||||
"Enter stop sequence": "Унесите секвенцу заустављања",
|
||||
"Enter Top K": "Унесите Топ К",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Извези мапирање докумената",
|
||||
"Export Models": "Извези моделе",
|
||||
"Export Prompts": "Извези упите",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Неуспешно стварање API кључа.",
|
||||
"Failed to read clipboard contents": "Неуспешно читање садржаја оставе",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Увези мапирање докумената",
|
||||
"Import Models": "Увези моделе",
|
||||
"Import Prompts": "Увези упите",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Укључи `--api` заставицу при покретању stable-diffusion-webui",
|
||||
"Info": "Инфо",
|
||||
"Input commands": "Унеси наредбе",
|
||||
@@ -419,10 +423,11 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Број резултата претраге",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Претражио {{цоунт}} ситес_оне",
|
||||
"Searched {{count}} sites_few": "Претражио {{цоунт}} ситес_феw",
|
||||
"Searched {{count}} sites_other": "Претражио {{цоунт}} ситес_отхер",
|
||||
"Searching the web for '{{searchQuery}}'": "Претраживање Веба у потрази за \"{{сеарцхQуерy}}\"",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "УРЛ адреса Сеарxнг упита",
|
||||
"See readme.md for instructions": "Погледај readme.md за упутства",
|
||||
"See what's new": "Погледај шта је ново",
|
||||
@@ -434,6 +439,7 @@
|
||||
"Select a pipeline": "Избор цевовода",
|
||||
"Select a pipeline url": "Избор урл адресе цевовода",
|
||||
"Select an Ollama instance": "Изабери Ollama инстанцу",
|
||||
"Select Documents": "",
|
||||
"Select model": "Изабери модел",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Изабрани модели не подржавају уносе слика",
|
||||
@@ -442,6 +448,7 @@
|
||||
"Send message": "Пошаљи поруку",
|
||||
"September": "Септембар",
|
||||
"Serper API Key": "Серпер АПИ кључ",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Серпстацк АПИ кључ",
|
||||
"Server connection verified": "Веза са сервером потврђена",
|
||||
"Set as default": "Подеси као подразумевано",
|
||||
@@ -506,10 +513,13 @@
|
||||
"To access the available model names for downloading,": "Да бисте приступили доступним именима модела за преузимање,",
|
||||
"To access the GGUF models available for downloading,": "Да бисте приступили GGUF моделима доступним за преузимање,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "у унос ћаскања.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Данас",
|
||||
"Toggle settings": "Пребаци подешавања",
|
||||
"Toggle sidebar": "Пребаци бочну траку",
|
||||
"Tools": "",
|
||||
"Top K": "Топ К",
|
||||
"Top P": "Топ П",
|
||||
"Trouble accessing Ollama?": "Проблеми са приступом Ollama-и?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Administrationspanel",
|
||||
"Admin Settings": "Administratörsinställningar",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Avancerade parametrar",
|
||||
"Advanced Params": "Avancerade parametrar",
|
||||
"all": "alla",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Ange poäng",
|
||||
"Enter Searxng Query URL": "Ange Searxng Query URL",
|
||||
"Enter Serper API Key": "Ange Serper API-nyckel",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Ange Serpstack API-nyckel",
|
||||
"Enter stop sequence": "Ange stoppsekvens",
|
||||
"Enter Top K": "Ange Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Exportera dokumentmappning",
|
||||
"Export Models": "Exportera modeller",
|
||||
"Export Prompts": "Exportera prompts",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "Misslyckades med att skapa API-nyckel.",
|
||||
"Failed to read clipboard contents": "Misslyckades med att läsa urklippsinnehåll",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Importera dokumentmappning",
|
||||
"Import Models": "Importera modeller",
|
||||
"Import Prompts": "Importera prompts",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Inkludera `--api`-flagga när du kör stabil-diffusion-webui",
|
||||
"Info": "Information",
|
||||
"Input commands": "Indatakommandon",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Antal sökresultat",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Sökte på {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "Sökte på {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Söka på webben efter '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng Query URL",
|
||||
"See readme.md for instructions": "Se readme.md för instruktioner",
|
||||
"See what's new": "Se vad som är nytt",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "Välj en pipeline",
|
||||
"Select a pipeline url": "Välj en pipeline-URL",
|
||||
"Select an Ollama instance": "Välj en Ollama-instans",
|
||||
"Select Documents": "",
|
||||
"Select model": "Välj en modell",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Valda modeller stöder inte bildinmatningar",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "Skicka meddelande",
|
||||
"September": "september",
|
||||
"Serper API Key": "Serper API-nyckel",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API-nyckel",
|
||||
"Server connection verified": "Serveranslutning verifierad",
|
||||
"Set as default": "Ange som standard",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "För att komma åt de tillgängliga modellnamnen för nedladdning,",
|
||||
"To access the GGUF models available for downloading,": "För att komma åt de GGUF-modeller som finns tillgängliga för nedladdning,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "till chattinmatning.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Idag",
|
||||
"Toggle settings": "Växla inställningar",
|
||||
"Toggle sidebar": "Växla sidofält",
|
||||
"Tools": "",
|
||||
"Top K": "Topp K",
|
||||
"Top P": "Topp P",
|
||||
"Trouble accessing Ollama?": "Problem med att komma åt Ollama?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "",
|
||||
"Admin Settings": "",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "",
|
||||
"Advanced Params": "",
|
||||
"all": "",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "",
|
||||
"Enter Searxng Query URL": "",
|
||||
"Enter Serper API Key": "",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "",
|
||||
"Enter stop sequence": "",
|
||||
"Enter Top K": "",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "",
|
||||
"Export Models": "",
|
||||
"Export Prompts": "",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "",
|
||||
"Failed to read clipboard contents": "",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "",
|
||||
"Import Models": "",
|
||||
"Import Prompts": "",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "",
|
||||
"Info": "",
|
||||
"Input commands": "",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "",
|
||||
"Searched {{count}} sites_other": "",
|
||||
"Searching the web for '{{searchQuery}}'": "",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "",
|
||||
"See readme.md for instructions": "",
|
||||
"See what's new": "",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "",
|
||||
"Select a pipeline url": "",
|
||||
"Select an Ollama instance": "",
|
||||
"Select Documents": "",
|
||||
"Select model": "",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "",
|
||||
"September": "",
|
||||
"Serper API Key": "",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "",
|
||||
"Server connection verified": "",
|
||||
"Set as default": "",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "",
|
||||
"To access the GGUF models available for downloading,": "",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "",
|
||||
"Toggle settings": "",
|
||||
"Toggle sidebar": "",
|
||||
"Tools": "",
|
||||
"Top K": "",
|
||||
"Top P": "",
|
||||
"Trouble accessing Ollama?": "",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "Yönetici Paneli",
|
||||
"Admin Settings": "Yönetici Ayarları",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Gelişmiş Parametreler",
|
||||
"Advanced Params": "Gelişmiş Parametreler",
|
||||
"all": "tümü",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Skoru Girin",
|
||||
"Enter Searxng Query URL": "Searxng Sorgu URL'sini girin",
|
||||
"Enter Serper API Key": "Serper API Anahtarını Girin",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Serpstack API Anahtarını Girin",
|
||||
"Enter stop sequence": "Durdurma dizisini girin",
|
||||
"Enter Top K": "Top K'yı girin",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Belge Eşlemesini Dışa Aktar",
|
||||
"Export Models": "Modelleri Dışa Aktar",
|
||||
"Export Prompts": "Promptları Dışa Aktar",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "API Anahtarı oluşturulamadı.",
|
||||
"Failed to read clipboard contents": "Pano içeriği okunamadı",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Belge Eşlemesini İçe Aktar",
|
||||
"Import Models": "Modelleri İçe Aktar",
|
||||
"Import Prompts": "Promptları İçe Aktar",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui çalıştırılırken `--api` bayrağını dahil edin",
|
||||
"Info": "Bilgi",
|
||||
"Input commands": "Giriş komutları",
|
||||
@@ -419,9 +423,10 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Arama Sonucu Sayısı",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Arandı {{count}} sites_one",
|
||||
"Searched {{count}} sites_other": "Arandı {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Web'de '{{searchQuery}}' aranıyor",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng Sorgu URL'si",
|
||||
"See readme.md for instructions": "Yönergeler için readme.md dosyasına bakın",
|
||||
"See what's new": "Yeniliklere göz atın",
|
||||
@@ -433,6 +438,7 @@
|
||||
"Select a pipeline": "Bir pipeline seç",
|
||||
"Select a pipeline url": "Bir pipeline URL'si seç",
|
||||
"Select an Ollama instance": "Bir Ollama örneği seçin",
|
||||
"Select Documents": "",
|
||||
"Select model": "Model seç",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "Seçilen model(ler) görüntü girişlerini desteklemiyor",
|
||||
@@ -441,6 +447,7 @@
|
||||
"Send message": "Mesaj gönder",
|
||||
"September": "Eylül",
|
||||
"Serper API Key": "Serper API Anahtarı",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API Anahtarı",
|
||||
"Server connection verified": "Sunucu bağlantısı doğrulandı",
|
||||
"Set as default": "Varsayılan olarak ayarla",
|
||||
@@ -505,10 +512,13 @@
|
||||
"To access the available model names for downloading,": "İndirilebilir mevcut model adlarına erişmek için,",
|
||||
"To access the GGUF models available for downloading,": "İndirilebilir mevcut GGUF modellerine erişmek için,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "sohbet girişine.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Bugün",
|
||||
"Toggle settings": "Ayarları Aç/Kapat",
|
||||
"Toggle sidebar": "Kenar Çubuğunu Aç/Kapat",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Ollama'ya erişmede sorun mu yaşıyorsunuz?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "Адмін",
|
||||
"Admin Panel": "Адмін-панель",
|
||||
"Admin Settings": "Налаштування адміністратора",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Розширені параметри",
|
||||
"Advanced Params": "Розширені параметри",
|
||||
"all": "всі",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Введіть бал",
|
||||
"Enter Searxng Query URL": "Введіть URL-адресу запиту Searxng",
|
||||
"Enter Serper API Key": "Введіть ключ API Serper",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "Введіть ключ API Serpstack",
|
||||
"Enter stop sequence": "Введіть символ зупинки",
|
||||
"Enter Top K": "Введіть Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "Експортувати відображення документів",
|
||||
"Export Models": "Експорт моделей",
|
||||
"Export Prompts": "Експортувати промти",
|
||||
"Export Tools": "",
|
||||
"External Models": "Зовнішні моделі",
|
||||
"Failed to create API Key.": "Не вдалося створити API ключ.",
|
||||
"Failed to read clipboard contents": "Не вдалося прочитати вміст буфера обміну",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "Імпортувати відображення документів",
|
||||
"Import Models": "Імпорт моделей",
|
||||
"Import Prompts": "Імпортувати промти",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Включіть прапор `--api` при запуску stable-diffusion-webui",
|
||||
"Info": "Інфо",
|
||||
"Input commands": "Команди вводу",
|
||||
@@ -419,11 +423,12 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "Кількість результатів пошуку",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_one": "Переглянуто {{count}} сайт",
|
||||
"Searched {{count}} sites_few": "Переглянуто {{count}} сайти",
|
||||
"Searched {{count}} sites_many": "Переглянуто {{count}} сайтів",
|
||||
"Searched {{count}} sites_other": "Переглянуто {{count}} сайтів",
|
||||
"Searching the web for '{{searchQuery}}'": "Пошук в Інтернеті за запитом '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "URL-адреса запиту Searxng",
|
||||
"See readme.md for instructions": "Див. readme.md для інструкцій",
|
||||
"See what's new": "Подивіться, що нового",
|
||||
@@ -435,6 +440,7 @@
|
||||
"Select a pipeline": "Виберіть pipeline",
|
||||
"Select a pipeline url": "Виберіть адресу pipeline",
|
||||
"Select an Ollama instance": "Виберіть екземпляр Ollama",
|
||||
"Select Documents": "",
|
||||
"Select model": "Вибрати модель",
|
||||
"Select only one model to call": "Виберіть лише одну модель для виклику",
|
||||
"Selected model(s) do not support image inputs": "Вибрані модель(і) не підтримують вхідні зображення",
|
||||
@@ -443,6 +449,7 @@
|
||||
"Send message": "Надіслати повідомлення",
|
||||
"September": "Вересень",
|
||||
"Serper API Key": "Ключ API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Ключ API Serpstack",
|
||||
"Server connection verified": "З'єднання з сервером підтверджено",
|
||||
"Set as default": "Встановити за замовчуванням",
|
||||
@@ -507,10 +514,13 @@
|
||||
"To access the available model names for downloading,": "Щоб отримати доступ до назв доступних для завантаження моделей,",
|
||||
"To access the GGUF models available for downloading,": "Щоб отримати доступ до моделей GGUF, які можна завантажити,,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Щоб отримати доступ до веб-інтерфейсу, зверніться до адміністратора. Адміністратори можуть керувати статусами користувачів з Панелі адміністратора.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "в чаті.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Сьогодні",
|
||||
"Toggle settings": "Переключити налаштування",
|
||||
"Toggle sidebar": "Переключити бокову панель",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Проблеми з доступом до Ollama?",
|
||||
|
||||
@@ -12,9 +12,9 @@
|
||||
"a user": "người sử dụng",
|
||||
"About": "Giới thiệu",
|
||||
"Account": "Tài khoản",
|
||||
"Account Activation Pending": "",
|
||||
"Account Activation Pending": "Tài khoản đang chờ kích hoạt",
|
||||
"Accurate information": "Thông tin chính xác",
|
||||
"Active Users": "",
|
||||
"Active Users": "Người dùng đang hoạt động",
|
||||
"Add": "Thêm",
|
||||
"Add a model id": "Thêm model id",
|
||||
"Add a short description about what this model does": "Thêm mô tả ngắn về những khả năng của model",
|
||||
@@ -30,9 +30,10 @@
|
||||
"Add User": "Thêm người dùng",
|
||||
"Adjusting these settings will apply changes universally to all users.": "Các thay đổi cài đặt này sẽ áp dụng cho tất cả người sử dụng.",
|
||||
"admin": "quản trị viên",
|
||||
"Admin": "",
|
||||
"Admin": "Quản trị",
|
||||
"Admin Panel": "Trang Quản trị",
|
||||
"Admin Settings": "Cài đặt hệ thống",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "Các tham số Nâng cao",
|
||||
"Advanced Params": "Các tham số Nâng cao",
|
||||
"all": "tất cả",
|
||||
@@ -72,8 +73,8 @@
|
||||
"Being lazy": "Lười biếng",
|
||||
"Brave Search API Key": "Khóa API tìm kiếm dũng cảm",
|
||||
"Bypass SSL verification for Websites": "Bỏ qua xác thực SSL cho các trang web",
|
||||
"Call": "",
|
||||
"Call feature is not supported when using Web STT engine": "",
|
||||
"Call": "Gọi",
|
||||
"Call feature is not supported when using Web STT engine": "Tính năng gọi điện không được hỗ trợ khi sử dụng công cụ Web STT",
|
||||
"Camera": "",
|
||||
"Cancel": "Hủy bỏ",
|
||||
"Capabilities": "Năng lực",
|
||||
@@ -92,12 +93,12 @@
|
||||
"Chunk Params": "Tham số khối (chunk)",
|
||||
"Chunk Size": "Kích thước khối (size)",
|
||||
"Citation": "Trích dẫn",
|
||||
"Clear memory": "",
|
||||
"Clear memory": "Xóa bộ nhớ",
|
||||
"Click here for help.": "Bấm vào đây để được trợ giúp.",
|
||||
"Click here to": "Nhấn vào đây để",
|
||||
"Click here to select": "Bấm vào đây để chọn",
|
||||
"Click here to select a csv file.": "Nhấn vào đây để chọn tệp csv",
|
||||
"Click here to select a py file.": "",
|
||||
"Click here to select a py file.": "Nhấn vào đây để chọn tệp py",
|
||||
"Click here to select documents.": "Bấm vào đây để chọn tài liệu.",
|
||||
"click here.": "bấm vào đây.",
|
||||
"Click on the user role button to change a user's role.": "Bấm vào nút trong cột VAI TRÒ để thay đổi quyền của người sử dụng.",
|
||||
@@ -111,7 +112,7 @@
|
||||
"Concurrent Requests": "Các truy vấn đồng thời",
|
||||
"Confirm Password": "Xác nhận Mật khẩu",
|
||||
"Connections": "Kết nối",
|
||||
"Contact Admin for WebUI Access": "",
|
||||
"Contact Admin for WebUI Access": "Liên hệ với Quản trị viên để được cấp quyền truy cập",
|
||||
"Content": "Nội dung",
|
||||
"Context Length": "Độ dài ngữ cảnh (Context Length)",
|
||||
"Continue Response": "Tiếp tục trả lời",
|
||||
@@ -158,11 +159,11 @@
|
||||
"Discover a prompt": "Khám phá thêm prompt mới",
|
||||
"Discover, download, and explore custom prompts": "Tìm kiếm, tải về và khám phá thêm các prompt tùy chỉnh",
|
||||
"Discover, download, and explore model presets": "Tìm kiếm, tải về và khám phá thêm các thiết lập mô hình sẵn",
|
||||
"Dismissible": "",
|
||||
"Dismissible": "Có thể loại bỏ",
|
||||
"Display the username instead of You in the Chat": "Hiển thị tên người sử dụng thay vì 'Bạn' trong nội dung chat",
|
||||
"Document": "Tài liệu",
|
||||
"Document Settings": "Cấu hình kho tài liệu",
|
||||
"Documentation": "",
|
||||
"Documentation": "Tài liệu",
|
||||
"Documents": "Tài liệu",
|
||||
"does not make any external connections, and your data stays securely on your locally hosted server.": "không thực hiện bất kỳ kết nối ngoài nào, và dữ liệu của bạn vẫn được lưu trữ an toàn trên máy chủ lưu trữ cục bộ của bạn.",
|
||||
"Don't Allow": "Không Cho phép",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "Nhập Score",
|
||||
"Enter Searxng Query URL": "Nhập Query URL cho Searxng",
|
||||
"Enter Serper API Key": "Nhập Serper API Key",
|
||||
"Enter Serply API Key": "Nhập Serply API Key",
|
||||
"Enter Serpstack API Key": "Nhập Serpstack API Key",
|
||||
"Enter stop sequence": "Nhập stop sequence",
|
||||
"Enter Top K": "Nhập Top K",
|
||||
@@ -214,15 +216,16 @@
|
||||
"Experimental": "Thử nghiệm",
|
||||
"Export": "Xuất khẩu",
|
||||
"Export All Chats (All Users)": "Tải về tất cả nội dung chat (tất cả mọi người)",
|
||||
"Export chat (.json)": "",
|
||||
"Export chat (.json)": "Tải chat (.json)",
|
||||
"Export Chats": "Tải nội dung chat về máy",
|
||||
"Export Documents Mapping": "Tải cấu trúc tài liệu về máy",
|
||||
"Export Models": "Tải Models về máy",
|
||||
"Export Prompts": "Tải các prompt về máy",
|
||||
"External Models": "",
|
||||
"Export Tools": "",
|
||||
"External Models": "Các model ngoài",
|
||||
"Failed to create API Key.": "Lỗi khởi tạo API Key",
|
||||
"Failed to read clipboard contents": "Không thể đọc nội dung clipboard",
|
||||
"Failed to update settings": "",
|
||||
"Failed to update settings": "Lỗi khi cập nhật các cài đặt",
|
||||
"February": "Tháng 2",
|
||||
"Feel free to add specific details": "Mô tả chi tiết về chất lượng của câu hỏi và phương án trả lời",
|
||||
"File Mode": "Chế độ Tệp văn bản",
|
||||
@@ -235,7 +238,7 @@
|
||||
"Frequency Penalty": "Hình phạt tần số",
|
||||
"General": "Cài đặt chung",
|
||||
"General Settings": "Cấu hình chung",
|
||||
"Generate Image": "",
|
||||
"Generate Image": "Sinh ảnh",
|
||||
"Generating search query": "Tạo truy vấn tìm kiếm",
|
||||
"Generation Info": "Thông tin chung",
|
||||
"Good Response": "Trả lời tốt",
|
||||
@@ -256,11 +259,12 @@
|
||||
"Import Documents Mapping": "Nạp cấu trúc tài liệu",
|
||||
"Import Models": "Nạp model",
|
||||
"Import Prompts": "Nạp các prompt lên hệ thống",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "Bao gồm flag `--api` khi chạy stable-diffusion-webui",
|
||||
"Info": "Thông tin",
|
||||
"Input commands": "Nhập các câu lệnh",
|
||||
"Install from Github URL": "Cài đặt từ Github URL",
|
||||
"Instant Auto-Send After Voice Transcription": "",
|
||||
"Instant Auto-Send After Voice Transcription": "Tự động gửi ngay lập tức sau khi phiên dịch giọng nói",
|
||||
"Interface": "Giao diện",
|
||||
"Invalid Tag": "Tag không hợp lệ",
|
||||
"January": "Tháng 1",
|
||||
@@ -273,17 +277,17 @@
|
||||
"JWT Token": "Token JWT",
|
||||
"Keep Alive": "Giữ kết nối",
|
||||
"Keyboard shortcuts": "Phím tắt",
|
||||
"Knowledge": "",
|
||||
"Knowledge": "Kiến thức",
|
||||
"Language": "Ngôn ngữ",
|
||||
"Last Active": "Truy cập gần nhất",
|
||||
"Light": "Sáng",
|
||||
"Listening...": "",
|
||||
"Listening...": "Đang nghe...",
|
||||
"LLMs can make mistakes. Verify important information.": "Hệ thống có thể tạo ra nội dung không chính xác hoặc sai. Hãy kiểm chứng kỹ lưỡng thông tin trước khi tiếp nhận và sử dụng.",
|
||||
"Local Models": "",
|
||||
"LTR": "LTR",
|
||||
"Made by OpenWebUI Community": "Được tạo bởi Cộng đồng OpenWebUI",
|
||||
"Make sure to enclose them with": "Hãy chắc chắn bao quanh chúng bằng",
|
||||
"Manage": "",
|
||||
"Manage": "Quản lý",
|
||||
"Manage Models": "Quản lý mô hình",
|
||||
"Manage Ollama Models": "Quản lý mô hình với Ollama",
|
||||
"Manage Pipelines": "Quản lý Pipelines",
|
||||
@@ -319,7 +323,7 @@
|
||||
"Name your model": "Tên model",
|
||||
"New Chat": "Tạo chat mới",
|
||||
"New Password": "Mật khẩu mới",
|
||||
"No documents found": "",
|
||||
"No documents found": "Không tìm thấy tài liệu nào",
|
||||
"No results found": "Không tìm thấy kết quả",
|
||||
"No search query generated": "Không có truy vấn tìm kiếm nào được tạo ra",
|
||||
"No source available": "Không có nguồn",
|
||||
@@ -336,7 +340,7 @@
|
||||
"Ollama": "Ollama",
|
||||
"Ollama API": "Ollama API",
|
||||
"Ollama API disabled": "API Ollama bị vô hiệu hóa",
|
||||
"Ollama API is disabled": "",
|
||||
"Ollama API is disabled": "Ollama API đang bị vô hiệu hóa",
|
||||
"Ollama Version": "Phiên bản Ollama",
|
||||
"On": "Bật",
|
||||
"Only": "Only",
|
||||
@@ -359,12 +363,12 @@
|
||||
"PDF document (.pdf)": "Tập tin PDF (.pdf)",
|
||||
"PDF Extract Images (OCR)": "Trích xuất ảnh từ PDF (OCR)",
|
||||
"pending": "đang chờ phê duyệt",
|
||||
"Permission denied when accessing media devices": "",
|
||||
"Permission denied when accessing microphone": "",
|
||||
"Permission denied when accessing media devices": "Quyền truy cập các thiết bị đa phương tiện bị từ chối",
|
||||
"Permission denied when accessing microphone": "Quyền truy cập micrô bị từ chối",
|
||||
"Permission denied when accessing microphone: {{error}}": "Quyền truy cập micrô bị từ chối: {{error}}",
|
||||
"Personalization": "Cá nhân hóa",
|
||||
"Pipelines": "Đường ống",
|
||||
"Pipelines Valves": "Van đường ống",
|
||||
"Pipelines": "",
|
||||
"Pipelines Valves": "",
|
||||
"Plain text (.txt)": "Văn bản thô (.txt)",
|
||||
"Playground": "Thử nghiệm (Playground)",
|
||||
"Positive attitude": "Thái độ tích cực",
|
||||
@@ -383,7 +387,7 @@
|
||||
"Read Aloud": "Đọc ra loa",
|
||||
"Record voice": "Ghi âm",
|
||||
"Redirecting you to OpenWebUI Community": "Đang chuyển hướng bạn đến Cộng đồng OpenWebUI",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "",
|
||||
"Refer to yourself as \"User\" (e.g., \"User is learning Spanish\")": "Hãy coi bản thân mình như \"Người dùng\" (ví dụ: \"Người dùng đang học Tiếng Tây Ban Nha\")",
|
||||
"Refused when it shouldn't have": "Từ chối trả lời mà nhẽ không nên làm vậy",
|
||||
"Regenerate": "Tạo sinh lại câu trả lời",
|
||||
"Release Notes": "Mô tả những cập nhật mới",
|
||||
@@ -402,7 +406,7 @@
|
||||
"Rosé Pine": "Rosé Pine",
|
||||
"Rosé Pine Dawn": "Rosé Pine Dawn",
|
||||
"RTL": "RTL",
|
||||
"Running": "",
|
||||
"Running": "Đang chạy",
|
||||
"Save": "Lưu",
|
||||
"Save & Create": "Lưu & Tạo",
|
||||
"Save & Update": "Lưu & Cập nhật",
|
||||
@@ -416,30 +420,33 @@
|
||||
"Search Documents": "Tìm tài liệu",
|
||||
"Search Models": "Tìm model",
|
||||
"Search Prompts": "Tìm prompt",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Query Generation Prompt": "Prompt tạo câu truy vấn, tìm kiếm",
|
||||
"Search Query Generation Prompt Length Threshold": "Ngưỡng độ dài prompt tạo câu truy vấn, tìm kiếm",
|
||||
"Search Result Count": "Số kết quả tìm kiếm",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_other": "Đã tìm {{count}} sites_other",
|
||||
"Searching the web for '{{searchQuery}}'": "Tìm kiếm web cho '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "Đang tìm \"{{searchQuery}}\"",
|
||||
"Searxng Query URL": "URL truy vấn Searxng",
|
||||
"See readme.md for instructions": "Xem readme.md để biết hướng dẫn",
|
||||
"See what's new": "Xem những cập nhật mới",
|
||||
"Seed": "Seed",
|
||||
"Select a base model": "Chọn một base model",
|
||||
"Select a engine": "",
|
||||
"Select a engine": "Chọn dịch vụ",
|
||||
"Select a mode": "Chọn một chế độ",
|
||||
"Select a model": "Chọn mô hình",
|
||||
"Select a pipeline": "Chọn một quy trình",
|
||||
"Select a pipeline url": "Chọn url quy trình",
|
||||
"Select an Ollama instance": "Chọn một thực thể Ollama",
|
||||
"Select Documents": "Chọn tài liệu",
|
||||
"Select model": "Chọn model",
|
||||
"Select only one model to call": "",
|
||||
"Select only one model to call": "Chọn model để gọi",
|
||||
"Selected model(s) do not support image inputs": "Model được lựa chọn không hỗ trợ đầu vào là hình ảnh",
|
||||
"Send": "Gửi",
|
||||
"Send a Message": "Gửi yêu cầu",
|
||||
"Send message": "Gửi yêu cầu",
|
||||
"September": "Tháng 9",
|
||||
"Serper API Key": "Khóa API Serper",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Khóa API Serpstack",
|
||||
"Server connection verified": "Kết nối máy chủ đã được xác minh",
|
||||
"Set as default": "Đặt làm mặc định",
|
||||
@@ -452,13 +459,13 @@
|
||||
"Set Voice": "Đặt Giọng nói",
|
||||
"Settings": "Cài đặt",
|
||||
"Settings saved successfully!": "Cài đặt đã được lưu thành công!",
|
||||
"Settings updated successfully": "",
|
||||
"Settings updated successfully": "Các cài đặt đã được cập nhật thành công",
|
||||
"Share": "Chia sẻ",
|
||||
"Share Chat": "Chia sẻ Chat",
|
||||
"Share to OpenWebUI Community": "Chia sẻ đến Cộng đồng OpenWebUI",
|
||||
"short-summary": "tóm tắt ngắn",
|
||||
"Show": "Hiển thị",
|
||||
"Show Admin Details in Account Pending Overlay": "",
|
||||
"Show Admin Details in Account Pending Overlay": "Hiển thị thông tin của Quản trị viên trên màn hình hiển thị Tài khoản đang chờ xử lý",
|
||||
"Show shortcuts": "Hiển thị phím tắt",
|
||||
"Showcased creativity": "Thể hiện sự sáng tạo",
|
||||
"sidebar": "thanh bên",
|
||||
@@ -489,9 +496,9 @@
|
||||
"Thanks for your feedback!": "Cám ơn bạn đã gửi phản hồi!",
|
||||
"The score should be a value between 0.0 (0%) and 1.0 (100%).": "Điểm (score) phải có giá trị từ 0,0 (0%) đến 1,0 (100%).",
|
||||
"Theme": "Chủ đề",
|
||||
"Thinking...": "",
|
||||
"Thinking...": "Đang suy luận...",
|
||||
"This ensures that your valuable conversations are securely saved to your backend database. Thank you!": "Điều này đảm bảo rằng các nội dung chat có giá trị của bạn được lưu an toàn vào cơ sở dữ liệu backend của bạn. Cảm ơn bạn!",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "",
|
||||
"This is an experimental feature, it may not function as expected and is subject to change at any time.": "Đây là tính năng thử nghiệm, có thể không hoạt động như mong đợi và có thể thay đổi bất kỳ lúc nào.",
|
||||
"This setting does not sync across browsers or devices.": "Cài đặt này không đồng bộ hóa trên các trình duyệt hoặc thiết bị.",
|
||||
"Thorough explanation": "Giải thích kỹ lưỡng",
|
||||
"Tip: Update multiple variable slots consecutively by pressing the tab key in the chat input after each replacement.": "Mẹo: Cập nhật nhiều khe biến liên tiếp bằng cách nhấn phím tab trong đầu vào trò chuyện sau mỗi việc thay thế.",
|
||||
@@ -503,11 +510,14 @@
|
||||
"to": " - ",
|
||||
"To access the available model names for downloading,": "Để truy cập các tên mô hình có sẵn để tải xuống,",
|
||||
"To access the GGUF models available for downloading,": "Để truy cập các mô hình GGUF có sẵn để tải xuống,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "Để truy cập vui lòng liên hệ với quản trị viên.",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "Để thêm tài liệu, trước tiên hãy upload chúng lên khu vực \"Tài liệu\".",
|
||||
"to chat input.": "đến đầu vào trò chuyện.",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "Hôm nay",
|
||||
"Toggle settings": "Bật/tắt cài đặt",
|
||||
"Toggle sidebar": "Bật/tắt thanh bên",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "Gặp vấn đề khi truy cập Ollama?",
|
||||
@@ -553,19 +563,19 @@
|
||||
"What’s New in": "Thông tin mới về",
|
||||
"When history is turned off, new chats on this browser won't appear in your history on any of your devices.": "Khi chế độ lịch sử chat đã tắt, các nội dung chat mới trên trình duyệt này sẽ không xuất hiện trên bất kỳ thiết bị nào của bạn.",
|
||||
"Whisper (Local)": "",
|
||||
"Widescreen Mode": "",
|
||||
"Widescreen Mode": "Chế độ màn hình rộng",
|
||||
"Workspace": "Workspace",
|
||||
"Write a prompt suggestion (e.g. Who are you?)": "Hãy viết một prompt (vd: Bạn là ai?)",
|
||||
"Write a summary in 50 words that summarizes [topic or keyword].": "Viết một tóm tắt trong vòng 50 từ cho [chủ đề hoặc từ khóa].",
|
||||
"Yesterday": "Hôm qua",
|
||||
"You": "Bạn",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "",
|
||||
"You can personalize your interactions with LLMs by adding memories through the 'Manage' button below, making them more helpful and tailored to you.": "Bạn có thể cá nhân hóa các tương tác của mình với LLM bằng cách thêm bộ nhớ thông qua nút 'Quản lý' bên dưới, làm cho chúng hữu ích hơn và phù hợp với bạn hơn.",
|
||||
"You cannot clone a base model": "Bạn không thể nhân bản base model",
|
||||
"You have no archived conversations.": "Bạn chưa lưu trữ một nội dung chat nào",
|
||||
"You have shared this chat": "Bạn vừa chia sẻ chat này",
|
||||
"You're a helpful assistant.": "Bạn là một trợ lý hữu ích.",
|
||||
"You're now logged in.": "Bạn đã đăng nhập.",
|
||||
"Your account status is currently pending activation.": "",
|
||||
"Your account status is currently pending activation.": "Tài khoản của bạn hiện đang ở trạng thái chờ kích hoạt.",
|
||||
"Youtube": "Youtube",
|
||||
"Youtube Loader Settings": "Cài đặt Youtube Loader"
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "管理员联系方式",
|
||||
"Admin Panel": "管理员面板",
|
||||
"Admin Settings": "管理员设置",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "高级参数",
|
||||
"Advanced Params": "高级参数",
|
||||
"all": "所有",
|
||||
@@ -74,7 +75,7 @@
|
||||
"Bypass SSL verification for Websites": "绕过网站的 SSL 验证",
|
||||
"Call": "呼叫",
|
||||
"Call feature is not supported when using Web STT engine": "使用 Web 语音转文字引擎时不支持呼叫功能。",
|
||||
"Camera": "",
|
||||
"Camera": "摄像头",
|
||||
"Cancel": "取消",
|
||||
"Capabilities": "能力",
|
||||
"Change Password": "更改密码",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "输入评分",
|
||||
"Enter Searxng Query URL": "输入 Searxng 查询地址",
|
||||
"Enter Serper API Key": "输入 Serper API 密钥",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "输入 Serpstack API 密钥",
|
||||
"Enter stop sequence": "输入停止序列 (Stop Sequence)",
|
||||
"Enter Top K": "输入 Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "导出文档映射",
|
||||
"Export Models": "导出模型",
|
||||
"Export Prompts": "导出提示词",
|
||||
"Export Tools": "导出工具",
|
||||
"External Models": "外部模型",
|
||||
"Failed to create API Key.": "无法创建 API 密钥。",
|
||||
"Failed to read clipboard contents": "无法读取剪贴板内容",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "导入文档映射",
|
||||
"Import Models": "导入模型",
|
||||
"Import Prompts": "导入提示词",
|
||||
"Import Tools": "导入工具",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "运行 stable-diffusion-webui 时包含 `--api` 标志",
|
||||
"Info": "信息",
|
||||
"Input commands": "输入命令",
|
||||
@@ -273,7 +277,7 @@
|
||||
"JWT Token": "JWT 令牌",
|
||||
"Keep Alive": "保持活动",
|
||||
"Keyboard shortcuts": "键盘快捷键",
|
||||
"Knowledge": "",
|
||||
"Knowledge": "知识库",
|
||||
"Language": "语言",
|
||||
"Last Active": "最后在线时间",
|
||||
"Light": "浅色",
|
||||
@@ -319,7 +323,7 @@
|
||||
"Name your model": "为您的模型命名",
|
||||
"New Chat": "新对话",
|
||||
"New Password": "新密码",
|
||||
"No documents found": "",
|
||||
"No documents found": "未找到文档",
|
||||
"No results found": "未找到结果",
|
||||
"No search query generated": "未生成搜索查询",
|
||||
"No source available": "没有可用来源",
|
||||
@@ -416,11 +420,12 @@
|
||||
"Search Documents": "搜索文档",
|
||||
"Search Models": "搜索模型",
|
||||
"Search Prompts": "搜索提示词",
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Query Generation Prompt": "搜索查询生成提示",
|
||||
"Search Query Generation Prompt Length Threshold": "搜索查询生成提示长度阈值",
|
||||
"Search Result Count": "搜索结果数量",
|
||||
"Search Tools": "搜索工具",
|
||||
"Searched {{count}} sites_other": "检索到 {{count}} 个网站",
|
||||
"Searching the web for '{{searchQuery}}'": "在网络中搜索 '{{searchQuery}}' ",
|
||||
"Searching \"{{searchQuery}}\"": "搜索 \"{{searchQuery}}\" 中",
|
||||
"Searxng Query URL": "Searxng 查询 URL",
|
||||
"See readme.md for instructions": "查看 readme.md 以获取说明",
|
||||
"See what's new": "查阅最新更新内容",
|
||||
@@ -432,6 +437,7 @@
|
||||
"Select a pipeline": "选择一个管道",
|
||||
"Select a pipeline url": "选择一个管道 URL",
|
||||
"Select an Ollama instance": "选择一个 Ollama 实例",
|
||||
"Select Documents": "选择文档",
|
||||
"Select model": "选择模型",
|
||||
"Select only one model to call": "请仅选择一个模型来呼叫",
|
||||
"Selected model(s) do not support image inputs": "已选择的模型不支持发送图像",
|
||||
@@ -440,6 +446,7 @@
|
||||
"Send message": "发送消息",
|
||||
"September": "九月",
|
||||
"Serper API Key": "Serper API 密钥",
|
||||
"Serply API Key": "Serply API 密钥",
|
||||
"Serpstack API Key": "Serpstack API 密钥",
|
||||
"Server connection verified": "已验证服务器连接",
|
||||
"Set as default": "设为默认",
|
||||
@@ -504,10 +511,13 @@
|
||||
"To access the available model names for downloading,": "要访问可下载的模型名称,",
|
||||
"To access the GGUF models available for downloading,": "要访问可下载的 GGUF 模型,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "请联系管理员以访问。管理员可以在后台管理面板中管理用户状态。",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "要在此处添加文档,请先将它们上传到工作空间中的“文档”内。",
|
||||
"to chat input.": "到对话输入。",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "今天",
|
||||
"Toggle settings": "切换设置",
|
||||
"Toggle sidebar": "切换侧边栏",
|
||||
"Tools": "工具",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "访问 Ollama 时遇到问题?",
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
"Admin": "",
|
||||
"Admin Panel": "管理員控制台",
|
||||
"Admin Settings": "管理設定",
|
||||
"Admins have access to all tools at all times; users need tools assigned per model in the workspace.": "",
|
||||
"Advanced Parameters": "進階參數",
|
||||
"Advanced Params": "進階參數",
|
||||
"all": "所有",
|
||||
@@ -201,6 +202,7 @@
|
||||
"Enter Score": "輸入分數",
|
||||
"Enter Searxng Query URL": "輸入 Searxng 查詢 URL",
|
||||
"Enter Serper API Key": "輸入 Serper API Key",
|
||||
"Enter Serply API Key": "",
|
||||
"Enter Serpstack API Key": "輸入 Serpstack API Key",
|
||||
"Enter stop sequence": "輸入停止序列",
|
||||
"Enter Top K": "輸入 Top K",
|
||||
@@ -219,6 +221,7 @@
|
||||
"Export Documents Mapping": "匯出文件映射",
|
||||
"Export Models": "匯出模型",
|
||||
"Export Prompts": "匯出提示詞",
|
||||
"Export Tools": "",
|
||||
"External Models": "",
|
||||
"Failed to create API Key.": "無法創建 API 金鑰。",
|
||||
"Failed to read clipboard contents": "無法讀取剪貼簿內容",
|
||||
@@ -256,6 +259,7 @@
|
||||
"Import Documents Mapping": "匯入文件映射",
|
||||
"Import Models": "匯入模型",
|
||||
"Import Prompts": "匯入提示詞",
|
||||
"Import Tools": "",
|
||||
"Include `--api` flag when running stable-diffusion-webui": "在運行 stable-diffusion-webui 時加上 `--api` 標誌",
|
||||
"Info": "資訊",
|
||||
"Input commands": "輸入命令",
|
||||
@@ -419,8 +423,9 @@
|
||||
"Search Query Generation Prompt": "",
|
||||
"Search Query Generation Prompt Length Threshold": "",
|
||||
"Search Result Count": "搜尋結果數量",
|
||||
"Search Tools": "",
|
||||
"Searched {{count}} sites_other": "掃描 {{count}} 個網站_其他",
|
||||
"Searching the web for '{{searchQuery}}'": "搜尋網站 '{{searchQuery}}'",
|
||||
"Searching \"{{searchQuery}}\"": "",
|
||||
"Searxng Query URL": "Searxng 查詢 URL",
|
||||
"See readme.md for instructions": "查看 readme.md 獲取指南",
|
||||
"See what's new": "查看最新內容",
|
||||
@@ -432,6 +437,7 @@
|
||||
"Select a pipeline": "選擇管道",
|
||||
"Select a pipeline url": "選擇管道 URL",
|
||||
"Select an Ollama instance": "選擇 Ollama 實例",
|
||||
"Select Documents": "",
|
||||
"Select model": "選擇模型",
|
||||
"Select only one model to call": "",
|
||||
"Selected model(s) do not support image inputs": "已選擇模型不支持圖像輸入",
|
||||
@@ -440,6 +446,7 @@
|
||||
"Send message": "傳送訊息",
|
||||
"September": "九月",
|
||||
"Serper API Key": "Serper API Key",
|
||||
"Serply API Key": "",
|
||||
"Serpstack API Key": "Serpstack API Key",
|
||||
"Server connection verified": "已驗證伺服器連線",
|
||||
"Set as default": "設為預設",
|
||||
@@ -504,10 +511,13 @@
|
||||
"To access the available model names for downloading,": "若想查看可供下載的模型名稱,",
|
||||
"To access the GGUF models available for downloading,": "若想查看可供下載的 GGUF 模型名稱,",
|
||||
"To access the WebUI, please reach out to the administrator. Admins can manage user statuses from the Admin Panel.": "",
|
||||
"To add documents here, upload them to the \"Documents\" workspace first.": "",
|
||||
"to chat input.": "到聊天輸入框來啟動此命令。",
|
||||
"To select toolkits here, add them to the \"Tools\" workspace first.": "",
|
||||
"Today": "今天",
|
||||
"Toggle settings": "切換設定",
|
||||
"Toggle sidebar": "切換側邊欄",
|
||||
"Tools": "",
|
||||
"Top K": "Top K",
|
||||
"Top P": "Top P",
|
||||
"Trouble accessing Ollama?": "存取 Ollama 時遇到問題?",
|
||||
|
||||
+10
-16
@@ -23,24 +23,11 @@ export const chatId = writable('');
|
||||
|
||||
export const chats = writable([]);
|
||||
export const tags = writable([]);
|
||||
export const models: Writable<Model[]> = writable([]);
|
||||
|
||||
export const modelfiles = writable([]);
|
||||
export const models: Writable<Model[]> = writable([]);
|
||||
export const prompts: Writable<Prompt[]> = writable([]);
|
||||
export const documents = writable([
|
||||
{
|
||||
collection_name: 'collection_name',
|
||||
filename: 'filename',
|
||||
name: 'name',
|
||||
title: 'title'
|
||||
},
|
||||
{
|
||||
collection_name: 'collection_name1',
|
||||
filename: 'filename1',
|
||||
name: 'name1',
|
||||
title: 'title1'
|
||||
}
|
||||
]);
|
||||
export const documents: Writable<Document[]> = writable([]);
|
||||
export const tools = writable([]);
|
||||
|
||||
export const banners: Writable<Banner[]> = writable([]);
|
||||
|
||||
@@ -135,6 +122,13 @@ type Prompt = {
|
||||
timestamp: number;
|
||||
};
|
||||
|
||||
type Document = {
|
||||
collection_name: string;
|
||||
filename: string;
|
||||
name: string;
|
||||
title: string;
|
||||
};
|
||||
|
||||
type Config = {
|
||||
status: boolean;
|
||||
name: string;
|
||||
|
||||
@@ -8,12 +8,15 @@
|
||||
import { goto } from '$app/navigation';
|
||||
|
||||
import { getModels as _getModels } from '$lib/apis';
|
||||
import { getOllamaVersion } from '$lib/apis/ollama';
|
||||
import { getPrompts } from '$lib/apis/prompts';
|
||||
|
||||
import { getDocs } from '$lib/apis/documents';
|
||||
import { getAllChatTags } from '$lib/apis/chats';
|
||||
|
||||
import { getPrompts } from '$lib/apis/prompts';
|
||||
import { getDocs } from '$lib/apis/documents';
|
||||
import { getTools } from '$lib/apis/tools';
|
||||
|
||||
import { getBanners } from '$lib/apis/configs';
|
||||
import { getUserSettings } from '$lib/apis/users';
|
||||
|
||||
import {
|
||||
user,
|
||||
showSettings,
|
||||
@@ -25,33 +28,21 @@
|
||||
banners,
|
||||
showChangelog,
|
||||
config,
|
||||
showCallOverlay
|
||||
showCallOverlay,
|
||||
tools
|
||||
} from '$lib/stores';
|
||||
import { REQUIRED_OLLAMA_VERSION, WEBUI_API_BASE_URL } from '$lib/constants';
|
||||
import { compareVersion } from '$lib/utils';
|
||||
|
||||
import SettingsModal from '$lib/components/chat/SettingsModal.svelte';
|
||||
import Sidebar from '$lib/components/layout/Sidebar.svelte';
|
||||
import ShortcutsModal from '$lib/components/chat/ShortcutsModal.svelte';
|
||||
import ChangelogModal from '$lib/components/ChangelogModal.svelte';
|
||||
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
||||
import { getBanners } from '$lib/apis/configs';
|
||||
import { getUserSettings } from '$lib/apis/users';
|
||||
import Help from '$lib/components/layout/Help.svelte';
|
||||
import AccountPending from '$lib/components/layout/Overlay/AccountPending.svelte';
|
||||
import { error } from '@sveltejs/kit';
|
||||
import CallOverlay from '$lib/components/chat/MessageInput/CallOverlay.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
let ollamaVersion = '';
|
||||
let loaded = false;
|
||||
let showShortcutsButtonElement: HTMLButtonElement;
|
||||
let DB = null;
|
||||
let localDBChats = [];
|
||||
|
||||
let showShortcuts = false;
|
||||
|
||||
const getModels = async () => {
|
||||
return _getModels(localStorage.token);
|
||||
};
|
||||
@@ -99,6 +90,9 @@
|
||||
(async () => {
|
||||
documents.set(await getDocs(localStorage.token));
|
||||
})(),
|
||||
(async () => {
|
||||
tools.set(await getTools(localStorage.token));
|
||||
})(),
|
||||
(async () => {
|
||||
banners.set(await getBanners(localStorage.token));
|
||||
})(),
|
||||
|
||||
@@ -14,7 +14,11 @@
|
||||
</title>
|
||||
</svelte:head>
|
||||
|
||||
<div class=" flex flex-col w-full min-h-screen max-h-screen">
|
||||
<div
|
||||
class=" flex flex-col w-full min-h-screen max-h-screen {$showSidebar
|
||||
? 'md:max-w-[calc(100%-260px)]'
|
||||
: ''}"
|
||||
>
|
||||
<div class=" px-4 pt-3 mt-0.5 mb-1">
|
||||
<div class=" flex items-center gap-1">
|
||||
<div class="{$showSidebar ? 'md:hidden' : ''} mr-1 self-start flex flex-none items-center">
|
||||
@@ -61,6 +65,15 @@
|
||||
{$i18n.t('Documents')}
|
||||
</a>
|
||||
|
||||
<a
|
||||
class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/tools')
|
||||
? 'bg-gray-50 dark:bg-gray-850'
|
||||
: ''} transition"
|
||||
href="/workspace/tools"
|
||||
>
|
||||
{$i18n.t('Tools')}
|
||||
</a>
|
||||
|
||||
<a
|
||||
class="min-w-fit rounded-lg p-1.5 px-3 {$page.url.pathname.includes('/workspace/playground')
|
||||
? 'bg-gray-50 dark:bg-gray-850'
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { toast } from 'svelte-sonner';
|
||||
import { goto } from '$app/navigation';
|
||||
import { settings, user, config, models } from '$lib/stores';
|
||||
import { settings, user, config, models, tools } from '$lib/stores';
|
||||
|
||||
import { onMount, tick, getContext } from 'svelte';
|
||||
import { addNewModel, getModelById, getModelInfos } from '$lib/apis/models';
|
||||
@@ -12,6 +12,8 @@
|
||||
import Checkbox from '$lib/components/common/Checkbox.svelte';
|
||||
import Tags from '$lib/components/common/Tags.svelte';
|
||||
import Knowledge from '$lib/components/workspace/Models/Knowledge.svelte';
|
||||
import ToolsSelector from '$lib/components/workspace/Models/ToolsSelector.svelte';
|
||||
import { stringify } from 'postcss';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -54,16 +56,16 @@
|
||||
vision: true
|
||||
};
|
||||
|
||||
let toolIds = [];
|
||||
let knowledge = [];
|
||||
|
||||
$: if (name) {
|
||||
id = name.replace(/\s+/g, '-').toLowerCase();
|
||||
}
|
||||
|
||||
let baseModel = null;
|
||||
$: {
|
||||
baseModel = $models.find((m) => m.id === info.base_model_id);
|
||||
console.log(baseModel);
|
||||
const addUsage = (base_model_id) => {
|
||||
const baseModel = $models.find((m) => m.id === base_model_id);
|
||||
|
||||
if (baseModel) {
|
||||
if (baseModel.owned_by === 'openai') {
|
||||
capabilities.usage = baseModel.info?.meta?.capabilities?.usage ?? false;
|
||||
@@ -72,7 +74,7 @@
|
||||
}
|
||||
capabilities = capabilities;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const submitHandler = async () => {
|
||||
loading = true;
|
||||
@@ -89,6 +91,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
if (toolIds.length > 0) {
|
||||
info.meta.toolIds = toolIds;
|
||||
} else {
|
||||
if (info.meta.toolIds) {
|
||||
delete info.meta.toolIds;
|
||||
}
|
||||
}
|
||||
|
||||
info.params.stop = params.stop ? params.stop.split(',').filter((s) => s.trim()) : null;
|
||||
Object.keys(info.params).forEach((key) => {
|
||||
if (info.params[key] === '' || info.params[key] === null) {
|
||||
@@ -155,6 +165,7 @@
|
||||
params.stop = params?.stop ? (params?.stop ?? []).join(',') : null;
|
||||
|
||||
capabilities = { ...capabilities, ...(model?.info?.meta?.capabilities ?? {}) };
|
||||
toolIds = model?.info?.meta?.toolIds ?? [];
|
||||
|
||||
info = {
|
||||
...info,
|
||||
@@ -360,6 +371,9 @@
|
||||
class="px-3 py-1.5 text-sm w-full bg-transparent border dark:border-gray-600 outline-none rounded-lg"
|
||||
placeholder="Select a base model (e.g. llama3, gpt-4o)"
|
||||
bind:value={info.base_model_id}
|
||||
on:change={(e) => {
|
||||
addUsage(e.target.value);
|
||||
}}
|
||||
required
|
||||
>
|
||||
<option value={null} class=" text-gray-900">{$i18n.t('Select a base model')}</option>
|
||||
@@ -445,6 +459,7 @@
|
||||
{#if showAdvanced}
|
||||
<div class="my-2">
|
||||
<AdvancedParams
|
||||
admin={true}
|
||||
bind:params
|
||||
on:change={(e) => {
|
||||
info.params = { ...info.params, ...params };
|
||||
@@ -551,6 +566,10 @@
|
||||
<Knowledge bind:knowledge />
|
||||
</div>
|
||||
|
||||
<div class="my-2">
|
||||
<ToolsSelector bind:selectedToolIds={toolIds} tools={$tools} />
|
||||
</div>
|
||||
|
||||
<div class="my-1">
|
||||
<div class="flex w-full justify-between mb-1">
|
||||
<div class=" self-center text-sm font-semibold">{$i18n.t('Capabilities')}</div>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
import { onMount, getContext } from 'svelte';
|
||||
import { page } from '$app/stores';
|
||||
import { settings, user, config, models } from '$lib/stores';
|
||||
import { settings, user, config, models, tools } from '$lib/stores';
|
||||
import { splitStream } from '$lib/utils';
|
||||
|
||||
import { getModelInfos, updateModelById } from '$lib/apis/models';
|
||||
@@ -15,6 +15,7 @@
|
||||
import Checkbox from '$lib/components/common/Checkbox.svelte';
|
||||
import Tags from '$lib/components/common/Tags.svelte';
|
||||
import Knowledge from '$lib/components/workspace/Models/Knowledge.svelte';
|
||||
import ToolsSelector from '$lib/components/workspace/Models/ToolsSelector.svelte';
|
||||
|
||||
const i18n = getContext('i18n');
|
||||
|
||||
@@ -60,6 +61,7 @@
|
||||
};
|
||||
|
||||
let knowledge = [];
|
||||
let toolIds = [];
|
||||
|
||||
const updateHandler = async () => {
|
||||
loading = true;
|
||||
@@ -76,6 +78,14 @@
|
||||
}
|
||||
}
|
||||
|
||||
if (toolIds.length > 0) {
|
||||
info.meta.toolIds = toolIds;
|
||||
} else {
|
||||
if (info.meta.toolIds) {
|
||||
delete info.meta.toolIds;
|
||||
}
|
||||
}
|
||||
|
||||
info.params.stop = params.stop ? params.stop.split(',').filter((s) => s.trim()) : null;
|
||||
Object.keys(info.params).forEach((key) => {
|
||||
if (info.params[key] === '' || info.params[key] === null) {
|
||||
@@ -133,6 +143,10 @@
|
||||
knowledge = [...model?.info?.meta?.knowledge];
|
||||
}
|
||||
|
||||
if (model?.info?.meta?.toolIds) {
|
||||
toolIds = [...model?.info?.meta?.toolIds];
|
||||
}
|
||||
|
||||
if (model?.owned_by === 'openai') {
|
||||
capabilities.usage = false;
|
||||
}
|
||||
@@ -408,6 +422,7 @@
|
||||
{#if showAdvanced}
|
||||
<div class="my-2">
|
||||
<AdvancedParams
|
||||
admin={true}
|
||||
bind:params
|
||||
on:change={(e) => {
|
||||
info.params = { ...info.params, ...params };
|
||||
@@ -514,6 +529,10 @@
|
||||
<Knowledge bind:knowledge />
|
||||
</div>
|
||||
|
||||
<div class="my-2">
|
||||
<ToolsSelector bind:selectedToolIds={toolIds} tools={$tools} />
|
||||
</div>
|
||||
|
||||
<div class="my-2">
|
||||
<div class="flex w-full justify-between mb-1">
|
||||
<div class=" self-center text-sm font-semibold">{$i18n.t('Capabilities')}</div>
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<script>
|
||||
import Tools from '$lib/components/workspace/Tools.svelte';
|
||||
</script>
|
||||
|
||||
<Tools />
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user