Merge branch 'upstream' into concedo_experimental

# Conflicts:
#	.github/labeler.yml
#	.github/workflows/build-and-test-snapdragon.yml
#	.github/workflows/build-self-hosted.yml
#	.github/workflows/release.yml
#	.github/workflows/server-self-hosted.yml
#	.github/workflows/server-webui.yml
#	.github/workflows/server.yml
#	.gitignore
#	CMakeLists.txt
#	CONTRIBUTING.md
#	README.md
#	ggml/src/ggml-cuda/fattn.cu
#	ggml/src/ggml-hexagon/htp/cpy-ops.c
#	ggml/src/ggml-webgpu/ggml-webgpu-shader-lib.hpp
#	ggml/src/ggml-webgpu/ggml-webgpu.cpp
#	grammars/README.md
#	scripts/snapdragon/qdc/run_qdc_jobs.py
#	scripts/snapdragon/qdc/tests/run_backend_ops_posix.py
#	scripts/snapdragon/qdc/tests/run_bench_tests_posix.py
#	scripts/snapdragon/qdc/tests/utils.py
#	tests/test-backend-ops.cpp
#	tests/test-chat.cpp
#	tools/server/CMakeLists.txt
#	tools/server/README.md
#	tools/server/webui/src/lib/components/app/server/ServerLoadingSplash.svelte
#	tools/server/webui/src/routes/(chat)/chat/[id]/+page.svelte
#	ty.toml
This commit is contained in:
Concedo
2026-05-15 17:09:48 +08:00
24 changed files with 444 additions and 13525 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
-12
View File
@@ -1,12 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="5">
</head>
<body>
<div id="loading">
The model is loading. Please wait.<br/>
The user interface will appear soon.
</div>
</body>
</html>
+8 -3
View File
@@ -257,8 +257,11 @@ json server_chat_convert_responses_to_chatcmpl(const json & response_body) {
for (json resp_tool : response_body.at("tools")) {
json chatcmpl_tool;
if (json_value(resp_tool, "type", std::string()) != "function") {
throw std::invalid_argument("'type' of tool must be 'function'");
const std::string type = json_value(resp_tool, "type", std::string());
if (type != "function") {
// Non-function Responses tools have no Chat Completions equivalent.
SRV_WRN("unsupported Responses tool type '%s' skipped\n", type.c_str());
continue;
}
resp_tool.erase("type");
chatcmpl_tool["type"] = "function";
@@ -270,7 +273,9 @@ json server_chat_convert_responses_to_chatcmpl(const json & response_body) {
chatcmpl_tools.push_back(chatcmpl_tool);
}
chatcmpl_body.erase("tools");
chatcmpl_body["tools"] = chatcmpl_tools;
if (!chatcmpl_tools.empty()) {
chatcmpl_body["tools"] = chatcmpl_tools;
}
}
if (response_body.contains("max_output_tokens")) {
+17 -17
View File
@@ -238,30 +238,30 @@ bool server_http_context::init(const common_params & params) {
};
auto middleware_server_state = [this](const httplib::Request & req, httplib::Response & res) {
(void)req; // suppress unused parameter warning when LLAMA_BUILD_WEBUI is not defined
bool ready = is_ready.load();
if (!ready) {
#ifdef LLAMA_BUILD_WEBUI
auto tmp = string_split<std::string>(req.path, '.');
if (req.path == "/" || tmp.back() == "html") {
if (req.path == "/" || (tmp.size() > 0 && tmp.back() == "html")) {
res.status = 503;
res.set_content(reinterpret_cast<const char*>(loading_html), loading_html_len, "text/html; charset=utf-8");
} else
#endif
{
// no endpoints is allowed to be accessed when the server is not ready
// this is to prevent any data races or inconsistent states
res.status = 503;
res.set_content(
safe_json_to_str(json {
{"error", {
{"message", "Loading model"},
{"type", "unavailable_error"},
{"code", 503}
}}
}),
"application/json; charset=utf-8"
);
return false;
}
#endif
// no endpoints are allowed to be accessed when the server is not ready
// this is to prevent any data races or inconsistent states
res.status = 503;
res.set_content(
safe_json_to_str(json {
{"error", {
{"message", "Loading model"},
{"type", "unavailable_error"},
{"code", 503}
}}
}),
"application/json; charset=utf-8"
);
return false;
}
return true;
+2 -2
View File
@@ -1,6 +1,6 @@
# llama.cpp Web UI
# llama-ui
A modern, feature-rich web interface for llama.cpp built with SvelteKit. This UI provides an intuitive chat interface with advanced file handling, conversation management, and comprehensive model interaction capabilities.
A modern, feature-rich web interface for llama-server built with SvelteKit. This UI provides an intuitive chat interface with advanced file handling, conversation management, and comprehensive model interaction capabilities.
The WebUI supports two server operation modes:
+2 -2
View File
@@ -1,11 +1,11 @@
{
"name": "llama-server-webui",
"name": "llama-ui",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "llama-server-webui",
"name": "llama-ui",
"version": "1.0.0",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.25.1",
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "llama-server-webui",
"name": "llama-ui",
"private": true,
"version": "1.0.0",
"type": "module",
+4 -4
View File
@@ -1,7 +1,7 @@
#!/bin/bash
# Development script for llama.cpp webui
#
# Development script for llama-ui
#
# This script starts the webui development servers (Storybook and Vite).
# Note: You need to start llama-server separately.
#
@@ -14,12 +14,12 @@ cd ../../../
# Check and install git hooks if missing
check_and_install_hooks() {
local hooks_missing=false
# Check for required hooks
if [ ! -f ".git/hooks/pre-commit" ] || [ ! -f ".git/hooks/pre-push" ] || [ ! -f ".git/hooks/post-push" ]; then
hooks_missing=true
fi
if [ "$hooks_missing" = true ]; then
echo "🔧 Git hooks missing, installing them..."
cd tools/server/webui
@@ -1,7 +1,7 @@
#!/bin/bash
# Script to install pre-commit hook for webui
# Pre-commit: formats, checks, builds, and stages build output
# Pre-commit: formats, checks, and builds webui
REPO_ROOT=$(git rev-parse --show-toplevel)
PRE_COMMIT_HOOK="$REPO_ROOT/.git/hooks/pre-commit"
@@ -56,11 +56,7 @@ if git diff --cached --name-only | grep -q "^tools/server/webui/"; then
exit 1
fi
# Stage the build output alongside the source changes
cd "$REPO_ROOT"
git add tools/server/public/
echo "✅ Webui built and build output staged"
echo "✅ Webui built successfully"
fi
exit 0
@@ -75,7 +71,7 @@ if [ $? -eq 0 ]; then
echo ""
echo "The hook will automatically:"
echo " • Format, lint and check webui code before commits"
echo " • Build webui and stage tools/server/public/ into the same commit"
echo " • Build webui"
else
echo "❌ Failed to make hook executable"
exit 1
@@ -8,8 +8,7 @@
message?: string;
}
let { class: className = '', message = 'Initializing connection to KoboldCpp server...' }: Props =
$props();
let { class: className = '', message = 'Initializing connection to server...' }: Props = $props();
</script>
<div class="flex h-full items-center justify-center {className}">
+1 -1
View File
@@ -5,7 +5,7 @@ import { ROUTES } from './routes';
export const FORK_TREE_DEPTH_PADDING = 8;
export const SYSTEM_MESSAGE_PLACEHOLDER = 'System message';
export const APP_NAME = import.meta.env.VITE_PUBLIC_APP_NAME || 'llama.cpp';
export const APP_NAME = import.meta.env.VITE_PUBLIC_APP_NAME || 'llama-ui';
export const ICON_STRIP_TRANSITION_DURATION = 150;
export const ICON_STRIP_TRANSITION_DELAY_MULTIPLIER = 50;
@@ -76,7 +76,7 @@ export class ChatService {
*/
/**
* Sends a chat completion request to the llama.cpp server.
* Sends a chat completion request to the llama-server.
* Supports both streaming and non-streaming responses with comprehensive parameter configuration.
* Automatically converts database messages with attachments to the appropriate API format.
*
@@ -3,7 +3,7 @@
import { page } from '$app/state';
import { afterNavigate } from '$app/navigation';
import { DialogModelNotAvailable } from '$lib/components/app';
import { ROUTES } from '$lib/constants/routes';
import { APP_NAME, ROUTES } from '$lib/constants';
import { chatStore, isLoading } from '$lib/stores/chat.svelte';
import { conversationsStore, activeConversation } from '$lib/stores/conversations.svelte';
import { modelsStore, modelOptions } from '$lib/stores/models.svelte';
@@ -125,7 +125,7 @@
</script>
<svelte:head>
<title>{activeConversation()?.name || 'Chat'} - llama.cpp UI (KoboldCpp Backend)</title>
<title>{activeConversation()?.name || 'Chat'} - {APP_NAME}</title>
</svelte:head>
<DialogModelNotAvailable
+1 -1
View File
@@ -28,7 +28,7 @@ const config = {
$styles: 'src/styles'
},
version: {
name: 'llama-server-webui'
name: 'llama-ui'
}
},
@@ -4,11 +4,11 @@ import { Meta } from '@storybook/addon-docs/blocks';
# llama.cpp Web UI
Welcome to the **llama.cpp Web UI** component library! This Storybook showcases the components used in the modern web interface for the llama.cpp server.
Welcome to the **llama-ui** component library! This Storybook showcases the components used in the modern web interface for the llama-server.
## 🚀 About This Project
WebUI is a modern web interface for the llama.cpp server, built with SvelteKit and ShadCN UI. Features include:
WebUI is a modern web interface for the llama-server, built with SvelteKit and ShadCN UI. Features include:
- **Real-time chat conversations** with AI assistants
- **Multi-conversation management** with persistent storage
-5
View File
@@ -23,11 +23,6 @@ export default defineConfig({
minify: true
},
esbuild: {
lineLimit: 500,
minifyIdentifiers: false
},
css: {
preprocessorOptions: {
scss: {