mirror of
				https://github.com/ggml-org/llama.cpp.git
				synced 2025-11-03 09:22:01 +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',
 | 
						|
    },
 | 
						|
  },
 | 
						|
});
 |