"src/git@developer.sourcefind.cn:chenpangpang/open-webui.git" did not exist on "dc7f595448caffbfaf604936f76b2337ef61f68e"
Unverified Commit 78dedb33 authored by Timothy Jaeryang Baek's avatar Timothy Jaeryang Baek Committed by GitHub
Browse files

Merge branch 'dev' into feat/disable-community-sharing

parents e06417f0 efedd39d
...@@ -84,6 +84,8 @@ jobs: ...@@ -84,6 +84,8 @@ jobs:
outputs: type=image,name=${{ env.FULL_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true outputs: type=image,name=${{ env.FULL_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
cache-from: type=registry,ref=${{ steps.cache-meta.outputs.tags }} cache-from: type=registry,ref=${{ steps.cache-meta.outputs.tags }}
cache-to: type=registry,ref=${{ steps.cache-meta.outputs.tags }},mode=max cache-to: type=registry,ref=${{ steps.cache-meta.outputs.tags }},mode=max
build-args: |
BUILD_HASH=${{ github.sha }}
- name: Export digest - name: Export digest
run: | run: |
...@@ -170,7 +172,9 @@ jobs: ...@@ -170,7 +172,9 @@ jobs:
outputs: type=image,name=${{ env.FULL_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true outputs: type=image,name=${{ env.FULL_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
cache-from: type=registry,ref=${{ steps.cache-meta.outputs.tags }} cache-from: type=registry,ref=${{ steps.cache-meta.outputs.tags }}
cache-to: type=registry,ref=${{ steps.cache-meta.outputs.tags }},mode=max cache-to: type=registry,ref=${{ steps.cache-meta.outputs.tags }},mode=max
build-args: USE_CUDA=true build-args: |
BUILD_HASH=${{ github.sha }}
USE_CUDA=true
- name: Export digest - name: Export digest
run: | run: |
...@@ -257,7 +261,9 @@ jobs: ...@@ -257,7 +261,9 @@ jobs:
outputs: type=image,name=${{ env.FULL_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true outputs: type=image,name=${{ env.FULL_IMAGE_NAME }},push-by-digest=true,name-canonical=true,push=true
cache-from: type=registry,ref=${{ steps.cache-meta.outputs.tags }} cache-from: type=registry,ref=${{ steps.cache-meta.outputs.tags }}
cache-to: type=registry,ref=${{ steps.cache-meta.outputs.tags }},mode=max cache-to: type=registry,ref=${{ steps.cache-meta.outputs.tags }},mode=max
build-args: USE_OLLAMA=true build-args: |
BUILD_HASH=${{ github.sha }}
USE_OLLAMA=true
- name: Export digest - name: Export digest
run: | run: |
......
...@@ -11,12 +11,14 @@ ARG USE_CUDA_VER=cu121 ...@@ -11,12 +11,14 @@ ARG USE_CUDA_VER=cu121
# IMPORTANT: If you change the embedding model (sentence-transformers/all-MiniLM-L6-v2) and vice versa, you aren't able to use RAG Chat with your previous documents loaded in the WebUI! You need to re-embed them. # IMPORTANT: If you change the embedding model (sentence-transformers/all-MiniLM-L6-v2) and vice versa, you aren't able to use RAG Chat with your previous documents loaded in the WebUI! You need to re-embed them.
ARG USE_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 ARG USE_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2
ARG USE_RERANKING_MODEL="" ARG USE_RERANKING_MODEL=""
ARG BUILD_HASH=dev-build
# Override at your own risk - non-root configurations are untested # Override at your own risk - non-root configurations are untested
ARG UID=0 ARG UID=0
ARG GID=0 ARG GID=0
######## WebUI frontend ######## ######## WebUI frontend ########
FROM --platform=$BUILDPLATFORM node:21-alpine3.19 as build FROM --platform=$BUILDPLATFORM node:21-alpine3.19 as build
ARG BUILD_HASH
WORKDIR /app WORKDIR /app
...@@ -24,6 +26,7 @@ COPY package.json package-lock.json ./ ...@@ -24,6 +26,7 @@ COPY package.json package-lock.json ./
RUN npm ci RUN npm ci
COPY . . COPY . .
ENV APP_BUILD_HASH=${BUILD_HASH}
RUN npm run build RUN npm run build
######## WebUI backend ######## ######## WebUI backend ########
...@@ -35,6 +38,7 @@ ARG USE_OLLAMA ...@@ -35,6 +38,7 @@ ARG USE_OLLAMA
ARG USE_CUDA_VER ARG USE_CUDA_VER
ARG USE_EMBEDDING_MODEL ARG USE_EMBEDDING_MODEL
ARG USE_RERANKING_MODEL ARG USE_RERANKING_MODEL
ARG BUILD_HASH
ARG UID ARG UID
ARG GID ARG GID
...@@ -150,4 +154,6 @@ HEALTHCHECK CMD curl --silent --fail http://localhost:8080/health | jq -e '.stat ...@@ -150,4 +154,6 @@ HEALTHCHECK CMD curl --silent --fail http://localhost:8080/health | jq -e '.stat
USER $UID:$GID USER $UID:$GID
ENV WEBUI_BUILD_VERSION=${BUILD_HASH}
CMD [ "bash", "start.sh"] CMD [ "bash", "start.sh"]
...@@ -13,7 +13,7 @@ from apps.webui.routers import ( ...@@ -13,7 +13,7 @@ from apps.webui.routers import (
utils, utils,
) )
from config import ( from config import (
WEBUI_VERSION, WEBUI_BUILD_HASH,
WEBUI_AUTH, WEBUI_AUTH,
DEFAULT_MODELS, DEFAULT_MODELS,
DEFAULT_PROMPT_SUGGESTIONS, DEFAULT_PROMPT_SUGGESTIONS,
...@@ -23,6 +23,7 @@ from config import ( ...@@ -23,6 +23,7 @@ from config import (
WEBHOOK_URL, WEBHOOK_URL,
WEBUI_AUTH_TRUSTED_EMAIL_HEADER, WEBUI_AUTH_TRUSTED_EMAIL_HEADER,
JWT_EXPIRES_IN, JWT_EXPIRES_IN,
WEBUI_BANNERS,
AppConfig, AppConfig,
ENABLE_COMMUNITY_SHARING, ENABLE_COMMUNITY_SHARING,
) )
...@@ -41,6 +42,7 @@ app.state.config.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS ...@@ -41,6 +42,7 @@ app.state.config.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS
app.state.config.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE app.state.config.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE
app.state.config.USER_PERMISSIONS = USER_PERMISSIONS app.state.config.USER_PERMISSIONS = USER_PERMISSIONS
app.state.config.WEBHOOK_URL = WEBHOOK_URL app.state.config.WEBHOOK_URL = WEBHOOK_URL
app.state.config.BANNERS = WEBUI_BANNERS
app.state.config.ENABLE_COMMUNITY_SHARING = ENABLE_COMMUNITY_SHARING app.state.config.ENABLE_COMMUNITY_SHARING = ENABLE_COMMUNITY_SHARING
......
...@@ -8,6 +8,8 @@ from pydantic import BaseModel ...@@ -8,6 +8,8 @@ from pydantic import BaseModel
import time import time
import uuid import uuid
from config import BannerModel
from apps.webui.models.users import Users from apps.webui.models.users import Users
from utils.utils import ( from utils.utils import (
...@@ -57,3 +59,31 @@ async def set_global_default_suggestions( ...@@ -57,3 +59,31 @@ async def set_global_default_suggestions(
data = form_data.model_dump() data = form_data.model_dump()
request.app.state.config.DEFAULT_PROMPT_SUGGESTIONS = data["suggestions"] request.app.state.config.DEFAULT_PROMPT_SUGGESTIONS = data["suggestions"]
return request.app.state.config.DEFAULT_PROMPT_SUGGESTIONS return request.app.state.config.DEFAULT_PROMPT_SUGGESTIONS
############################
# SetBanners
############################
class SetBannersForm(BaseModel):
banners: List[BannerModel]
@router.post("/banners", response_model=List[BannerModel])
async def set_banners(
request: Request,
form_data: SetBannersForm,
user=Depends(get_admin_user),
):
data = form_data.model_dump()
request.app.state.config.BANNERS = data["banners"]
return request.app.state.config.BANNERS
@router.get("/banners", response_model=List[BannerModel])
async def get_banners(
request: Request,
user=Depends(get_current_user),
):
return request.app.state.config.BANNERS
...@@ -8,6 +8,8 @@ from chromadb import Settings ...@@ -8,6 +8,8 @@ from chromadb import Settings
from base64 import b64encode from base64 import b64encode
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from typing import TypeVar, Generic, Union from typing import TypeVar, Generic, Union
from pydantic import BaseModel
from typing import Optional
from pathlib import Path from pathlib import Path
import json import json
...@@ -166,10 +168,10 @@ CHANGELOG = changelog_json ...@@ -166,10 +168,10 @@ CHANGELOG = changelog_json
#################################### ####################################
# WEBUI_VERSION # WEBUI_BUILD_HASH
#################################### ####################################
WEBUI_VERSION = os.environ.get("WEBUI_VERSION", "v1.0.0-alpha.100") WEBUI_BUILD_HASH = os.environ.get("WEBUI_BUILD_HASH", "dev-build")
#################################### ####################################
# DATA/FRONTEND BUILD DIR # DATA/FRONTEND BUILD DIR
...@@ -572,6 +574,21 @@ ENABLE_COMMUNITY_SHARING = PersistentConfig( ...@@ -572,6 +574,21 @@ ENABLE_COMMUNITY_SHARING = PersistentConfig(
os.environ.get("ENABLE_COMMUNITY_SHARING", "True").lower() == "true", os.environ.get("ENABLE_COMMUNITY_SHARING", "True").lower() == "true",
) )
class BannerModel(BaseModel):
id: str
type: str
title: Optional[str] = None
content: str
dismissible: bool
timestamp: int
WEBUI_BANNERS = PersistentConfig(
"WEBUI_BANNERS",
"ui.banners",
[BannerModel(**banner) for banner in json.loads("[]")],
)
#################################### ####################################
# WEBUI_SECRET_KEY # WEBUI_SECRET_KEY
#################################### ####################################
......
...@@ -55,6 +55,7 @@ from config import ( ...@@ -55,6 +55,7 @@ from config import (
WEBHOOK_URL, WEBHOOK_URL,
ENABLE_ADMIN_EXPORT, ENABLE_ADMIN_EXPORT,
AppConfig, AppConfig,
WEBUI_BUILD_HASH,
) )
from constants import ERROR_MESSAGES from constants import ERROR_MESSAGES
...@@ -84,7 +85,8 @@ print( ...@@ -84,7 +85,8 @@ print(
|_| |_|
v{VERSION} - building the best open-source AI user interface. v{VERSION} - building the best open-source AI user interface.
{f"Commit: {WEBUI_BUILD_HASH}" if WEBUI_BUILD_HASH != "dev-build" else ""}
https://github.com/open-webui/open-webui https://github.com/open-webui/open-webui
""" """
) )
......
# noqa: INP001 # noqa: INP001
import os
import shutil import shutil
import subprocess import subprocess
from sys import stderr from sys import stderr
...@@ -18,4 +19,5 @@ class CustomBuildHook(BuildHookInterface): ...@@ -18,4 +19,5 @@ class CustomBuildHook(BuildHookInterface):
stderr.write("### npm install\n") stderr.write("### npm install\n")
subprocess.run([npm, "install"], check=True) # noqa: S603 subprocess.run([npm, "install"], check=True) # noqa: S603
stderr.write("\n### npm run build\n") stderr.write("\n### npm run build\n")
os.environ["APP_BUILD_HASH"] = version
subprocess.run([npm, "run", "build"], check=True) # noqa: S603 subprocess.run([npm, "run", "build"], check=True) # noqa: S603
{ {
"name": "open-webui", "name": "open-webui",
"version": "0.2.0.dev1", "version": "0.2.0.dev2",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "open-webui", "name": "open-webui",
"version": "0.2.0.dev1", "version": "0.2.0.dev2",
"dependencies": { "dependencies": {
"@pyscript/core": "^0.4.32", "@pyscript/core": "^0.4.32",
"@sveltejs/adapter-node": "^1.3.1", "@sveltejs/adapter-node": "^1.3.1",
......
{ {
"name": "open-webui", "name": "open-webui",
"version": "0.2.0.dev1", "version": "0.2.0.dev2",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "npm run pyodide:fetch && vite dev --host", "dev": "npm run pyodide:fetch && vite dev --host",
......
import { WEBUI_API_BASE_URL } from '$lib/constants'; import { WEBUI_API_BASE_URL } from '$lib/constants';
import type { Banner } from '$lib/types';
export const setDefaultModels = async (token: string, models: string) => { export const setDefaultModels = async (token: string, models: string) => {
let error = null; let error = null;
...@@ -59,3 +60,60 @@ export const setDefaultPromptSuggestions = async (token: string, promptSuggestio ...@@ -59,3 +60,60 @@ export const setDefaultPromptSuggestions = async (token: string, promptSuggestio
return res; return res;
}; };
export const getBanners = async (token: string): Promise<Banner[]> => {
let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/configs/banners`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
}
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.catch((err) => {
console.log(err);
error = err.detail;
return null;
});
if (error) {
throw error;
}
return res;
};
export const setBanners = async (token: string, banners: Banner[]) => {
let error = null;
const res = await fetch(`${WEBUI_API_BASE_URL}/configs/banners`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${token}`
},
body: JSON.stringify({
banners: banners
})
})
.then(async (res) => {
if (!res.ok) throw await res.json();
return res.json();
})
.catch((err) => {
console.log(err);
error = err.detail;
return null;
});
if (error) {
throw error;
}
return res;
};
<script lang="ts">
import { v4 as uuidv4 } from 'uuid';
import { getContext, onMount } from 'svelte';
import { banners as _banners } from '$lib/stores';
import type { Banner } from '$lib/types';
import { getBanners, setBanners } from '$lib/apis/configs';
import type { Writable } from 'svelte/store';
import type { i18n as i18nType } from 'i18next';
import Tooltip from '$lib/components/common/Tooltip.svelte';
import Switch from '$lib/components/common/Switch.svelte';
const i18n: Writable<i18nType> = getContext('i18n');
export let saveHandler: Function;
let banners: Banner[] = [];
onMount(async () => {
banners = await getBanners(localStorage.token);
});
const updateBanners = async () => {
_banners.set(await setBanners(localStorage.token, banners));
};
</script>
<form
class="flex flex-col h-full justify-between space-y-3 text-sm"
on:submit|preventDefault={async () => {
updateBanners();
saveHandler();
}}
>
<div class=" space-y-3 pr-1.5 overflow-y-scroll max-h-80 h-full">
<div class=" space-y-3 pr-1.5">
<div class="flex w-full justify-between mb-2">
<div class=" self-center text-sm font-semibold">
{$i18n.t('Banners')}
</div>
<button
class="p-1 px-3 text-xs flex rounded transition"
type="button"
on:click={() => {
if (banners.length === 0 || banners.at(-1).content !== '') {
banners = [
...banners,
{
id: uuidv4(),
type: '',
title: '',
content: '',
dismissible: true,
timestamp: Math.floor(Date.now() / 1000)
}
];
}
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z"
/>
</svg>
</button>
</div>
<div class="flex flex-col space-y-1">
{#each banners as banner, bannerIdx}
<div class=" flex justify-between">
<div class="flex flex-row flex-1 border rounded-xl dark:border-gray-800">
<select
class="w-fit capitalize rounded-xl py-2 px-4 text-xs bg-transparent outline-none"
bind:value={banner.type}
>
{#if banner.type == ''}
<option value="" selected disabled class="">{$i18n.t('Type')}</option>
{/if}
<option value="info">{$i18n.t('Info')}</option>
<option value="warning">{$i18n.t('Warning')}</option>
<option value="error">{$i18n.t('Error')}</option>
<option value="success">{$i18n.t('Success')}</option>
</select>
<input
class="pr-5 py-1.5 text-xs w-full bg-transparent outline-none"
placeholder={$i18n.t('Content')}
bind:value={banner.content}
/>
<div class="relative top-1.5 -left-2">
<Tooltip content="Dismissible" className="flex h-fit items-center">
<Switch bind:state={banner.dismissible} />
</Tooltip>
</div>
</div>
<button
class="px-2"
type="button"
on:click={() => {
banners.splice(bannerIdx, 1);
banners = banners;
}}
>
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 20 20"
fill="currentColor"
class="w-4 h-4"
>
<path
d="M6.28 5.22a.75.75 0 00-1.06 1.06L8.94 10l-3.72 3.72a.75.75 0 101.06 1.06L10 11.06l3.72 3.72a.75.75 0 101.06-1.06L11.06 10l3.72-3.72a.75.75 0 00-1.06-1.06L10 8.94 6.28 5.22z"
/>
</svg>
</button>
</div>
{/each}
</div>
</div>
</div>
<div class="flex justify-end pt-3 text-sm font-medium">
<button
class=" px-4 py-2 bg-emerald-700 hover:bg-emerald-800 text-gray-100 transition rounded-lg"
type="submit"
>
Save
</button>
</div>
</form>
...@@ -6,6 +6,9 @@ ...@@ -6,6 +6,9 @@
import General from './Settings/General.svelte'; import General from './Settings/General.svelte';
import Users from './Settings/Users.svelte'; import Users from './Settings/Users.svelte';
import Banners from '$lib/components/admin/Settings/Banners.svelte';
import { toast } from 'svelte-sonner';
const i18n = getContext('i18n'); const i18n = getContext('i18n');
export let show = false; export let show = false;
...@@ -117,24 +120,63 @@ ...@@ -117,24 +120,63 @@
</div> </div>
<div class=" self-center">{$i18n.t('Database')}</div> <div class=" self-center">{$i18n.t('Database')}</div>
</button> </button>
<button
class="px-2.5 py-2.5 min-w-fit rounded-lg flex-1 md:flex-none flex text-right transition {selectedTab ===
'banners'
? 'bg-gray-200 dark:bg-gray-700'
: ' hover:bg-gray-300 dark:hover:bg-gray-800'}"
on:click={() => {
selectedTab = 'banners';
}}
>
<div class=" self-center mr-2">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
class="size-4"
>
<path
d="M5.85 3.5a.75.75 0 0 0-1.117-1 9.719 9.719 0 0 0-2.348 4.876.75.75 0 0 0 1.479.248A8.219 8.219 0 0 1 5.85 3.5ZM19.267 2.5a.75.75 0 1 0-1.118 1 8.22 8.22 0 0 1 1.987 4.124.75.75 0 0 0 1.48-.248A9.72 9.72 0 0 0 19.266 2.5Z"
/>
<path
fill-rule="evenodd"
d="M12 2.25A6.75 6.75 0 0 0 5.25 9v.75a8.217 8.217 0 0 1-2.119 5.52.75.75 0 0 0 .298 1.206c1.544.57 3.16.99 4.831 1.243a3.75 3.75 0 1 0 7.48 0 24.583 24.583 0 0 0 4.83-1.244.75.75 0 0 0 .298-1.205 8.217 8.217 0 0 1-2.118-5.52V9A6.75 6.75 0 0 0 12 2.25ZM9.75 18c0-.034 0-.067.002-.1a25.05 25.05 0 0 0 4.496 0l.002.1a2.25 2.25 0 1 1-4.5 0Z"
clip-rule="evenodd"
/>
</svg>
</div>
<div class=" self-center">{$i18n.t('Banners')}</div>
</button>
</div> </div>
<div class="flex-1 md:min-h-[380px]"> <div class="flex-1 md:min-h-[380px]">
{#if selectedTab === 'general'} {#if selectedTab === 'general'}
<General <General
saveHandler={() => { saveHandler={() => {
show = false; show = false;
toast.success($i18n.t('Settings saved successfully!'));
}} }}
/> />
{:else if selectedTab === 'users'} {:else if selectedTab === 'users'}
<Users <Users
saveHandler={() => { saveHandler={() => {
show = false; show = false;
toast.success($i18n.t('Settings saved successfully!'));
}} }}
/> />
{:else if selectedTab === 'db'} {:else if selectedTab === 'db'}
<Database <Database
saveHandler={() => { saveHandler={() => {
show = false; show = false;
toast.success($i18n.t('Settings saved successfully!'));
}}
/>
{:else if selectedTab === 'banners'}
<Banners
saveHandler={() => {
show = false;
toast.success($i18n.t('Settings saved successfully!'));
}} }}
/> />
{/if} {/if}
......
...@@ -15,7 +15,8 @@ ...@@ -15,7 +15,8 @@
settings, settings,
showSidebar, showSidebar,
tags as _tags, tags as _tags,
WEBUI_NAME WEBUI_NAME,
banners
} from '$lib/stores'; } from '$lib/stores';
import { convertMessagesToHistory, copyToClipboard, splitStream } from '$lib/utils'; import { convertMessagesToHistory, copyToClipboard, splitStream } from '$lib/utils';
...@@ -40,6 +41,7 @@ ...@@ -40,6 +41,7 @@
import { queryMemory } from '$lib/apis/memories'; import { queryMemory } from '$lib/apis/memories';
import type { Writable } from 'svelte/store'; import type { Writable } from 'svelte/store';
import type { i18n as i18nType } from 'i18next'; import type { i18n as i18nType } from 'i18next';
import Banner from '../common/Banner.svelte';
const i18n: Writable<i18nType> = getContext('i18n'); const i18n: Writable<i18nType> = getContext('i18n');
...@@ -1004,6 +1006,34 @@ ...@@ -1004,6 +1006,34 @@
{chat} {chat}
{initNewChat} {initNewChat}
/> />
{#if $banners.length > 0 && !$chatId}
<div
class="absolute top-[4.25rem] w-full {$showSidebar ? 'md:max-w-[calc(100%-260px)]' : ''}"
>
<div class=" flex flex-col gap-1 w-full">
{#each $banners.filter( (b) => (b.dismissible ? !JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]').includes(b.id) : true) ) as banner}
<Banner
{banner}
on:dismiss={(e) => {
const bannerId = e.detail;
localStorage.setItem(
'dismissedBannerIds',
JSON.stringify(
[
bannerId,
...JSON.parse(localStorage.getItem('dismissedBannerIds') ?? '[]')
].filter((id) => $banners.find((b) => b.id === id))
)
);
}}
/>
{/each}
</div>
</div>
{/if}
<div class="flex flex-col flex-auto"> <div class="flex flex-col flex-auto">
<div <div
class=" pb-2.5 flex flex-col justify-between w-full flex-auto overflow-auto h-0 max-w-full" class=" pb-2.5 flex flex-col justify-between w-full flex-auto overflow-auto h-0 max-w-full"
......
<script lang="ts"> <script lang="ts">
import { getVersionUpdates } from '$lib/apis'; import { getVersionUpdates } from '$lib/apis';
import { getOllamaVersion } from '$lib/apis/ollama'; import { getOllamaVersion } from '$lib/apis/ollama';
import { WEBUI_VERSION } from '$lib/constants'; import { WEBUI_BUILD_HASH, WEBUI_VERSION } from '$lib/constants';
import { WEBUI_NAME, config, showChangelog } from '$lib/stores'; import { WEBUI_NAME, config, showChangelog } from '$lib/stores';
import { compareVersion } from '$lib/utils'; import { compareVersion } from '$lib/utils';
import { onMount, getContext } from 'svelte'; import { onMount, getContext } from 'svelte';
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
<div class="flex w-full justify-between items-center"> <div class="flex w-full justify-between items-center">
<div class="flex flex-col text-xs text-gray-700 dark:text-gray-200"> <div class="flex flex-col text-xs text-gray-700 dark:text-gray-200">
<div class="flex gap-1"> <div class="flex gap-1">
<Tooltip content={WEBUI_VERSION === '0.1.117' ? "🪖 We're just getting started." : ''}> <Tooltip content={WEBUI_BUILD_HASH}>
v{WEBUI_VERSION} v{WEBUI_VERSION}
</Tooltip> </Tooltip>
......
<script lang="ts">
import type { Banner } from '$lib/types';
import { onMount, createEventDispatcher } from 'svelte';
import { fade } from 'svelte/transition';
const dispatch = createEventDispatcher();
export let banner: Banner = {
id: '',
type: 'info',
title: '',
content: '',
url: '',
dismissable: true,
timestamp: Math.floor(Date.now() / 1000)
};
export let dismissed = false;
let mounted = false;
const classNames: Record<string, string> = {
info: 'bg-blue-500/20 text-blue-700 dark:text-blue-200 ',
success: 'bg-green-500/20 text-green-700 dark:text-green-200',
warning: 'bg-yellow-500/20 text-yellow-700 dark:text-yellow-200',
error: 'bg-red-500/20 text-red-700 dark:text-red-200'
};
const dismiss = (id) => {
dismissed = true;
dispatch('dismiss', id);
};
onMount(() => {
mounted = true;
});
</script>
{#if !dismissed}
{#if mounted}
<div
class=" top-0 left-0 right-0 p-2 mx-4 px-3 flex justify-center items-center relative rounded-xl border border-gray-100 dark:border-gray-850 text-gray-800 dark:text-gary-100 bg-white dark:bg-gray-900 backdrop-blur-xl z-40"
transition:fade={{ delay: 100, duration: 300 }}
>
<div class=" flex flex-col md:flex-row md:items-center flex-1 text-sm w-fit gap-1.5">
<div class="flex justify-between self-start">
<div
class=" text-xs font-black {classNames[banner.type] ??
classNames['info']} w-fit px-2 rounded uppercase line-clamp-1 mr-0.5"
>
{banner.type}
</div>
{#if banner.url}
<div class="flex md:hidden group w-fit md:items-center">
<a
class="text-gray-700 dark:text-white text-xs font-bold underline"
href="/assets/files/whitepaper.pdf"
target="_blank">Learn More</a
>
<div
class=" ml-1 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-white"
>
<!-- -->
<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.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>
</div>
{/if}
</div>
<div class="flex-1 text-xs text-gray-700 dark:text-white">
{banner.content}
</div>
</div>
{#if banner.url}
<div class="hidden md:flex group w-fit md:items-center">
<a
class="text-gray-700 dark:text-white text-xs font-bold underline"
href="/"
target="_blank">Learn More</a
>
<div class=" ml-1 text-gray-400 group-hover:text-gray-600 dark:group-hover:text-white">
<!-- -->
<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>
</div>
{/if}
<div class="flex self-start">
{#if banner.dismissible}
<button
on:click={() => {
dismiss(banner.id);
}}
class=" -mt-[3px] ml-1.5 mr-1 text-gray-400 dark:hover:text-white h-1">&times;</button
>
{/if}
</div>
</div>
{/if}
{/if}
...@@ -13,6 +13,7 @@ export const IMAGES_API_BASE_URL = `${WEBUI_BASE_URL}/images/api/v1`; ...@@ -13,6 +13,7 @@ export const IMAGES_API_BASE_URL = `${WEBUI_BASE_URL}/images/api/v1`;
export const RAG_API_BASE_URL = `${WEBUI_BASE_URL}/rag/api/v1`; export const RAG_API_BASE_URL = `${WEBUI_BASE_URL}/rag/api/v1`;
export const WEBUI_VERSION = APP_VERSION; export const WEBUI_VERSION = APP_VERSION;
export const WEBUI_BUILD_HASH = APP_BUILD_HASH;
export const REQUIRED_OLLAMA_VERSION = '0.1.16'; export const REQUIRED_OLLAMA_VERSION = '0.1.16';
export const SUPPORTED_FILE_TYPE = [ export const SUPPORTED_FILE_TYPE = [
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
"API keys": "مفاتيح واجهة برمجة التطبيقات", "API keys": "مفاتيح واجهة برمجة التطبيقات",
"April": "أبريل", "April": "أبريل",
"Archive": "الأرشيف", "Archive": "الأرشيف",
"Archive All Chats": "",
"Archived Chats": "الأرشيف المحادثات", "Archived Chats": "الأرشيف المحادثات",
"are allowed - Activate this command by typing": "مسموح - قم بتنشيط هذا الأمر عن طريق الكتابة", "are allowed - Activate this command by typing": "مسموح - قم بتنشيط هذا الأمر عن طريق الكتابة",
"Are you sure?": "هل أنت متأكد ؟", "Are you sure?": "هل أنت متأكد ؟",
...@@ -61,6 +62,7 @@ ...@@ -61,6 +62,7 @@
"available!": "متاح", "available!": "متاح",
"Back": "خلف", "Back": "خلف",
"Bad Response": "استجابة خطاء", "Bad Response": "استجابة خطاء",
"Banners": "",
"Base Model (From)": "", "Base Model (From)": "",
"before": "قبل", "before": "قبل",
"Being lazy": "كون كسول", "Being lazy": "كون كسول",
...@@ -119,7 +121,6 @@ ...@@ -119,7 +121,6 @@
"Custom": "مخصص", "Custom": "مخصص",
"Customize models for a specific purpose": "", "Customize models for a specific purpose": "",
"Dark": "مظلم", "Dark": "مظلم",
"Dashboard": "لوحة التحكم",
"Database": "قاعدة البيانات", "Database": "قاعدة البيانات",
"December": "ديسمبر", "December": "ديسمبر",
"Default": "الإفتراضي", "Default": "الإفتراضي",
...@@ -187,6 +188,7 @@ ...@@ -187,6 +188,7 @@
"Enter Your Full Name": "أدخل الاسم كامل", "Enter Your Full Name": "أدخل الاسم كامل",
"Enter Your Password": "ادخل كلمة المرور", "Enter Your Password": "ادخل كلمة المرور",
"Enter Your Role": "أدخل الصلاحيات", "Enter Your Role": "أدخل الصلاحيات",
"Error": "",
"Experimental": "تجريبي", "Experimental": "تجريبي",
"Export All Chats (All Users)": "تصدير جميع الدردشات (جميع المستخدمين)", "Export All Chats (All Users)": "تصدير جميع الدردشات (جميع المستخدمين)",
"Export Chats": "تصدير جميع الدردشات", "Export Chats": "تصدير جميع الدردشات",
...@@ -226,6 +228,7 @@ ...@@ -226,6 +228,7 @@
"Import Models": "", "Import Models": "",
"Import Prompts": "مطالبات الاستيراد", "Import Prompts": "مطالبات الاستيراد",
"Include `--api` flag when running stable-diffusion-webui": "قم بتضمين علامة `-api` عند تشغيل Stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "قم بتضمين علامة `-api` عند تشغيل Stable-diffusion-webui",
"Info": "",
"Input commands": "إدخال الأوامر", "Input commands": "إدخال الأوامر",
"Interface": "واجهه المستخدم", "Interface": "واجهه المستخدم",
"Invalid Tag": "تاق غير صالحة", "Invalid Tag": "تاق غير صالحة",
...@@ -310,7 +313,6 @@ ...@@ -310,7 +313,6 @@
"OpenAI URL/Key required.": "URL/مفتاح OpenAI.مطلوب عنوان ", "OpenAI URL/Key required.": "URL/مفتاح OpenAI.مطلوب عنوان ",
"or": "أو", "or": "أو",
"Other": "آخر", "Other": "آخر",
"Overview": "عرض",
"Password": "الباسورد", "Password": "الباسورد",
"PDF document (.pdf)": "PDF ملف (.pdf)", "PDF document (.pdf)": "PDF ملف (.pdf)",
"PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)", "PDF Extract Images (OCR)": "PDF أستخرج الصور (OCR)",
...@@ -361,6 +363,7 @@ ...@@ -361,6 +363,7 @@
"Scan for documents from {{path}}": "{{path}} مسح على الملفات من", "Scan for documents from {{path}}": "{{path}} مسح على الملفات من",
"Search": "البحث", "Search": "البحث",
"Search a model": "البحث عن موديل", "Search a model": "البحث عن موديل",
"Search Chats": "",
"Search Documents": "البحث المستندات", "Search Documents": "البحث المستندات",
"Search Models": "", "Search Models": "",
"Search Prompts": "أبحث حث", "Search Prompts": "أبحث حث",
...@@ -444,6 +447,7 @@ ...@@ -444,6 +447,7 @@
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "هل تواجه مشكلة في الوصول", "Trouble accessing Ollama?": "هل تواجه مشكلة في الوصول",
"TTS Settings": "TTS اعدادات", "TTS Settings": "TTS اعدادات",
"Type": "",
"Type Hugging Face Resolve (Download) URL": "اكتب عنوان URL لحل مشكلة الوجه (تنزيل).", "Type Hugging Face Resolve (Download) URL": "اكتب عنوان URL لحل مشكلة الوجه (تنزيل).",
"Uh-oh! There was an issue connecting to {{provider}}.": "{{provider}}خطاء أوه! حدثت مشكلة في الاتصال بـ ", "Uh-oh! There was an issue connecting to {{provider}}.": "{{provider}}خطاء أوه! حدثت مشكلة في الاتصال بـ ",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "نوع ملف غير معروف '{{file_type}}', ولكن القبول والتعامل كنص عادي ", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "نوع ملف غير معروف '{{file_type}}', ولكن القبول والتعامل كنص عادي ",
...@@ -464,6 +468,7 @@ ...@@ -464,6 +468,7 @@
"variable": "المتغير", "variable": "المتغير",
"variable to have them replaced with clipboard content.": "متغير لاستبدالها بمحتوى الحافظة.", "variable to have them replaced with clipboard content.": "متغير لاستبدالها بمحتوى الحافظة.",
"Version": "إصدار", "Version": "إصدار",
"Warning": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "تحذير: إذا قمت بتحديث أو تغيير نموذج التضمين الخاص بك، فستحتاج إلى إعادة استيراد كافة المستندات.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "تحذير: إذا قمت بتحديث أو تغيير نموذج التضمين الخاص بك، فستحتاج إلى إعادة استيراد كافة المستندات.",
"Web": "Web", "Web": "Web",
"Web Loader Settings": "Web تحميل اعدادات", "Web Loader Settings": "Web تحميل اعدادات",
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
"API keys": "API Ключове", "API keys": "API Ключове",
"April": "Април", "April": "Април",
"Archive": "Архивирани Чатове", "Archive": "Архивирани Чатове",
"Archive All Chats": "",
"Archived Chats": "Архивирани Чатове", "Archived Chats": "Архивирани Чатове",
"are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане", "are allowed - Activate this command by typing": "са разрешени - Активирайте тази команда чрез въвеждане",
"Are you sure?": "Сигурни ли сте?", "Are you sure?": "Сигурни ли сте?",
...@@ -61,6 +62,7 @@ ...@@ -61,6 +62,7 @@
"available!": "наличен!", "available!": "наличен!",
"Back": "Назад", "Back": "Назад",
"Bad Response": "Невалиден отговор от API", "Bad Response": "Невалиден отговор от API",
"Banners": "",
"Base Model (From)": "", "Base Model (From)": "",
"before": "преди", "before": "преди",
"Being lazy": "Да бъдеш мързелив", "Being lazy": "Да бъдеш мързелив",
...@@ -119,7 +121,6 @@ ...@@ -119,7 +121,6 @@
"Custom": "Персонализиран", "Custom": "Персонализиран",
"Customize models for a specific purpose": "", "Customize models for a specific purpose": "",
"Dark": "Тъмен", "Dark": "Тъмен",
"Dashboard": "Панел",
"Database": "База данни", "Database": "База данни",
"December": "Декември", "December": "Декември",
"Default": "По подразбиране", "Default": "По подразбиране",
...@@ -187,6 +188,7 @@ ...@@ -187,6 +188,7 @@
"Enter Your Full Name": "Въведете вашето пълно име", "Enter Your Full Name": "Въведете вашето пълно име",
"Enter Your Password": "Въведете вашата парола", "Enter Your Password": "Въведете вашата парола",
"Enter Your Role": "Въведете вашата роля", "Enter Your Role": "Въведете вашата роля",
"Error": "",
"Experimental": "Експериментално", "Experimental": "Експериментално",
"Export All Chats (All Users)": "Експортване на всички чатове (За всички потребители)", "Export All Chats (All Users)": "Експортване на всички чатове (За всички потребители)",
"Export Chats": "Експортване на чатове", "Export Chats": "Експортване на чатове",
...@@ -226,6 +228,7 @@ ...@@ -226,6 +228,7 @@
"Import Models": "", "Import Models": "",
"Import Prompts": "Импортване на промптове", "Import Prompts": "Импортване на промптове",
"Include `--api` flag when running stable-diffusion-webui": "Включете флага `--api`, когато стартирате stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Включете флага `--api`, когато стартирате stable-diffusion-webui",
"Info": "",
"Input commands": "Въведете команди", "Input commands": "Въведете команди",
"Interface": "Интерфейс", "Interface": "Интерфейс",
"Invalid Tag": "Невалиден тег", "Invalid Tag": "Невалиден тег",
...@@ -310,7 +313,6 @@ ...@@ -310,7 +313,6 @@
"OpenAI URL/Key required.": "OpenAI URL/Key е задължителен.", "OpenAI URL/Key required.": "OpenAI URL/Key е задължителен.",
"or": "или", "or": "или",
"Other": "Other", "Other": "Other",
"Overview": "Обзор",
"Password": "Парола", "Password": "Парола",
"PDF document (.pdf)": "PDF документ (.pdf)", "PDF document (.pdf)": "PDF документ (.pdf)",
"PDF Extract Images (OCR)": "PDF Extract Images (OCR)", "PDF Extract Images (OCR)": "PDF Extract Images (OCR)",
...@@ -361,6 +363,7 @@ ...@@ -361,6 +363,7 @@
"Scan for documents from {{path}}": "Сканиране за документи в {{path}}", "Scan for documents from {{path}}": "Сканиране за документи в {{path}}",
"Search": "Търси", "Search": "Търси",
"Search a model": "Търси модел", "Search a model": "Търси модел",
"Search Chats": "",
"Search Documents": "Търси Документи", "Search Documents": "Търси Документи",
"Search Models": "", "Search Models": "",
"Search Prompts": "Търси Промптове", "Search Prompts": "Търси Промптове",
...@@ -444,6 +447,7 @@ ...@@ -444,6 +447,7 @@
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Проблеми с достъпът до Ollama?", "Trouble accessing Ollama?": "Проблеми с достъпът до Ollama?",
"TTS Settings": "TTS Настройки", "TTS Settings": "TTS Настройки",
"Type": "",
"Type Hugging Face Resolve (Download) URL": "Въведете Hugging Face Resolve (Download) URL", "Type Hugging Face Resolve (Download) URL": "Въведете Hugging Face Resolve (Download) URL",
"Uh-oh! There was an issue connecting to {{provider}}.": "О, не! Възникна проблем при свързването с {{provider}}.", "Uh-oh! There was an issue connecting to {{provider}}.": "О, не! Възникна проблем при свързването с {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Непознат файлов тип '{{file_type}}', но се приема и обработва като текст", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Непознат файлов тип '{{file_type}}', но се приема и обработва като текст",
...@@ -464,6 +468,7 @@ ...@@ -464,6 +468,7 @@
"variable": "променлива", "variable": "променлива",
"variable to have them replaced with clipboard content.": "променливи да се заменят съдържанието от клипборд.", "variable to have them replaced with clipboard content.": "променливи да се заменят съдържанието от клипборд.",
"Version": "Версия", "Version": "Версия",
"Warning": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Предупреждение: Ако актуализирате или промените вашия модел за вграждане, трябва да повторите импортирането на всички документи.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Предупреждение: Ако актуализирате или промените вашия модел за вграждане, трябва да повторите импортирането на всички документи.",
"Web": "Уеб", "Web": "Уеб",
"Web Loader Settings": "Настройки за зареждане на уеб", "Web Loader Settings": "Настройки за зареждане на уеб",
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
"API keys": "এপিআই কোডস", "API keys": "এপিআই কোডস",
"April": "আপ্রিল", "April": "আপ্রিল",
"Archive": "আর্কাইভ", "Archive": "আর্কাইভ",
"Archive All Chats": "",
"Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার", "Archived Chats": "চ্যাট ইতিহাস সংরক্ষণাগার",
"are allowed - Activate this command by typing": "অনুমোদিত - কমান্ডটি চালু করার জন্য লিখুন", "are allowed - Activate this command by typing": "অনুমোদিত - কমান্ডটি চালু করার জন্য লিখুন",
"Are you sure?": "আপনি নিশ্চিত?", "Are you sure?": "আপনি নিশ্চিত?",
...@@ -61,6 +62,7 @@ ...@@ -61,6 +62,7 @@
"available!": "উপলব্ধ!", "available!": "উপলব্ধ!",
"Back": "পেছনে", "Back": "পেছনে",
"Bad Response": "খারাপ প্রতিক্রিয়া", "Bad Response": "খারাপ প্রতিক্রিয়া",
"Banners": "",
"Base Model (From)": "", "Base Model (From)": "",
"before": "পূর্ববর্তী", "before": "পূর্ববর্তী",
"Being lazy": "অলস হওয়া", "Being lazy": "অলস হওয়া",
...@@ -119,7 +121,6 @@ ...@@ -119,7 +121,6 @@
"Custom": "কাস্টম", "Custom": "কাস্টম",
"Customize models for a specific purpose": "", "Customize models for a specific purpose": "",
"Dark": "ডার্ক", "Dark": "ডার্ক",
"Dashboard": "ড্যাশবোর্ড",
"Database": "ডেটাবেজ", "Database": "ডেটাবেজ",
"December": "ডেসেম্বর", "December": "ডেসেম্বর",
"Default": "ডিফল্ট", "Default": "ডিফল্ট",
...@@ -187,6 +188,7 @@ ...@@ -187,6 +188,7 @@
"Enter Your Full Name": "আপনার পূর্ণ নাম লিখুন", "Enter Your Full Name": "আপনার পূর্ণ নাম লিখুন",
"Enter Your Password": "আপনার পাসওয়ার্ড লিখুন", "Enter Your Password": "আপনার পাসওয়ার্ড লিখুন",
"Enter Your Role": "আপনার রোল লিখুন", "Enter Your Role": "আপনার রোল লিখুন",
"Error": "",
"Experimental": "পরিক্ষামূলক", "Experimental": "পরিক্ষামূলক",
"Export All Chats (All Users)": "সব চ্যাট এক্সপোর্ট করুন (সব ইউজারের)", "Export All Chats (All Users)": "সব চ্যাট এক্সপোর্ট করুন (সব ইউজারের)",
"Export Chats": "চ্যাটগুলো এক্সপোর্ট করুন", "Export Chats": "চ্যাটগুলো এক্সপোর্ট করুন",
...@@ -226,6 +228,7 @@ ...@@ -226,6 +228,7 @@
"Import Models": "", "Import Models": "",
"Import Prompts": "প্রম্পটগুলো ইমপোর্ট করুন", "Import Prompts": "প্রম্পটগুলো ইমপোর্ট করুন",
"Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui চালু করার সময় `--api` ফ্ল্যাগ সংযুক্ত করুন", "Include `--api` flag when running stable-diffusion-webui": "stable-diffusion-webui চালু করার সময় `--api` ফ্ল্যাগ সংযুক্ত করুন",
"Info": "",
"Input commands": "ইনপুট কমান্ডস", "Input commands": "ইনপুট কমান্ডস",
"Interface": "ইন্টারফেস", "Interface": "ইন্টারফেস",
"Invalid Tag": "অবৈধ ট্যাগ", "Invalid Tag": "অবৈধ ট্যাগ",
...@@ -310,7 +313,6 @@ ...@@ -310,7 +313,6 @@
"OpenAI URL/Key required.": "OpenAI URL/Key আবশ্যক", "OpenAI URL/Key required.": "OpenAI URL/Key আবশ্যক",
"or": "অথবা", "or": "অথবা",
"Other": "অন্যান্য", "Other": "অন্যান্য",
"Overview": "বিবরণ",
"Password": "পাসওয়ার্ড", "Password": "পাসওয়ার্ড",
"PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)", "PDF document (.pdf)": "PDF ডকুমেন্ট (.pdf)",
"PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)", "PDF Extract Images (OCR)": "পিডিএফ এর ছবি থেকে লেখা বের করুন (OCR)",
...@@ -361,6 +363,7 @@ ...@@ -361,6 +363,7 @@
"Scan for documents from {{path}}": "ডকুমেন্টসমূহের জন্য {{path}} স্ক্যান করুন", "Scan for documents from {{path}}": "ডকুমেন্টসমূহের জন্য {{path}} স্ক্যান করুন",
"Search": "অনুসন্ধান", "Search": "অনুসন্ধান",
"Search a model": "মডেল অনুসন্ধান করুন", "Search a model": "মডেল অনুসন্ধান করুন",
"Search Chats": "",
"Search Documents": "ডকুমেন্টসমূহ অনুসন্ধান করুন", "Search Documents": "ডকুমেন্টসমূহ অনুসন্ধান করুন",
"Search Models": "", "Search Models": "",
"Search Prompts": "প্রম্পটসমূহ অনুসন্ধান করুন", "Search Prompts": "প্রম্পটসমূহ অনুসন্ধান করুন",
...@@ -444,6 +447,7 @@ ...@@ -444,6 +447,7 @@
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Ollama এক্সেস করতে সমস্যা হচ্ছে?", "Trouble accessing Ollama?": "Ollama এক্সেস করতে সমস্যা হচ্ছে?",
"TTS Settings": "TTS সেটিংসমূহ", "TTS Settings": "TTS সেটিংসমূহ",
"Type": "",
"Type Hugging Face Resolve (Download) URL": "Hugging Face থেকে ডাউনলোড করার ইউআরএল টাইপ করুন", "Type Hugging Face Resolve (Download) URL": "Hugging Face থেকে ডাউনলোড করার ইউআরএল টাইপ করুন",
"Uh-oh! There was an issue connecting to {{provider}}.": "ওহ-হো! {{provider}} এর সাথে কানেকশনে সমস্যা হয়েছে।", "Uh-oh! There was an issue connecting to {{provider}}.": "ওহ-হো! {{provider}} এর সাথে কানেকশনে সমস্যা হয়েছে।",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "অপরিচিত ফাইল ফরম্যাট '{{file_type}}', তবে প্লেইন টেক্সট হিসেবে গ্রহণ করা হলো", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "অপরিচিত ফাইল ফরম্যাট '{{file_type}}', তবে প্লেইন টেক্সট হিসেবে গ্রহণ করা হলো",
...@@ -464,6 +468,7 @@ ...@@ -464,6 +468,7 @@
"variable": "ভেরিয়েবল", "variable": "ভেরিয়েবল",
"variable to have them replaced with clipboard content.": "ক্লিপবোর্ডের কন্টেন্ট দিয়ে যেই ভেরিয়েবল রিপ্লেস করা যাবে।", "variable to have them replaced with clipboard content.": "ক্লিপবোর্ডের কন্টেন্ট দিয়ে যেই ভেরিয়েবল রিপ্লেস করা যাবে।",
"Version": "ভার্সন", "Version": "ভার্সন",
"Warning": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "সতর্কীকরণ: আপনি যদি আপনার এম্বেডিং মডেল আপডেট বা পরিবর্তন করেন, তাহলে আপনাকে সমস্ত নথি পুনরায় আমদানি করতে হবে।.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "সতর্কীকরণ: আপনি যদি আপনার এম্বেডিং মডেল আপডেট বা পরিবর্তন করেন, তাহলে আপনাকে সমস্ত নথি পুনরায় আমদানি করতে হবে।.",
"Web": "ওয়েব", "Web": "ওয়েব",
"Web Loader Settings": "ওয়েব লোডার সেটিংস", "Web Loader Settings": "ওয়েব লোডার সেটিংস",
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
"API keys": "Claus de l'API", "API keys": "Claus de l'API",
"April": "Abril", "April": "Abril",
"Archive": "Arxiu", "Archive": "Arxiu",
"Archive All Chats": "",
"Archived Chats": "Arxiu d'historial de xat", "Archived Chats": "Arxiu d'historial de xat",
"are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint", "are allowed - Activate this command by typing": "estan permesos - Activa aquesta comanda escrivint",
"Are you sure?": "Estàs segur?", "Are you sure?": "Estàs segur?",
...@@ -61,6 +62,7 @@ ...@@ -61,6 +62,7 @@
"available!": "disponible!", "available!": "disponible!",
"Back": "Enrere", "Back": "Enrere",
"Bad Response": "Resposta Erroni", "Bad Response": "Resposta Erroni",
"Banners": "",
"Base Model (From)": "", "Base Model (From)": "",
"before": "abans", "before": "abans",
"Being lazy": "Ser l'estupidez", "Being lazy": "Ser l'estupidez",
...@@ -119,7 +121,6 @@ ...@@ -119,7 +121,6 @@
"Custom": "Personalitzat", "Custom": "Personalitzat",
"Customize models for a specific purpose": "", "Customize models for a specific purpose": "",
"Dark": "Fosc", "Dark": "Fosc",
"Dashboard": "Tauler",
"Database": "Base de Dades", "Database": "Base de Dades",
"December": "Desembre", "December": "Desembre",
"Default": "Per defecte", "Default": "Per defecte",
...@@ -187,6 +188,7 @@ ...@@ -187,6 +188,7 @@
"Enter Your Full Name": "Introdueix el Teu Nom Complet", "Enter Your Full Name": "Introdueix el Teu Nom Complet",
"Enter Your Password": "Introdueix la Teva Contrasenya", "Enter Your Password": "Introdueix la Teva Contrasenya",
"Enter Your Role": "Introdueix el Teu Ròl", "Enter Your Role": "Introdueix el Teu Ròl",
"Error": "",
"Experimental": "Experimental", "Experimental": "Experimental",
"Export All Chats (All Users)": "Exporta Tots els Xats (Tots els Usuaris)", "Export All Chats (All Users)": "Exporta Tots els Xats (Tots els Usuaris)",
"Export Chats": "Exporta Xats", "Export Chats": "Exporta Xats",
...@@ -226,6 +228,7 @@ ...@@ -226,6 +228,7 @@
"Import Models": "", "Import Models": "",
"Import Prompts": "Importa Prompts", "Import Prompts": "Importa Prompts",
"Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui", "Include `--api` flag when running stable-diffusion-webui": "Inclou la bandera `--api` quan executis stable-diffusion-webui",
"Info": "",
"Input commands": "Entra ordres", "Input commands": "Entra ordres",
"Interface": "Interfície", "Interface": "Interfície",
"Invalid Tag": "Etiqueta Inválida", "Invalid Tag": "Etiqueta Inválida",
...@@ -310,7 +313,6 @@ ...@@ -310,7 +313,6 @@
"OpenAI URL/Key required.": "URL/Clau d'OpenAI requerides.", "OpenAI URL/Key required.": "URL/Clau d'OpenAI requerides.",
"or": "o", "or": "o",
"Other": "Altres", "Other": "Altres",
"Overview": "Visió general",
"Password": "Contrasenya", "Password": "Contrasenya",
"PDF document (.pdf)": "Document PDF (.pdf)", "PDF document (.pdf)": "Document PDF (.pdf)",
"PDF Extract Images (OCR)": "Extreu Imatges de PDF (OCR)", "PDF Extract Images (OCR)": "Extreu Imatges de PDF (OCR)",
...@@ -361,6 +363,7 @@ ...@@ -361,6 +363,7 @@
"Scan for documents from {{path}}": "Escaneja documents des de {{path}}", "Scan for documents from {{path}}": "Escaneja documents des de {{path}}",
"Search": "Cerca", "Search": "Cerca",
"Search a model": "Cerca un model", "Search a model": "Cerca un model",
"Search Chats": "",
"Search Documents": "Cerca Documents", "Search Documents": "Cerca Documents",
"Search Models": "", "Search Models": "",
"Search Prompts": "Cerca Prompts", "Search Prompts": "Cerca Prompts",
...@@ -444,6 +447,7 @@ ...@@ -444,6 +447,7 @@
"Top P": "Top P", "Top P": "Top P",
"Trouble accessing Ollama?": "Problemes accedint a Ollama?", "Trouble accessing Ollama?": "Problemes accedint a Ollama?",
"TTS Settings": "Configuracions TTS", "TTS Settings": "Configuracions TTS",
"Type": "",
"Type Hugging Face Resolve (Download) URL": "Escriu URL de Resolució (Descàrrega) de Hugging Face", "Type Hugging Face Resolve (Download) URL": "Escriu URL de Resolució (Descàrrega) de Hugging Face",
"Uh-oh! There was an issue connecting to {{provider}}.": "Uf! Hi va haver un problema connectant-se a {{provider}}.", "Uh-oh! There was an issue connecting to {{provider}}.": "Uf! Hi va haver un problema connectant-se a {{provider}}.",
"Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipus d'Arxiu Desconegut '{{file_type}}', però acceptant i tractant com a text pla", "Unknown File Type '{{file_type}}', but accepting and treating as plain text": "Tipus d'Arxiu Desconegut '{{file_type}}', però acceptant i tractant com a text pla",
...@@ -464,6 +468,7 @@ ...@@ -464,6 +468,7 @@
"variable": "variable", "variable": "variable",
"variable to have them replaced with clipboard content.": "variable per tenir-les reemplaçades amb el contingut del porta-retalls.", "variable to have them replaced with clipboard content.": "variable per tenir-les reemplaçades amb el contingut del porta-retalls.",
"Version": "Versió", "Version": "Versió",
"Warning": "",
"Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avís: Si actualitzeu o canvieu el model d'incrustació, haureu de tornar a importar tots els documents.", "Warning: If you update or change your embedding model, you will need to re-import all documents.": "Avís: Si actualitzeu o canvieu el model d'incrustació, haureu de tornar a importar tots els documents.",
"Web": "Web", "Web": "Web",
"Web Loader Settings": "Configuració del carregador web", "Web Loader Settings": "Configuració del carregador web",
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment