Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6c70d0f770 | ||
|
|
96e2ee48f7 | ||
|
|
63e7246c97 | ||
|
|
6f4a863562 | ||
|
|
a7ae141301 | ||
|
|
2564b154fc | ||
|
|
8310392c9d | ||
|
|
78d9c469a2 | ||
|
|
e5c812f1d2 | ||
|
|
8461b92f08 | ||
|
|
3396723057 | ||
|
|
4fe47f43be | ||
|
|
705f5aecd7 | ||
|
|
19d49df76f | ||
|
|
30c94ff10f | ||
|
|
941ab5d6cf | ||
|
|
5a81ca7e39 | ||
|
|
f4122fd0ce | ||
|
|
5745b9c5db | ||
|
|
3fd55ebc32 | ||
|
|
776b463ff3 | ||
|
|
5640b38694 | ||
|
|
a181b2b63b | ||
|
|
32361dc3da | ||
|
|
59ae5b6d34 | ||
|
|
a36627cbce | ||
|
|
8a63d22000 | ||
|
|
781be2779b | ||
|
|
f347d664ac | ||
|
|
260a8b8b83 | ||
|
|
1d4d1ddbea | ||
|
|
8f2d580991 | ||
|
|
6bbc3721b4 | ||
|
|
7fe412374c | ||
|
|
03210c9204 | ||
|
|
d24b6fa9af | ||
|
|
7c7e16c382 | ||
|
|
70f807e8c9 | ||
|
|
210ae331cc | ||
|
|
bbeaa92904 | ||
|
|
a7a817d12b | ||
|
|
0f6bdaa602 | ||
|
|
a016171573 | ||
|
|
7d0d504390 | ||
|
|
6bc627bbfb | ||
|
|
5adff7767f |
No files matched your search
@@ -5,6 +5,36 @@ 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/),
|
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).
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [0.1.107] - 2024-03-01
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- **🚀 Makefile and LLM Update Script**: Included Makefile and a script for LLM updates in the repository.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Corrected issue where links in the settings modal didn't appear clickable (#960).
|
||||||
|
- Fixed problem with web UI port not taking effect due to incorrect environment variable name in run-compose.sh (#996).
|
||||||
|
- Enhanced user experience by displaying chat in browser title and enabling automatic scrolling to the bottom (#992).
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Upgraded toast library from `svelte-french-toast` to `svelte-sonner` for a more polished UI.
|
||||||
|
- Enhanced accessibility with the addition of dark mode on the authentication page.
|
||||||
|
|
||||||
|
## [0.1.106] - 2024-02-27
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- **🎯 Auto-focus Feature**: The input area now automatically focuses when initiating or opening a chat conversation.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Corrected typo from "HuggingFace" to "Hugging Face" (Issue #924).
|
||||||
|
- Resolved bug causing errors in chat completion API calls to OpenAI due to missing "num_ctx" parameter (Issue #927).
|
||||||
|
- Fixed issues preventing text editing, selection, and cursor retention in the input field (Issue #940).
|
||||||
|
- Fixed a bug where defining an OpenAI-compatible API server using 'OPENAI_API_BASE_URL' containing 'openai' string resulted in hiding models not containing 'gpt' string from the model menu. (Issue #930)
|
||||||
|
|
||||||
## [0.1.105] - 2024-02-25
|
## [0.1.105] - 2024-02-25
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
install:
|
||||||
|
@docker-compose up -d
|
||||||
|
|
||||||
|
remove:
|
||||||
|
@chmod +x confirm_remove.sh
|
||||||
|
@./confirm_remove.sh
|
||||||
|
|
||||||
|
|
||||||
|
start:
|
||||||
|
@docker-compose start
|
||||||
|
|
||||||
|
stop:
|
||||||
|
@docker-compose stop
|
||||||
|
|
||||||
|
update:
|
||||||
|
# Calls the LLM update script
|
||||||
|
chmod +x update_ollama_models.sh
|
||||||
|
@./update_ollama_models.sh
|
||||||
|
@git pull
|
||||||
|
@docker-compose down
|
||||||
|
# Make sure the ollama-webui container is stopped before rebuilding
|
||||||
|
@docker stop open-webui || true
|
||||||
|
@docker-compose up --build -d
|
||||||
|
@docker-compose start
|
||||||
|
|
||||||
@@ -160,6 +160,16 @@ This project is licensed under the [MIT License](LICENSE) - see the [LICENSE](LI
|
|||||||
If you have any questions, suggestions, or need assistance, please open an issue or join our
|
If you have any questions, suggestions, or need assistance, please open an issue or join our
|
||||||
[Open WebUI Discord community](https://discord.gg/5rJgQTnV4s) to connect with us! 🤝
|
[Open WebUI Discord community](https://discord.gg/5rJgQTnV4s) to connect with us! 🤝
|
||||||
|
|
||||||
|
## Star History
|
||||||
|
|
||||||
|
<a href="https://star-history.com/#open-webui/open-webui&Date">
|
||||||
|
<picture>
|
||||||
|
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=open-webui/open-webui&type=Date&theme=dark" />
|
||||||
|
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=open-webui/open-webui&type=Date" />
|
||||||
|
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=open-webui/open-webui&type=Date" />
|
||||||
|
</picture>
|
||||||
|
</a>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Created by [Timothy J. Baek](https://github.com/tjbck) - Let's make Open Web UI even more amazing together! 💪
|
Created by [Timothy J. Baek](https://github.com/tjbck) - Let's make Open Web UI even more amazing together! 💪
|
||||||
@@ -146,6 +146,13 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
|
|||||||
body["max_tokens"] = 4000
|
body["max_tokens"] = 4000
|
||||||
print("Modified body_dict:", body)
|
print("Modified body_dict:", body)
|
||||||
|
|
||||||
|
# Fix for ChatGPT calls failing because the num_ctx key is in body
|
||||||
|
if "num_ctx" in body:
|
||||||
|
# If 'num_ctx' is in the dictionary, delete it
|
||||||
|
# Leaving it there generates an error with the
|
||||||
|
# OpenAI API (Feb 2024)
|
||||||
|
del body["num_ctx"]
|
||||||
|
|
||||||
# Convert the modified body back to JSON
|
# Convert the modified body back to JSON
|
||||||
body = json.dumps(body)
|
body = json.dumps(body)
|
||||||
except json.JSONDecodeError as e:
|
except json.JSONDecodeError as e:
|
||||||
@@ -184,7 +191,7 @@ async def proxy(path: str, request: Request, user=Depends(get_verified_user)):
|
|||||||
|
|
||||||
response_data = r.json()
|
response_data = r.json()
|
||||||
|
|
||||||
if "openai" in app.state.OPENAI_API_BASE_URL and path == "models":
|
if "api.openai.com" in app.state.OPENAI_API_BASE_URL and path == "models":
|
||||||
response_data["data"] = list(
|
response_data["data"] = list(
|
||||||
filter(lambda model: "gpt" in model["id"], response_data["data"])
|
filter(lambda model: "gpt" in model["id"], response_data["data"])
|
||||||
)
|
)
|
||||||
|
|||||||
Executable
+8
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
echo "Warning: This will remove all containers and volumes, including persistent data. Do you want to continue? [Y/N]"
|
||||||
|
read ans
|
||||||
|
if [ "$ans" == "Y" ] || [ "$ans" == "y" ]; then
|
||||||
|
docker-compose down -v
|
||||||
|
else
|
||||||
|
echo "Operation cancelled."
|
||||||
|
fi
|
||||||
Generated
+12
-34
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "open-webui",
|
"name": "open-webui",
|
||||||
"version": "v1.0.0-alpha.101",
|
"version": "0.1.106",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "open-webui",
|
"name": "open-webui",
|
||||||
"version": "v1.0.0-alpha.101",
|
"version": "0.1.106",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@sveltejs/adapter-node": "^1.3.1",
|
"@sveltejs/adapter-node": "^1.3.1",
|
||||||
"async": "^3.2.5",
|
"async": "^3.2.5",
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
"js-sha256": "^0.10.1",
|
"js-sha256": "^0.10.1",
|
||||||
"katex": "^0.16.9",
|
"katex": "^0.16.9",
|
||||||
"marked": "^9.1.0",
|
"marked": "^9.1.0",
|
||||||
"svelte-french-toast": "^1.2.0",
|
"svelte-sonner": "^0.3.19",
|
||||||
"tippy.js": "^6.3.7",
|
"tippy.js": "^6.3.7",
|
||||||
"uuid": "^9.0.1"
|
"uuid": "^9.0.1"
|
||||||
},
|
},
|
||||||
@@ -3211,17 +3211,6 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/svelte-french-toast": {
|
|
||||||
"version": "1.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/svelte-french-toast/-/svelte-french-toast-1.2.0.tgz",
|
|
||||||
"integrity": "sha512-5PW+6RFX3xQPbR44CngYAP1Sd9oCq9P2FOox4FZffzJuZI2mHOB7q5gJBVnOiLF5y3moVGZ7u2bYt7+yPAgcEQ==",
|
|
||||||
"dependencies": {
|
|
||||||
"svelte-writable-derived": "^3.1.0"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"svelte": "^3.57.0 || ^4.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/svelte-hmr": {
|
"node_modules/svelte-hmr": {
|
||||||
"version": "0.15.3",
|
"version": "0.15.3",
|
||||||
"resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz",
|
"resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz",
|
||||||
@@ -3307,15 +3296,12 @@
|
|||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/svelte-writable-derived": {
|
"node_modules/svelte-sonner": {
|
||||||
"version": "3.1.0",
|
"version": "0.3.19",
|
||||||
"resolved": "https://registry.npmjs.org/svelte-writable-derived/-/svelte-writable-derived-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/svelte-sonner/-/svelte-sonner-0.3.19.tgz",
|
||||||
"integrity": "sha512-cTvaVFNIJ036vSDIyPxJYivKC7ZLtcFOPm1Iq6qWBDo1fOHzfk6ZSbwaKrxhjgy52Rbl5IHzRcWgos6Zqn9/rg==",
|
"integrity": "sha512-jpPOgLtHwRaB6Vqo2dUQMv15/yUV/BQWTjKpEqQ11uqRSHKjAYUKZyGrHB2cQsGmyjR0JUzBD58btpgNqINQ/Q==",
|
||||||
"funding": {
|
|
||||||
"url": "https://ko-fi.com/pixievoltno1"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"svelte": "^3.2.1 || ^4.0.0-next.1"
|
"svelte": ">=3 <5"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/tailwindcss": {
|
"node_modules/tailwindcss": {
|
||||||
@@ -5882,14 +5868,6 @@
|
|||||||
"postcss-scss": "^4.0.8"
|
"postcss-scss": "^4.0.8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"svelte-french-toast": {
|
|
||||||
"version": "1.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/svelte-french-toast/-/svelte-french-toast-1.2.0.tgz",
|
|
||||||
"integrity": "sha512-5PW+6RFX3xQPbR44CngYAP1Sd9oCq9P2FOox4FZffzJuZI2mHOB7q5gJBVnOiLF5y3moVGZ7u2bYt7+yPAgcEQ==",
|
|
||||||
"requires": {
|
|
||||||
"svelte-writable-derived": "^3.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"svelte-hmr": {
|
"svelte-hmr": {
|
||||||
"version": "0.15.3",
|
"version": "0.15.3",
|
||||||
"resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz",
|
"resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.15.3.tgz",
|
||||||
@@ -5920,10 +5898,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"svelte-writable-derived": {
|
"svelte-sonner": {
|
||||||
"version": "3.1.0",
|
"version": "0.3.19",
|
||||||
"resolved": "https://registry.npmjs.org/svelte-writable-derived/-/svelte-writable-derived-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/svelte-sonner/-/svelte-sonner-0.3.19.tgz",
|
||||||
"integrity": "sha512-cTvaVFNIJ036vSDIyPxJYivKC7ZLtcFOPm1Iq6qWBDo1fOHzfk6ZSbwaKrxhjgy52Rbl5IHzRcWgos6Zqn9/rg==",
|
"integrity": "sha512-jpPOgLtHwRaB6Vqo2dUQMv15/yUV/BQWTjKpEqQ11uqRSHKjAYUKZyGrHB2cQsGmyjR0JUzBD58btpgNqINQ/Q==",
|
||||||
"requires": {}
|
"requires": {}
|
||||||
},
|
},
|
||||||
"tailwindcss": {
|
"tailwindcss": {
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "open-webui",
|
"name": "open-webui",
|
||||||
"version": "0.1.105",
|
"version": "0.1.107",
|
||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite dev --host",
|
"dev": "vite dev --host",
|
||||||
@@ -49,7 +49,7 @@
|
|||||||
"js-sha256": "^0.10.1",
|
"js-sha256": "^0.10.1",
|
||||||
"katex": "^0.16.9",
|
"katex": "^0.16.9",
|
||||||
"marked": "^9.1.0",
|
"marked": "^9.1.0",
|
||||||
"svelte-french-toast": "^1.2.0",
|
"svelte-sonner": "^0.3.19",
|
||||||
"tippy.js": "^6.3.7",
|
"tippy.js": "^6.3.7",
|
||||||
"uuid": "^9.0.1"
|
"uuid": "^9.0.1"
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -182,7 +182,7 @@ else
|
|||||||
export OLLAMA_DATA_DIR=$data_dir # Set OLLAMA_DATA_DIR environment variable
|
export OLLAMA_DATA_DIR=$data_dir # Set OLLAMA_DATA_DIR environment variable
|
||||||
fi
|
fi
|
||||||
if [[ -n $webui_port ]]; then
|
if [[ -n $webui_port ]]; then
|
||||||
export OLLAMA_WEBUI_PORT=$webui_port # Set OLLAMA_WEBUI_PORT environment variable
|
export OPEN_WEBUI_PORT=$webui_port # Set OPEN_WEBUI_PORT environment variable
|
||||||
fi
|
fi
|
||||||
DEFAULT_COMPOSE_COMMAND+=" up -d"
|
DEFAULT_COMPOSE_COMMAND+=" up -d"
|
||||||
DEFAULT_COMPOSE_COMMAND+=" --remove-orphans"
|
DEFAULT_COMPOSE_COMMAND+=" --remove-orphans"
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import { createEventDispatcher } from 'svelte';
|
import { createEventDispatcher } from 'svelte';
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import { onMount, tick } from 'svelte';
|
import { onMount, tick } from 'svelte';
|
||||||
import { settings } from '$lib/stores';
|
import { settings } from '$lib/stores';
|
||||||
import { blobToFile, calculateSHA256, findWordIndices } from '$lib/utils';
|
import { blobToFile, calculateSHA256, findWordIndices } from '$lib/utils';
|
||||||
@@ -293,6 +293,9 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
|
const chatInput = document.getElementById('chat-textarea');
|
||||||
|
window.setTimeout(() => chatInput?.focus(), 0);
|
||||||
|
|
||||||
const dropZone = document.querySelector('body');
|
const dropZone = document.querySelector('body');
|
||||||
|
|
||||||
const onDragOver = (e) => {
|
const onDragOver = (e) => {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
import { documents } from '$lib/stores';
|
import { documents } from '$lib/stores';
|
||||||
import { removeFirstHashWord, isValidHttpUrl } from '$lib/utils';
|
import { removeFirstHashWord, isValidHttpUrl } from '$lib/utils';
|
||||||
import { tick } from 'svelte';
|
import { tick } from 'svelte';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
export let prompt = '';
|
export let prompt = '';
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
import { models } from '$lib/stores';
|
import { models } from '$lib/stores';
|
||||||
import { splitStream } from '$lib/utils';
|
import { splitStream } from '$lib/utils';
|
||||||
import { tick } from 'svelte';
|
import { tick } from 'svelte';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
export let prompt = '';
|
export let prompt = '';
|
||||||
export let user = null;
|
export let user = null;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import { prompts } from '$lib/stores';
|
import { prompts } from '$lib/stores';
|
||||||
import { findWordIndices } from '$lib/utils';
|
import { findWordIndices } from '$lib/utils';
|
||||||
import { tick } from 'svelte';
|
import { tick } from 'svelte';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
export let prompt = '';
|
export let prompt = '';
|
||||||
let selectedCommandIdx = 0;
|
let selectedCommandIdx = 0;
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
import { chats, config, modelfiles, settings, user } from '$lib/stores';
|
import { chats, config, modelfiles, settings, user } from '$lib/stores';
|
||||||
import { tick } from 'svelte';
|
import { tick } from 'svelte';
|
||||||
|
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import { getChatList, updateChatById } from '$lib/apis/chats';
|
import { getChatList, updateChatById } from '$lib/apis/chats';
|
||||||
|
|
||||||
import UserMessage from './Messages/UserMessage.svelte';
|
import UserMessage from './Messages/UserMessage.svelte';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import { marked } from 'marked';
|
import { marked } from 'marked';
|
||||||
import tippy from 'tippy.js';
|
import tippy from 'tippy.js';
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import { setDefaultModels } from '$lib/apis/configs';
|
import { setDefaultModels } from '$lib/apis/configs';
|
||||||
import { models, showSettings, settings, user } from '$lib/stores';
|
import { models, showSettings, settings, user } from '$lib/stores';
|
||||||
import { onMount, tick } from 'svelte';
|
import { onMount, tick } from 'svelte';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
export let selectedModels = [''];
|
export let selectedModels = [''];
|
||||||
export let disabled = false;
|
export let disabled = false;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
|
|
||||||
import { user } from '$lib/stores';
|
import { user } from '$lib/stores';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import { updateUserPassword } from '$lib/apis/auths';
|
import { updateUserPassword } from '$lib/apis/auths';
|
||||||
|
|
||||||
let show = false;
|
let show = false;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { createEventDispatcher, onMount } from 'svelte';
|
import { createEventDispatcher, onMount } from 'svelte';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
export let saveSettings: Function;
|
export let saveSettings: Function;
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
import { getImportOrigin, convertOpenAIChats } from '$lib/utils';
|
import { getImportOrigin, convertOpenAIChats } from '$lib/utils';
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
export let saveSettings: Function;
|
export let saveSettings: Function;
|
||||||
// Chats
|
// Chats
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
import { getOllamaAPIUrl, getOllamaVersion, updateOllamaAPIUrl } from '$lib/apis/ollama';
|
import { getOllamaAPIUrl, getOllamaVersion, updateOllamaAPIUrl } from '$lib/apis/ollama';
|
||||||
import { getOpenAIKey, getOpenAIUrl, updateOpenAIKey, updateOpenAIUrl } from '$lib/apis/openai';
|
import { getOpenAIKey, getOpenAIUrl, updateOpenAIKey, updateOpenAIUrl } from '$lib/apis/openai';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
export let getModels: Function;
|
export let getModels: Function;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import { createEventDispatcher, onMount } from 'svelte';
|
import { createEventDispatcher, onMount } from 'svelte';
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
import { createEventDispatcher, onMount } from 'svelte';
|
import { createEventDispatcher, onMount } from 'svelte';
|
||||||
import { config, user } from '$lib/stores';
|
import { config, user } from '$lib/stores';
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
import { setDefaultPromptSuggestions } from '$lib/apis/configs';
|
import { setDefaultPromptSuggestions } from '$lib/apis/configs';
|
||||||
import { config, models, user } from '$lib/stores';
|
import { config, models, user } from '$lib/stores';
|
||||||
import { createEventDispatcher, onMount } from 'svelte';
|
import { createEventDispatcher, onMount } from 'svelte';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
|
|
||||||
export let saveSettings: Function;
|
export let saveSettings: Function;
|
||||||
@@ -191,10 +191,12 @@
|
|||||||
placeholder="Select a model"
|
placeholder="Select a model"
|
||||||
>
|
>
|
||||||
<option value="" selected>Current Model</option>
|
<option value="" selected>Current Model</option>
|
||||||
{#each $models.filter((m) => m.size != null) as model}
|
{#each $models as model}
|
||||||
<option value={model.name} class="bg-gray-100 dark:bg-gray-700"
|
{#if model.size != null}
|
||||||
>{model.name + ' (' + (model.size / 1024 ** 3).toFixed(1) + ' GB)'}</option
|
<option value={model.name} class="bg-gray-100 dark:bg-gray-700">
|
||||||
>
|
{model.name + ' (' + (model.size / 1024 ** 3).toFixed(1) + ' GB)'}
|
||||||
|
</option>
|
||||||
|
{/if}
|
||||||
{/each}
|
{/each}
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import queue from 'async/queue';
|
import queue from 'async/queue';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
import { createModel, deleteModel, getOllamaVersion, pullModel } from '$lib/apis/ollama';
|
import { createModel, deleteModel, getOllamaVersion, pullModel } from '$lib/apis/ollama';
|
||||||
import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
|
import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
|
||||||
@@ -432,7 +432,7 @@
|
|||||||
|
|
||||||
<div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500">
|
<div class="mt-2 mb-1 text-xs text-gray-400 dark:text-gray-500">
|
||||||
To access the available model names for downloading, <a
|
To access the available model names for downloading, <a
|
||||||
class=" text-gray-500 dark:text-gray-300 font-medium"
|
class=" text-gray-500 dark:text-gray-300 font-medium underline"
|
||||||
href="https://ollama.com/library"
|
href="https://ollama.com/library"
|
||||||
target="_blank">click here.</a
|
target="_blank">click here.</a
|
||||||
>
|
>
|
||||||
@@ -580,7 +580,7 @@
|
|||||||
type="url"
|
type="url"
|
||||||
required
|
required
|
||||||
bind:value={modelFileUrl}
|
bind:value={modelFileUrl}
|
||||||
placeholder="Type HuggingFace Resolve (Download) URL"
|
placeholder="Type Hugging Face Resolve (Download) URL"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
{/if}
|
{/if}
|
||||||
@@ -651,7 +651,7 @@
|
|||||||
{/if}
|
{/if}
|
||||||
<div class=" mt-1 text-xs text-gray-400 dark:text-gray-500">
|
<div class=" mt-1 text-xs text-gray-400 dark:text-gray-500">
|
||||||
To access the GGUF models available for downloading, <a
|
To access the GGUF models available for downloading, <a
|
||||||
class=" text-gray-500 dark:text-gray-300 font-medium"
|
class=" text-gray-500 dark:text-gray-300 font-medium underline"
|
||||||
href="https://huggingface.co/models?search=gguf"
|
href="https://huggingface.co/models?search=gguf"
|
||||||
target="_blank">click here.</a
|
target="_blank">click here.</a
|
||||||
>
|
>
|
||||||
@@ -790,7 +790,7 @@
|
|||||||
<div class="mb-2 text-xs text-gray-400 dark:text-gray-500">
|
<div class="mb-2 text-xs text-gray-400 dark:text-gray-500">
|
||||||
Not sure what to add?
|
Not sure what to add?
|
||||||
<a
|
<a
|
||||||
class=" text-gray-300 font-medium"
|
class=" text-gray-300 font-medium underline"
|
||||||
href="https://litellm.vercel.app/docs/proxy/configs#quick-start"
|
href="https://litellm.vercel.app/docs/proxy/configs#quick-start"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>
|
>
|
||||||
@@ -913,7 +913,7 @@
|
|||||||
<div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
|
<div class="mt-2 text-xs text-gray-400 dark:text-gray-500">
|
||||||
Not sure what to add?
|
Not sure what to add?
|
||||||
<a
|
<a
|
||||||
class=" text-gray-300 font-medium"
|
class=" text-gray-300 font-medium underline"
|
||||||
href="https://litellm.vercel.app/docs/proxy/configs#quick-start"
|
href="https://litellm.vercel.app/docs/proxy/configs#quick-start"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import { models, settings, user } from '$lib/stores';
|
import { models, settings, user } from '$lib/stores';
|
||||||
|
|
||||||
import { getOllamaModels } from '$lib/apis/ollama';
|
import { getOllamaModels } from '$lib/apis/ollama';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import dayjs from 'dayjs';
|
import dayjs from 'dayjs';
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
} from '$lib/apis/rag';
|
} from '$lib/apis/rag';
|
||||||
import { documents } from '$lib/stores';
|
import { documents } from '$lib/stores';
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
export let saveHandler: Function;
|
export let saveHandler: Function;
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import fileSaver from 'file-saver';
|
import fileSaver from 'file-saver';
|
||||||
const { saveAs } = fileSaver;
|
const { saveAs } = fileSaver;
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
updateChatById,
|
updateChatById,
|
||||||
getAllChatTags
|
getAllChatTags
|
||||||
} from '$lib/apis/chats';
|
} from '$lib/apis/chats';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import { slide } from 'svelte/transition';
|
import { slide } from 'svelte/transition';
|
||||||
import { WEBUI_BASE_URL } from '$lib/constants';
|
import { WEBUI_BASE_URL } from '$lib/constants';
|
||||||
|
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
let chatTitle = '';
|
let chatTitle = '';
|
||||||
|
|
||||||
let showDropdown = false;
|
let showDropdown = false;
|
||||||
|
let isEditing = false;
|
||||||
|
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
if (window.innerWidth > 1280) {
|
if (window.innerWidth > 1280) {
|
||||||
@@ -101,17 +102,16 @@
|
|||||||
: 'invisible'}"
|
: 'invisible'}"
|
||||||
>
|
>
|
||||||
<div class="px-2 flex justify-center space-x-2">
|
<div class="px-2 flex justify-center space-x-2">
|
||||||
<button
|
<a
|
||||||
id="sidebar-new-chat-button"
|
id="sidebar-new-chat-button"
|
||||||
class="flex-grow flex justify-between rounded-xl px-3.5 py-2 hover:bg-gray-900 transition"
|
class="flex-grow flex justify-between rounded-xl px-3.5 py-2 hover:bg-gray-900 transition"
|
||||||
|
href="/"
|
||||||
on:click={async () => {
|
on:click={async () => {
|
||||||
goto('/');
|
await goto('/');
|
||||||
|
|
||||||
const newChatButton = document.getElementById('new-chat-button');
|
const newChatButton = document.getElementById('new-chat-button');
|
||||||
|
setTimeout(() => {
|
||||||
if (newChatButton) {
|
newChatButton?.click();
|
||||||
newChatButton.click();
|
}, 0);
|
||||||
}
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div class="flex self-center">
|
<div class="flex self-center">
|
||||||
@@ -141,7 +141,7 @@
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</div>
|
</div>
|
||||||
</button>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{#if $user?.role === 'admin'}
|
{#if $user?.role === 'admin'}
|
||||||
@@ -366,27 +366,34 @@
|
|||||||
}
|
}
|
||||||
}) as chat, i}
|
}) as chat, i}
|
||||||
<div class=" w-full pr-2 relative">
|
<div class=" w-full pr-2 relative">
|
||||||
<a
|
{#if chatTitleEditId === chat.id}
|
||||||
class=" w-full flex justify-between rounded-xl px-3 py-2 hover:bg-gray-900 {chat.id ===
|
<div
|
||||||
$chatId
|
class=" w-full flex justify-between rounded-xl px-3 py-2 hover:bg-gray-900 {chat.id ===
|
||||||
? 'bg-gray-900'
|
$chatId
|
||||||
: ''} transition whitespace-nowrap text-ellipsis"
|
? 'bg-gray-900'
|
||||||
href="/c/{chat.id}"
|
: ''} transition whitespace-nowrap text-ellipsis"
|
||||||
>
|
>
|
||||||
<div class=" flex self-center flex-1 w-full">
|
<input bind:value={chatTitle} class=" bg-transparent w-full outline-none mr-10" />
|
||||||
<div
|
|
||||||
class=" text-left self-center overflow-hidden {chat.id === $chatId
|
|
||||||
? 'w-[160px]'
|
|
||||||
: 'w-full'} "
|
|
||||||
>
|
|
||||||
{#if chatTitleEditId === chat.id}
|
|
||||||
<input bind:value={chatTitle} class=" bg-transparent w-full" />
|
|
||||||
{:else}
|
|
||||||
{chat.title}
|
|
||||||
{/if}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</a>
|
{:else}
|
||||||
|
<a
|
||||||
|
class=" w-full flex justify-between rounded-xl px-3 py-2 hover:bg-gray-900 {chat.id ===
|
||||||
|
$chatId
|
||||||
|
? 'bg-gray-900'
|
||||||
|
: ''} transition whitespace-nowrap text-ellipsis"
|
||||||
|
href="/c/{chat.id}"
|
||||||
|
>
|
||||||
|
<div class=" flex self-center flex-1 w-full">
|
||||||
|
<div
|
||||||
|
class=" text-left self-center overflow-hidden {chat.id === $chatId
|
||||||
|
? 'w-[160px]'
|
||||||
|
: 'w-full'} "
|
||||||
|
>
|
||||||
|
{chat.title}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
{/if}
|
||||||
|
|
||||||
{#if chat.id === $chatId}
|
{#if chat.id === $chatId}
|
||||||
<div class=" absolute right-[22px] top-[10px]">
|
<div class=" absolute right-[22px] top-[10px]">
|
||||||
@@ -485,7 +492,6 @@
|
|||||||
on:click={() => {
|
on:click={() => {
|
||||||
chatTitle = chat.title;
|
chatTitle = chat.title;
|
||||||
chatTitleEditId = chat.id;
|
chatTitleEditId = chat.id;
|
||||||
// editChatTitle(chat.id, 'a');
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<svg
|
<svg
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import { openDB, deleteDB } from 'idb';
|
import { openDB, deleteDB } from 'idb';
|
||||||
import fileSaver from 'file-saver';
|
import fileSaver from 'file-saver';
|
||||||
const { saveAs } = fileSaver;
|
const { saveAs } = fileSaver;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
import { onMount, tick } from 'svelte';
|
import { onMount, tick } from 'svelte';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
chats,
|
chats,
|
||||||
chatId,
|
chatId,
|
||||||
config,
|
config,
|
||||||
|
WEBUI_NAME,
|
||||||
tags as _tags
|
tags as _tags
|
||||||
} from '$lib/stores';
|
} from '$lib/stores';
|
||||||
import { copyToClipboard, splitStream } from '$lib/utils';
|
import { copyToClipboard, splitStream } from '$lib/utils';
|
||||||
@@ -38,7 +39,6 @@
|
|||||||
import { RAGTemplate } from '$lib/utils/rag';
|
import { RAGTemplate } from '$lib/utils/rag';
|
||||||
import { LITELLM_API_BASE_URL, OPENAI_API_BASE_URL } from '$lib/constants';
|
import { LITELLM_API_BASE_URL, OPENAI_API_BASE_URL } from '$lib/constants';
|
||||||
import { WEBUI_BASE_URL } from '$lib/constants';
|
import { WEBUI_BASE_URL } from '$lib/constants';
|
||||||
|
|
||||||
let stopResponseFlag = false;
|
let stopResponseFlag = false;
|
||||||
let autoScroll = true;
|
let autoScroll = true;
|
||||||
let processing = '';
|
let processing = '';
|
||||||
@@ -134,6 +134,9 @@
|
|||||||
settings.set({
|
settings.set({
|
||||||
..._settings
|
..._settings
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const chatInput = document.getElementById('chat-textarea');
|
||||||
|
setTimeout(() => chatInput?.focus(), 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
const scrollToBottom = () => {
|
const scrollToBottom = () => {
|
||||||
@@ -806,6 +809,14 @@
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<svelte:head>
|
||||||
|
<title>
|
||||||
|
{title
|
||||||
|
? `${title.length > 30 ? `${title.slice(0, 30)}...` : title} | ${$WEBUI_NAME}`
|
||||||
|
: `${$WEBUI_NAME}`}
|
||||||
|
</title>
|
||||||
|
</svelte:head>
|
||||||
|
|
||||||
<div class="h-screen max-h-[100dvh] w-full flex flex-col">
|
<div class="h-screen max-h-[100dvh] w-full flex flex-col">
|
||||||
<Navbar {title} shareEnabled={messages.length > 0} {initNewChat} {tags} {addTag} {deleteTag} />
|
<Navbar {title} shareEnabled={messages.length > 0} {initNewChat} {tags} {addTag} {deleteTag} />
|
||||||
<div class="flex flex-col flex-auto">
|
<div class="flex flex-col flex-auto">
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<script>
|
<script>
|
||||||
import { WEBUI_API_BASE_URL } from '$lib/constants';
|
import { WEBUI_API_BASE_URL } from '$lib/constants';
|
||||||
import { config, user } from '$lib/stores';
|
import { WEBUI_NAME, config, user } from '$lib/stores';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
|
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
import { updateUserRole, getUsers, deleteUserById } from '$lib/apis/users';
|
import { updateUserRole, getUsers, deleteUserById } from '$lib/apis/users';
|
||||||
import { getSignUpEnabledStatus, toggleSignUpEnabledStatus } from '$lib/apis/auths';
|
import { getSignUpEnabledStatus, toggleSignUpEnabledStatus } from '$lib/apis/auths';
|
||||||
@@ -61,6 +61,12 @@
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<svelte:head>
|
||||||
|
<title>
|
||||||
|
{`Admin Panel | ${$WEBUI_NAME}`}
|
||||||
|
</title>
|
||||||
|
</svelte:head>
|
||||||
|
|
||||||
{#key selectedUser}
|
{#key selectedUser}
|
||||||
<EditUserModal
|
<EditUserModal
|
||||||
bind:show={showEditUserModal}
|
bind:show={showEditUserModal}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
import { onMount, tick } from 'svelte';
|
import { onMount, tick } from 'svelte';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
chats,
|
chats,
|
||||||
chatId,
|
chatId,
|
||||||
config,
|
config,
|
||||||
|
WEBUI_NAME,
|
||||||
tags as _tags
|
tags as _tags
|
||||||
} from '$lib/stores';
|
} from '$lib/stores';
|
||||||
import { copyToClipboard, splitStream, convertMessagesToHistory } from '$lib/utils';
|
import { copyToClipboard, splitStream, convertMessagesToHistory } from '$lib/utils';
|
||||||
@@ -37,7 +38,7 @@
|
|||||||
import ModelSelector from '$lib/components/chat/ModelSelector.svelte';
|
import ModelSelector from '$lib/components/chat/ModelSelector.svelte';
|
||||||
import Navbar from '$lib/components/layout/Navbar.svelte';
|
import Navbar from '$lib/components/layout/Navbar.svelte';
|
||||||
import { RAGTemplate } from '$lib/utils/rag';
|
import { RAGTemplate } from '$lib/utils/rag';
|
||||||
import { WEBUI_BASE_URL } from '$lib/constants';
|
import { LITELLM_API_BASE_URL, OPENAI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
|
||||||
|
|
||||||
let loaded = false;
|
let loaded = false;
|
||||||
|
|
||||||
@@ -99,6 +100,10 @@
|
|||||||
if (await loadChat()) {
|
if (await loadChat()) {
|
||||||
await tick();
|
await tick();
|
||||||
loaded = true;
|
loaded = true;
|
||||||
|
|
||||||
|
window.setTimeout(() => scrollToBottom(), 0);
|
||||||
|
const chatInput = document.getElementById('chat-textarea');
|
||||||
|
chatInput?.focus();
|
||||||
} else {
|
} else {
|
||||||
await goto('/');
|
await goto('/');
|
||||||
}
|
}
|
||||||
@@ -820,6 +825,14 @@
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<svelte:head>
|
||||||
|
<title>
|
||||||
|
{title
|
||||||
|
? `${title.length > 30 ? `${title.slice(0, 30)}...` : title} | ${$WEBUI_NAME}`
|
||||||
|
: `${$WEBUI_NAME}`}
|
||||||
|
</title>
|
||||||
|
</svelte:head>
|
||||||
|
|
||||||
{#if loaded}
|
{#if loaded}
|
||||||
<div class="min-h-screen max-h-screen w-full flex flex-col">
|
<div class="min-h-screen max-h-screen w-full flex flex-col">
|
||||||
<Navbar
|
<Navbar
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import fileSaver from 'file-saver';
|
import fileSaver from 'file-saver';
|
||||||
const { saveAs } = fileSaver;
|
const { saveAs } = fileSaver;
|
||||||
|
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import { documents } from '$lib/stores';
|
import { WEBUI_NAME, documents } from '$lib/stores';
|
||||||
import { createNewDoc, deleteDocByName, getDocs } from '$lib/apis/documents';
|
import { createNewDoc, deleteDocByName, getDocs } from '$lib/apis/documents';
|
||||||
|
|
||||||
import { SUPPORTED_FILE_TYPE, SUPPORTED_FILE_EXTENSIONS } from '$lib/constants';
|
import { SUPPORTED_FILE_TYPE, SUPPORTED_FILE_EXTENSIONS } from '$lib/constants';
|
||||||
@@ -148,6 +148,12 @@
|
|||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<svelte:head>
|
||||||
|
<title>
|
||||||
|
{`Documents | ${$WEBUI_NAME}`}
|
||||||
|
</title>
|
||||||
|
</svelte:head>
|
||||||
|
|
||||||
{#if dragged}
|
{#if dragged}
|
||||||
<div
|
<div
|
||||||
class="fixed w-full h-full flex z-50 touch-none pointer-events-none"
|
class="fixed w-full h-full flex z-50 touch-none pointer-events-none"
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import fileSaver from 'file-saver';
|
import fileSaver from 'file-saver';
|
||||||
const { saveAs } = fileSaver;
|
const { saveAs } = fileSaver;
|
||||||
|
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
|
|
||||||
import { modelfiles, settings, user } from '$lib/stores';
|
import { WEBUI_NAME, modelfiles, settings, user } from '$lib/stores';
|
||||||
import { createModel, deleteModel } from '$lib/apis/ollama';
|
import { createModel, deleteModel } from '$lib/apis/ollama';
|
||||||
import {
|
import {
|
||||||
createNewModelfile,
|
createNewModelfile,
|
||||||
@@ -69,6 +69,12 @@
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<svelte:head>
|
||||||
|
<title>
|
||||||
|
{`Modelfiles | ${$WEBUI_NAME}`}
|
||||||
|
</title>
|
||||||
|
</svelte:head>
|
||||||
|
|
||||||
<div class="min-h-screen max-h-[100dvh] w-full flex justify-center dark:text-white">
|
<div class="min-h-screen max-h-[100dvh] w-full flex justify-center dark:text-white">
|
||||||
<div class="flex flex-col justify-between w-full overflow-y-auto">
|
<div class="flex flex-col justify-between w-full overflow-y-auto">
|
||||||
<div class="max-w-2xl mx-auto w-full px-3 md:px-0 my-10">
|
<div class="max-w-2xl mx-auto w-full px-3 md:px-0 my-10">
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script>
|
<script>
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
import { toast } from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import { settings, user, config, modelfiles, models } from '$lib/stores';
|
import { settings, user, config, modelfiles, models } from '$lib/stores';
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script>
|
<script>
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { v4 as uuidv4 } from 'uuid';
|
||||||
import { toast } from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
|
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
import fileSaver from 'file-saver';
|
import fileSaver from 'file-saver';
|
||||||
const { saveAs } = fileSaver;
|
const { saveAs } = fileSaver;
|
||||||
|
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import { prompts } from '$lib/stores';
|
import { WEBUI_NAME, prompts } from '$lib/stores';
|
||||||
import { createNewPrompt, deletePromptByCommand, getPrompts } from '$lib/apis/prompts';
|
import { createNewPrompt, deletePromptByCommand, getPrompts } from '$lib/apis/prompts';
|
||||||
import { error } from '@sveltejs/kit';
|
import { error } from '@sveltejs/kit';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
@@ -36,6 +36,12 @@
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<svelte:head>
|
||||||
|
<title>
|
||||||
|
{`Prompts | ${$WEBUI_NAME}`}
|
||||||
|
</title>
|
||||||
|
</svelte:head>
|
||||||
|
|
||||||
<div class="min-h-screen max-h-[100dvh] w-full flex justify-center dark:text-white">
|
<div class="min-h-screen max-h-[100dvh] w-full flex justify-center dark:text-white">
|
||||||
<div class="flex flex-col justify-between w-full overflow-y-auto">
|
<div class="flex flex-col justify-between w-full overflow-y-auto">
|
||||||
<div class="max-w-2xl mx-auto w-full px-3 md:px-0 my-10">
|
<div class="max-w-2xl mx-auto w-full px-3 md:px-0 my-10">
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script>
|
<script>
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import { prompts } from '$lib/stores';
|
import { prompts } from '$lib/stores';
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<script>
|
<script>
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import { prompts } from '$lib/stores';
|
import { prompts } from '$lib/stores';
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
import { onMount, tick } from 'svelte';
|
import { onMount, tick } from 'svelte';
|
||||||
import { config, user, theme, WEBUI_NAME } from '$lib/stores';
|
import { config, user, theme, WEBUI_NAME } from '$lib/stores';
|
||||||
import { goto } from '$app/navigation';
|
import { goto } from '$app/navigation';
|
||||||
import toast, { Toaster } from 'svelte-french-toast';
|
import { Toaster, toast } from 'svelte-sonner';
|
||||||
|
|
||||||
import { getBackendConfig } from '$lib/apis';
|
import { getBackendConfig } from '$lib/apis';
|
||||||
import { getSessionUser } from '$lib/apis/auths';
|
import { getSessionUser } from '$lib/apis/auths';
|
||||||
@@ -68,4 +68,4 @@
|
|||||||
<slot />
|
<slot />
|
||||||
{/if}
|
{/if}
|
||||||
|
|
||||||
<Toaster />
|
<Toaster richColors position="top-center" />
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
|
import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants';
|
||||||
import { WEBUI_NAME, config, user } from '$lib/stores';
|
import { WEBUI_NAME, config, user } from '$lib/stores';
|
||||||
import { onMount } from 'svelte';
|
import { onMount } from 'svelte';
|
||||||
import toast from 'svelte-french-toast';
|
import { toast } from 'svelte-sonner';
|
||||||
|
|
||||||
let loaded = false;
|
let loaded = false;
|
||||||
let mode = 'signin';
|
let mode = 'signin';
|
||||||
@@ -57,6 +57,12 @@
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
<svelte:head>
|
||||||
|
<title>
|
||||||
|
{`${$WEBUI_NAME}`}
|
||||||
|
</title>
|
||||||
|
</svelte:head>
|
||||||
|
|
||||||
{#if loaded}
|
{#if loaded}
|
||||||
<div class="fixed m-10 z-50">
|
<div class="fixed m-10 z-50">
|
||||||
<div class="flex space-x-2">
|
<div class="flex space-x-2">
|
||||||
@@ -66,7 +72,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class=" bg-white min-h-screen w-full flex justify-center font-mona">
|
<div class=" bg-white dark:bg-gray-900 min-h-screen w-full flex justify-center font-mona">
|
||||||
<!-- <div class="hidden lg:flex lg:flex-1 px-10 md:px-16 w-full bg-yellow-50 justify-center">
|
<!-- <div class="hidden lg:flex lg:flex-1 px-10 md:px-16 w-full bg-yellow-50 justify-center">
|
||||||
<div class=" my-auto pb-16 text-left">
|
<div class=" my-auto pb-16 text-left">
|
||||||
<div>
|
<div>
|
||||||
@@ -81,15 +87,15 @@
|
|||||||
</div>
|
</div>
|
||||||
</div> -->
|
</div> -->
|
||||||
|
|
||||||
<div class="w-full max-w-lg px-10 md:px-16 bg-white min-h-screen flex flex-col">
|
<div class="w-full sm:max-w-lg px-4 min-h-screen flex flex-col">
|
||||||
<div class=" my-auto pb-10 w-full">
|
<div class=" my-auto pb-10 w-full">
|
||||||
<form
|
<form
|
||||||
class=" flex flex-col justify-center"
|
class=" flex flex-col justify-center bg-white py-6 sm:py-16 px-6 sm:px-16 rounded-2xl"
|
||||||
on:submit|preventDefault={() => {
|
on:submit|preventDefault={() => {
|
||||||
submitHandler();
|
submitHandler();
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
<div class=" text-xl md:text-2xl font-bold">
|
<div class=" text-xl sm:text-2xl font-bold">
|
||||||
{mode === 'signin' ? 'Sign in' : 'Sign up'} to {$WEBUI_NAME}
|
{mode === 'signin' ? 'Sign in' : 'Sign up'} to {$WEBUI_NAME}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# update_llm.sh
|
||||||
|
|
||||||
|
# Retrieves the list of LLMs installed in the Docker container
|
||||||
|
llm_list=$(docker exec ollama ollama list | tail -n +2 | awk '{print $1}')
|
||||||
|
|
||||||
|
# Loop over each LLM to update it
|
||||||
|
for llm in $llm_list; do
|
||||||
|
docker exec ollama ollama pull $llm
|
||||||
|
done
|
||||||
Reference in new issue
Block a user