mirror of
https://github.com/ggerganov/llama.cpp.git
synced 2025-04-25 09:26:07 +00:00

* redo Settings modal UI * add python code interpreter * fix auto scroll * build * fix overflow for long output lines * bring back sticky copy button * adapt layout on mobile view * fix multiple lines output and color scheme * handle python exception * better state management * add webworker * add headers * format code * speed up by loading pyodide on page load * (small tweak) add small animation to make it feels like claude
81 lines
2.3 KiB
TypeScript
81 lines
2.3 KiB
TypeScript
import { defineConfig, PluginOption } from 'vite';
|
|
import react from '@vitejs/plugin-react';
|
|
import { viteSingleFile } from 'vite-plugin-singlefile';
|
|
import path from 'node:path';
|
|
import fs from 'node:fs';
|
|
import zlib from 'node:zlib';
|
|
|
|
/* eslint-disable */
|
|
|
|
const MAX_BUNDLE_SIZE = 1.5 * 1024 * 1024; // only increase when absolutely necessary
|
|
|
|
const GUIDE_FOR_FRONTEND = `
|
|
<!--
|
|
This is a single file build of the frontend.
|
|
It is automatically generated by the build process.
|
|
Do not edit this file directly.
|
|
To make changes, refer to the "Web UI" section in the README.
|
|
-->
|
|
`.trim();
|
|
|
|
const FRONTEND_PLUGINS = [react()];
|
|
|
|
const BUILD_PLUGINS = [
|
|
...FRONTEND_PLUGINS,
|
|
viteSingleFile(),
|
|
(function llamaCppPlugin() {
|
|
let config: any;
|
|
return {
|
|
name: 'llamacpp:build',
|
|
apply: 'build',
|
|
async configResolved(_config: any) {
|
|
config = _config;
|
|
},
|
|
writeBundle() {
|
|
const outputIndexHtml = path.join(config.build.outDir, 'index.html');
|
|
const content =
|
|
GUIDE_FOR_FRONTEND + '\n' + fs.readFileSync(outputIndexHtml, 'utf-8');
|
|
const compressed = zlib.gzipSync(Buffer.from(content, 'utf-8'), {
|
|
level: 9,
|
|
});
|
|
|
|
// because gzip header contains machine-specific info, we must remove these data from the header
|
|
// timestamp
|
|
compressed[0x4] = 0;
|
|
compressed[0x5] = 0;
|
|
compressed[0x6] = 0;
|
|
compressed[0x7] = 0;
|
|
// OS
|
|
compressed[0x9] = 0;
|
|
|
|
if (compressed.byteLength > MAX_BUNDLE_SIZE) {
|
|
throw new Error(
|
|
`Bundle size is too large (${Math.ceil(compressed.byteLength / 1024)} KB).\n` +
|
|
`Please reduce the size of the frontend or increase MAX_BUNDLE_SIZE in vite.config.js.\n`
|
|
);
|
|
}
|
|
|
|
const targetOutputFile = path.join(
|
|
config.build.outDir,
|
|
'../../public/index.html.gz'
|
|
);
|
|
fs.writeFileSync(targetOutputFile, compressed);
|
|
},
|
|
} satisfies PluginOption;
|
|
})(),
|
|
];
|
|
|
|
export default defineConfig({
|
|
// @ts-ignore
|
|
plugins: process.env.ANALYZE ? FRONTEND_PLUGINS : BUILD_PLUGINS,
|
|
server: {
|
|
proxy: {
|
|
'/v1': 'http://localhost:8080',
|
|
},
|
|
headers: {
|
|
'Cross-Origin-Embedder-Policy': 'require-corp',
|
|
'Cross-Origin-Opener-Policy': 'same-origin',
|
|
},
|
|
},
|
|
});
|