Add L0 index and anchor UI updates

This commit is contained in:
2026-02-06 11:22:02 +08:00
parent c36efe6805
commit 44ca06f9b9
23 changed files with 1749 additions and 3898 deletions

View File

@@ -83,7 +83,7 @@
<!-- Facts -->
<section class="card facts">
<div class="sec-head">
<div class="sec-title">世界状态</div>
<div class="sec-title">世界状态</div>
<button class="sec-btn" data-section="facts">编辑</button>
</div>
<div class="facts-list scroll" id="facts-list"></div>
@@ -116,6 +116,7 @@
<div class="sel-trigger" id="char-sel-trigger">
<span id="sel-char-text">选择角色</span>
</div>
<div class="settings-hint" id="anchor-extra" style="margin-top:-6px"></div>
<div class="sel-opts" id="char-sel-opts">
<div class="sel-opt" data-value="">暂无角色</div>
</div>
@@ -346,6 +347,8 @@
<div class="tab-pane" id="tab-vector">
<div class="settings-section">
<div class="settings-section-title">智能记忆(向量检索)</div>
<!-- 启用开关 -->
<div class="settings-checkbox-group">
<label class="settings-checkbox">
<input type="checkbox" id="vector-enabled">
@@ -353,104 +356,34 @@
<span class="checkbox-label">启用向量检索</span>
</label>
</div>
<div id="vector-config-area" class="hidden">
<!-- API Key -->
<div class="settings-row" style="margin-top:16px">
<div class="settings-field full">
<label>Embedding 引擎</label>
<div class="engine-selector">
<label class="engine-option">
<input type="radio" name="vector-engine" value="local">
<span>本地模型</span>
</label>
<label class="engine-option">
<input type="radio" name="vector-engine" value="online" checked>
<span>在线服务</span>
</label>
<label>硅基流动 API Key</label>
<input type="password" id="vector-api-key" placeholder="sk-xxx">
<div class="settings-hint">
💡 <a href="https://siliconflow.cn" target="_blank">硅基流动</a>
内置使用免费模型bge-m3、Qwen3-8B注册认证拿 Key 即可
</div>
</div>
</div>
<!-- Local Engine -->
<div id="local-engine-area" class="engine-area hidden">
<div class="model-select-row">
<select id="local-model-select">
<option value="bge-small-zh">中文轻量 (51MB)</option>
<option value="bge-base-zh">中文标准 (102MB)</option>
<option value="e5-small">多语言 (118MB)</option>
</select>
</div>
<div class="model-desc" id="local-model-desc">手机/低配适用</div>
<div class="engine-status-row">
<div class="engine-status" id="local-model-status">
<span class="status-dot"></span>
<span class="status-text">检查中...</span>
</div>
<div class="engine-actions" id="local-model-actions">
<button class="btn btn-sm btn-p" id="btn-download-model">下载</button>
<button class="btn btn-sm" id="btn-cancel-download"
style="display:none">取消</button>
<button class="btn btn-sm btn-del" id="btn-delete-model"
style="display:none">删除</button>
</div>
</div>
<div class="engine-progress hidden" id="local-model-progress" style="margin-top: 8px;">
<div class="progress-bar">
<div class="progress-inner"></div>
</div>
<span class="progress-text">0%</span>
</div>
</div>
<!-- Online Engine -->
<div id="online-engine-area" class="engine-area">
<div class="settings-row">
<div class="settings-field full">
<label>服务渠道</label>
<select id="online-provider">
<option value="siliconflow">硅基流动(推荐)</option>
<option value="cohere">Cohere</option>
<option value="openai">OpenAI 兼容(可自建)</option>
</select>
</div>
</div>
<div class="settings-row" id="online-url-row">
<div class="settings-field full">
<label>API URL</label>
<input type="text" id="vector-api-url" placeholder="https://api.siliconflow.cn">
</div>
</div>
<div class="settings-row">
<div class="settings-field full">
<label>API Key</label>
<input type="password" id="vector-api-key" placeholder="sk-xxx">
</div>
</div>
<div class="settings-row">
<div class="settings-field full">
<label>模型</label>
<div style="display:flex;gap:8px">
<select id="vector-model-select" style="flex:1">
<option value="">请选择模型</option>
</select>
<button class="btn btn-sm" id="btn-fetch-models"
style="display:none">拉取</button>
<!-- 测试连接 -->
<div class="settings-row">
<div class="settings-field full">
<div class="engine-status-row">
<div class="engine-status" id="online-api-status">
<span class="status-dot"></span>
<span class="status-text">未测试</span>
</div>
<button class="btn btn-sm" id="btn-test-vector-api">测试连接</button>
</div>
</div>
<div class="engine-status-row">
<div class="engine-status" id="online-api-status">
<span class="status-dot"></span>
<span class="status-text">未测试</span>
</div>
<button class="btn btn-sm" id="btn-test-vector-api">测试连接</button>
</div>
<div class="provider-hint" id="provider-hint">
💡 <a href="https://siliconflow.cn" target="_blank">硅基流动</a> 免费、速度快、质量好,推荐
BAAI/bge-m3
</div>
</div>
<!-- 文本过滤规则 - Redesigned for mobile -->
<!-- 文本过滤规则 -->
<div class="filter-rules-section">
<div class="filter-rules-header">
<label>文本过滤规则</label>
@@ -463,76 +396,115 @@
添加
</button>
</div>
<p class="settings-hint">过滤干扰内容(如思考标签):遇到「起始」跳过直到「结束」</p>
<p class="settings-hint">过滤干扰内容(如思考标签)</p>
<div id="filter-rules-list" class="filter-rules-list"></div>
</div>
<!-- Vector Stats -->
<!-- ═══════════════════════════════════════════════════════════ -->
<!-- 记忆锚点L0 文本层)-->
<!-- ═══════════════════════════════════════════════════════════ -->
<div class="anchor-section">
<div class="anchor-header">
<div class="anchor-title">
<span class="anchor-icon">📌</span>
<span>记忆锚点</span>
</div>
<div class="anchor-hint">从对话中提取叙事锚点(情绪、地点、动作、揭示等)</div>
</div>
<div class="anchor-stats" id="anchor-stats">
<div class="anchor-stat-item">
<span class="anchor-stat-label">已提取楼层:</span>
<span class="anchor-stat-value"><strong id="anchor-extracted">0</strong></span>
</div>
<span class="anchor-stat-sep">/</span>
<div class="anchor-stat-item">
<span class="anchor-stat-label">总 AI 楼层:</span>
<span class="anchor-stat-value"><strong id="anchor-total">0</strong></span>
</div>
<div class="anchor-stat-pending" id="anchor-pending-wrap">
<span>(待提取 <strong id="anchor-pending">0</strong> 楼)</span>
</div>
</div>
<!-- 进度条 -->
<div class="anchor-progress hidden" id="anchor-progress">
<div class="progress-bar">
<div class="progress-inner"></div>
</div>
<span class="progress-text">0/0</span>
</div>
<!-- 操作按钮 -->
<div class="anchor-actions" id="anchor-action-row">
<button class="btn btn-sm btn-p" id="btn-anchor-generate">生成</button>
<button class="btn btn-sm btn-del" id="btn-anchor-clear">清空</button>
<button class="btn btn-sm hidden" id="btn-anchor-cancel">取消</button>
</div>
</div>
<!-- ═══════════════════════════════════════════════════════════ -->
<!-- 当前聊天向量 -->
<!-- ═══════════════════════════════════════════════════════════ -->
<div class="vector-chat-section">
<div class="settings-row">
<div class="settings-field full">
<label>当前聊天向量</label>
<div class="vector-stats" id="vector-stats">
<div class="vector-stat-col">
<span class="vector-stat-label">事件向量:</span>
<span class="vector-stat-label">L0 Atoms:</span>
<span class="vector-stat-value"><strong
id="vector-event-count">0</strong>/<strong
id="vector-event-total">0</strong></span>
id="vector-atom-count">0</strong></span>
</div>
<span class="vector-stat-sep">·</span>
<div class="vector-stat-col">
<span class="vector-stat-label">Chunks:</span>
<span class="vector-stat-label">L1 Chunks:</span>
<span class="vector-stat-value"><strong
id="vector-chunk-count">0</strong>
个(<span id="vector-chunk-floors">0</span>/<span
id="vector-chunk-total">0</span> 层)</span>
id="vector-chunk-count">0</strong></span>
</div>
<span class="vector-stat-sep">·</span>
<div class="vector-stat-col">
<span class="vector-stat-label">消息:</span>
<span class="vector-stat-label">L2 Events:</span>
<span class="vector-stat-value"><strong
id="vector-message-count">0</strong></span>
id="vector-event-count">0</strong></span>
</div>
</div>
<div class="vector-mismatch-warning hidden" id="vector-mismatch-warning">
引擎/模型已变更,需重新生成向量
⚠ 需重新生成向量
</div>
<div class="vector-empty-warning hidden" id="vector-empty-l0-warning">
⚠ 记忆锚点为空,建议先生成
</div>
</div>
</div>
<div class="engine-progress hidden" id="vector-gen-progress-l1">
<div style="font-size:.75rem;color:var(--txt3);margin-bottom:4px">L1 片段</div>
<!-- 进度条 -->
<div class="engine-progress hidden" id="vector-gen-progress">
<div class="progress-bar">
<div class="progress-inner"></div>
</div>
<span class="progress-text">0/0</span>
</div>
<div class="engine-progress hidden" id="vector-gen-progress-l2">
<div style="font-size:.75rem;color:var(--txt3);margin-bottom:4px">L2 事件</div>
<div class="progress-bar">
<div class="progress-inner"></div>
</div>
<span class="progress-text">0/0</span>
</div>
<div class="settings-hint" id="vector-perf-l1"></div>
<div class="settings-hint" id="vector-perf-l2"></div>
<div class="settings-btn-row" id="vector-action-row">
<button class="btn btn-sm btn-p" id="btn-gen-vectors">生成向量</button>
<button class="btn btn-sm btn-del" id="btn-clear-vectors">清除向量</button>
<button class="btn btn-sm hidden" id="btn-cancel-vectors">取消</button>
</div>
<div class="settings-hint" style="margin-top:8px">首次生成向量可能耗时较久,页面短暂卡顿属正常。若本地模型重进酒馆后需重下。
<span class="progress-text">0%</span>
</div>
<!-- 向量导入导出 -->
<!-- 操作按钮 -->
<div class="settings-btn-row" id="vector-action-row">
<button class="btn btn-sm btn-p" id="btn-gen-vectors">生成向量</button>
<button class="btn btn-sm btn-del" id="btn-clear-vectors">清除</button>
<button class="btn btn-sm hidden" id="btn-cancel-vectors">取消</button>
</div>
<div class="settings-hint" style="margin-top:8px">
向量化现有 L0/L1/L2 数据(首次可能需要 1-2 分钟)
</div>
<!-- 导入导出 -->
<div class="vector-io-section">
<div class="settings-row">
<div class="settings-field full">
<label>向量迁移(跨设备 / 防清缓存)</label>
<div class="settings-hint" style="margin-bottom:8px">导出/导入均为 zip 格式,勿解压
</div>
<div class="settings-btn-row" id="vector-io-row" style="margin-top:8px">
<button class="btn btn-sm" id="btn-export-vectors">导出向量</button>
<button class="btn btn-sm" id="btn-import-vectors">导入向量</button>
<label>向量迁移</label>
<div class="settings-btn-row" style="margin-top:8px">
<button class="btn btn-sm" id="btn-export-vectors">导出</button>
<button class="btn btn-sm" id="btn-import-vectors">导入</button>
</div>
<div class="settings-hint" id="vector-io-status"></div>
</div>
@@ -595,8 +567,6 @@
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
<script src="story-summary-ui.js"></script>
</body>