1. 显存/内存进度条置顶显示 (sticky) - 滚动页面时始终可见 VRAM 和内存占用情况 - GPU+CPU 模式时内存条也同步显示在 sticky 区域 2. 系统内存配置合并到 GPU 配置区域内 - GPU+CPU 模式时无缝衔接在显存占用下方 - 去掉单独面板,去掉单位选择,固定为 GB - 填入 >0 即为有限制,0 为无限制 3. 参数同时显示简写和完整标志 - 如 -ngl / --n-gpu-layers 4. 生成命令区域增加智能提示 - 显存不足时提示调整参数或切换模式 - 内存不足时提示增加上限或减少 GPU 层 - 显存充足时显示确认信息 - 未选模型/GPU 时给出引导提示 5. 自然语言输入改为多行 textarea - 支持多行输入 - placeholder 说明可以自然对话描述需求
148 lines
6.7 KiB
HTML
148 lines
6.7 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>llama.cpp 命令生成器</title>
|
|
<link rel="stylesheet" href="/css/style.css">
|
|
</head>
|
|
<body>
|
|
<div id="app">
|
|
<header>
|
|
<h1>🦙 llama.cpp 命令生成器</h1>
|
|
</header>
|
|
|
|
<!-- Sticky memory bar (always visible on top) -->
|
|
<div id="sticky-mem-bar" class="sticky-mem-bar">
|
|
<div class="sticky-vram-row" id="sticky-vram-row">
|
|
<span class="sticky-label">🎮 VRAM</span>
|
|
<div class="sticky-bar-container">
|
|
<div class="sticky-bar" id="sticky-vram-bar"></div>
|
|
<span class="sticky-bar-text" id="sticky-vram-text">等待配置...</span>
|
|
</div>
|
|
</div>
|
|
<div class="sticky-ram-row hidden" id="sticky-ram-row">
|
|
<span class="sticky-label">💾 内存</span>
|
|
<div class="sticky-bar-container">
|
|
<div class="sticky-bar ram-sticky-bar" id="sticky-ram-bar"></div>
|
|
<span class="sticky-bar-text" id="sticky-ram-text">等待配置...</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Version & Mode Selection -->
|
|
<section class="top-controls">
|
|
<div class="control-group">
|
|
<label>llama.cpp 版本</label>
|
|
<select id="version-select" onchange="onVersionChange()"></select>
|
|
</div>
|
|
<div class="control-group">
|
|
<label>运行模式</label>
|
|
<div class="mode-switch">
|
|
<button class="mode-btn active" data-mode="gpu" onclick="switchMode('gpu')">🎮 GPU 模式</button>
|
|
<button class="mode-btn" data-mode="gpu_cpu" onclick="switchMode('gpu_cpu')">🎮+💻 GPU+CPU 模式</button>
|
|
</div>
|
|
</div>
|
|
<div class="control-group">
|
|
<label>二进制程序</label>
|
|
<select id="binary-select">
|
|
<option value="llama-server">llama-server</option>
|
|
<option value="llama-cli">llama-cli</option>
|
|
</select>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- GPU Configuration + System Memory (merged) -->
|
|
<section class="panel" id="gpu-panel">
|
|
<h2>🖥️ GPU 配置</h2>
|
|
<div id="gpu-slots"></div>
|
|
<button class="btn-add" id="btn-add-gpu" onclick="addGpuSlot()">+ 添加显卡</button>
|
|
|
|
<!-- VRAM Display -->
|
|
<div class="vram-display" id="vram-display">
|
|
<div class="vram-bar-container">
|
|
<div class="vram-bar" id="vram-bar"></div>
|
|
<div class="vram-label" id="vram-label">VRAM: 等待配置...</div>
|
|
</div>
|
|
<div class="vram-breakdown" id="vram-breakdown"></div>
|
|
</div>
|
|
|
|
<!-- System Memory (inline, only for GPU+CPU mode) -->
|
|
<div class="inline-memory-config hidden" id="inline-memory-config">
|
|
<div class="memory-input-row">
|
|
<label>系统内存上限</label>
|
|
<input type="number" id="sys-memory" value="0" min="0" step="1" onchange="updateEstimate()" placeholder="0 = 无限制">
|
|
<span class="memory-unit">GB</span>
|
|
</div>
|
|
<div class="vram-display" id="ram-display">
|
|
<div class="vram-bar-container">
|
|
<div class="vram-bar ram-bar" id="ram-bar"></div>
|
|
<div class="vram-label" id="ram-label">内存: 等待配置...</div>
|
|
</div>
|
|
<div class="vram-breakdown" id="ram-breakdown"></div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
|
|
<!-- Model Selection (two-step) -->
|
|
<section class="panel">
|
|
<h2>📦 选择模型</h2>
|
|
<div class="model-step">
|
|
<label class="model-step-label">第1步:选择模型</label>
|
|
<div class="model-select-container">
|
|
<input type="text" id="model-search" placeholder="搜索模型名称..." oninput="filterBaseModels()" autocomplete="off" onfocus="this.select()">
|
|
<div class="model-dropdown" id="model-dropdown"></div>
|
|
</div>
|
|
</div>
|
|
<div class="model-step hidden" id="quant-step">
|
|
<label class="model-step-label">第2步:选择量化版本</label>
|
|
<div id="quant-options"></div>
|
|
</div>
|
|
<div id="model-selected-info" class="model-selected-info"></div>
|
|
</section>
|
|
|
|
<!-- Natural Language Input -->
|
|
<section class="panel">
|
|
<h2>💬 自然语言生成</h2>
|
|
<div class="nl-input-container">
|
|
<textarea id="nl-input" rows="3" placeholder="用自然语言描述你想要的配置,支持多行输入。 例如: 用RTX 4090跑Llama-3-70B,上下文8192 温度0.7,开启flash attention 端口设为8080"></textarea>
|
|
<button onclick="parseNaturalLanguage()">解析</button>
|
|
</div>
|
|
<div id="nl-result" class="nl-result"></div>
|
|
</section>
|
|
|
|
<!-- Parameters -->
|
|
<section class="panel">
|
|
<h2>⚙️ 参数配置</h2>
|
|
<div class="param-search-container">
|
|
<input type="text" id="param-search" placeholder="搜索全部参数..." oninput="onParamSearch()" autocomplete="off">
|
|
<span id="search-hint" class="search-hint"></span>
|
|
</div>
|
|
<div class="param-tabs" id="param-tabs">
|
|
<button class="tab-btn active" data-cat="common" onclick="switchTab('common')">通用参数</button>
|
|
<button class="tab-btn" data-cat="sampling" onclick="switchTab('sampling')">采样参数</button>
|
|
<button class="tab-btn" data-cat="server" onclick="switchTab('server')">服务器参数</button>
|
|
<button class="tab-btn" data-cat="model_source" onclick="switchTab('model_source')">模型来源</button>
|
|
<button class="tab-btn" data-cat="lora" onclick="switchTab('lora')">LoRA</button>
|
|
<button class="tab-btn" data-cat="logging" onclick="switchTab('logging')">日志</button>
|
|
<button class="tab-btn" data-cat="advanced" onclick="switchTab('advanced')">高级</button>
|
|
</div>
|
|
<div id="param-container"></div>
|
|
<button class="btn-toggle-advanced" onclick="toggleHiddenParams()" id="toggle-advanced-btn">▼ 显示更多参数</button>
|
|
</section>
|
|
|
|
<!-- Generated Command -->
|
|
<section class="panel command-panel">
|
|
<h2>📋 生成命令</h2>
|
|
<div class="command-output" id="command-output">请在上方配置参数...</div>
|
|
<div class="command-hint" id="command-hint"></div>
|
|
<div class="command-actions">
|
|
<button onclick="copyCommand()" class="btn-copy">📋 复制命令</button>
|
|
<button onclick="generateCommand()" class="btn-gen">🔄 重新生成</button>
|
|
</div>
|
|
</section>
|
|
</div>
|
|
<script src="/js/main.js"></script>
|
|
</body>
|
|
</html>
|