上傳檔案到「modules/story-summary」

This commit is contained in:
X
2026-02-15 09:59:07 +00:00
parent 8e3f34b5c1
commit 79f1af4857
4 changed files with 3440 additions and 234 deletions

View File

@@ -358,118 +358,106 @@
</div>
<div id="vector-config-area" class="hidden">
<!-- API Key -->
<div class="settings-row" style="margin-top:16px">
<div class="settings-field full">
<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>
内置使用的模型完全免费,注册拿 Key 即可。建议完成实名认证以获得更高并发
</div>
</div>
</div>
<!-- 测试连接 -->
<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>
<!-- Step 0: API Key -->
<div class="neo-card" style="margin-top: 24px;">
<div class="neo-card-title">
<span class="neo-badge">Step.0</span>
<span>填写 API Key</span>
</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 class="settings-hint">
💡 <a href="https://siliconflow.cn" target="_blank">硅基流动</a>
内置使用的模型完全免费。建议实名认证以获得更高并发。
</div>
<button class="btn btn-sm" id="btn-test-vector-api">测试连接</button>
</div>
</div>
</div>
<!-- 文本过滤规则 -->
<div class="settings-collapse" id="filter-rules-collapse">
<div class="settings-collapse-header" id="filter-rules-toggle">
<span>文本过滤规则 · <strong id="filter-rules-count">0</strong></span>
<svg class="collapse-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</div>
<div class="settings-collapse-content hidden" id="filter-rules-content">
<div class="filter-rules-section" style="margin-top:0">
<div class="filter-rules-header">
<p class="settings-hint" style="margin:0">过滤干扰内容(如思考标签)</p>
<button class="btn btn-sm btn-add" id="btn-add-filter-rule">
<svg viewBox="0 0 24 24" width="14" height="14" fill="none"
stroke="currentColor" stroke-width="2">
<line x1="12" y1="5" x2="12" y2="19"></line>
<line x1="5" y1="12" x2="19" y2="12"></line>
</svg>
添加
</button>
<div class="settings-row">
<div class="settings-field full">
<div class="engine-status-row" style="margin-top: 0;">
<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 id="filter-rules-list" class="filter-rules-list"></div>
</div>
</div>
</div>
<!-- ═══════════════════════════════════════════════════════════ -->
<!-- 记忆锚点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">从对话中提取叙事锚点(情绪、地点、动作、揭示等),首次提取较慢(约每百楼 3 分钟)</div>
<!-- Step 1: Memory Anchors -->
<div class="neo-card">
<div class="neo-card-title">
<span class="neo-badge">Step.1</span>
<span>生成记忆锚点</span>
</div>
<div class="settings-hint" style="margin-bottom: 12px; margin-top: -8px;">
从对话中提取叙事锚点(情绪、地点、动作、揭示等)。首次提取较慢(约每百楼 3 分钟)。
</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>
<span class="anchor-stat-sep">·</span>
<div class="anchor-stat-item">
<span class="anchor-stat-label">L0 Atoms:</span>
<span class="anchor-stat-value"><strong id="anchor-atoms-count">0</strong>
</span>
</div>
<span class="anchor-stat-sep" id="anchor-extra-sep" style="display:none">·</span>
<div class="anchor-stat-item" id="anchor-extra-wrap" style="display:none">
<span id="anchor-extra"></span>
<!-- Stats -->
<div class="settings-row">
<div class="settings-field full">
<div class="vector-stats" id="anchor-stats">
<div class="vector-stat-col">
<span class="vector-stat-label">已提取:</span>
<span class="vector-stat-value"><strong
id="anchor-extracted">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-value"><strong
id="anchor-total">0</strong></span>
</div>
<div class="vector-stat-col" id="anchor-pending-wrap"
style="color: #f59e0b;">
(待提取 <strong id="anchor-pending">0</strong>)
</div>
<span class="vector-stat-sep">·</span>
<div class="vector-stat-col">
<span class="vector-stat-label">L0 Atoms:</span>
<span class="vector-stat-value"><strong
id="anchor-atoms-count">0</strong></span>
</div>
<span class="vector-stat-sep" id="anchor-extra-sep"
style="display:none">·</span>
<div class="vector-stat-col" id="anchor-extra-wrap" style="display:none">
<span id="anchor-extra"></span>
</div>
</div>
</div>
</div>
<!-- 进度条 -->
<div class="anchor-progress hidden" id="anchor-progress">
<!-- Progress -->
<div class="engine-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>
<!-- Buttons -->
<div class="settings-btn-row" id="anchor-action-row">
<button class="btn btn-sm btn-p" id="btn-anchor-generate"
style="flex:1">生成锚点</button>
<button class="btn btn-sm btn-del" id="btn-anchor-clear" style="flex:1">清空</button>
<button class="btn btn-sm hidden" id="btn-anchor-cancel" style="flex:1">取消</button>
</div>
</div>
<!-- ═══════════════════════════════════════════════════════════ -->
<!-- 当前聊天向量 -->
<!-- ═══════════════════════════════════════════════════════════ -->
<div class="vector-chat-section">
<!-- Step 2: Generate Vectors -->
<div class="neo-card">
<div class="neo-card-title">
<span class="neo-badge">Step.2</span>
<span>生成向量</span>
</div>
<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">L0 Vectors:</span>
@@ -492,13 +480,14 @@
<div class="vector-mismatch-warning hidden" id="vector-mismatch-warning">
⚠ 需重新生成向量
</div>
<div class="vector-empty-warning hidden" id="vector-empty-l0-warning">
<div class="vector-empty-warning hidden" id="vector-empty-l0-warning"
style="font-size: 0.75rem; color: #f59e0b; margin-top: 6px;">
⚠ 记忆锚点为空,建议先生成
</div>
</div>
</div>
<!-- 进度条 -->
<!-- Progress -->
<div class="engine-progress hidden" id="vector-gen-progress">
<div class="progress-bar">
<div class="progress-inner"></div>
@@ -506,31 +495,61 @@
<span class="progress-text">0%</span>
</div>
<!-- 操作按钮 -->
<!-- Buttons -->
<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>
<button class="btn btn-sm btn-p" id="btn-gen-vectors" style="flex:1">生成向量</button>
<button class="btn btn-sm btn-del" id="btn-clear-vectors" style="flex:1">清除</button>
<button class="btn btn-sm hidden" id="btn-cancel-vectors" style="flex:1">取消</button>
</div>
</div>
<!-- Tools & Settings -->
<div>
<div class="neo-tools-header">
<span>设置与工具</span>
<span style="opacity:0.5">///</span>
</div>
<div class="settings-hint" style="margin-top:8px">
向量化现有数据
</div>
<!-- 导入导出 -->
<div class="vector-io-section">
<div class="settings-row">
<div class="settings-field full">
<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>
<!-- Filter Rules -->
<div class="settings-collapse" id="filter-rules-collapse"
style="margin-top:0; margin-bottom: 16px;">
<div class="settings-collapse-header" id="filter-rules-toggle">
<span>文本过滤规则 · <strong id="filter-rules-count">0</strong></span>
<svg class="collapse-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2">
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</div>
<div class="settings-collapse-content hidden" id="filter-rules-content"
style="border-left: 1px solid var(--bdr); border-right: 1px solid var(--bdr); border-bottom: 1px solid var(--bdr); border-radius: 0 0 6px 6px; margin-top: -2px;">
<div class="filter-rules-header">
<p class="settings-hint" style="margin:0">过滤干扰内容(如思考标签)</p>
<button class="btn btn-sm btn-add" id="btn-add-filter-rule">
<svg viewBox="0 0 24 24" width="14" height="14" fill="none"
stroke="currentColor" stroke-width="2">
<line x1="12" y1="5" x2="12" y2="19"></line>
<line x1="5" y1="12" x2="19" y2="12"></line>
</svg> 添加
</button>
</div>
<div id="filter-rules-list" class="filter-rules-list"></div>
</div>
</div>
<!-- Import/Export -->
<div class="settings-row">
<div class="settings-field full">
<div class="settings-btn-row" style="margin-top:8px">
<button class="btn btn-sm" id="btn-export-vectors"
style="flex:1">导出向量数据</button>
<button class="btn btn-sm" id="btn-import-vectors"
style="flex:1">导入向量数据</button>
</div>
<div class="settings-hint" id="vector-io-status"></div>
</div>
</div>
</div>
</div>
</div>
</div>