mirror of
https://github.com/SilenceLurker/ST-Amily2-Chat-Optimisation.git
synced 2026-06-06 05:25:51 +00:00
Initial commit with CC BY-NC-ND 4.0 license
This commit is contained in:
325
assets/amily-glossary-system/amily2-glossary.css
Normal file
325
assets/amily-glossary-system/amily2-glossary.css
Normal file
@@ -0,0 +1,325 @@
|
||||
|
||||
#amily2_glossary_panel {
|
||||
--am2-gap-main: 15px;
|
||||
--am2-padding-main: 10px;
|
||||
|
||||
--am2-container-bg: rgba(0,0,0,0.2);
|
||||
--am2-container-border: 1px solid rgba(255, 255, 255, 0.15);
|
||||
--am2-container-border-radius: 12px;
|
||||
--am2-container-padding: 20px;
|
||||
--am2-container-shadow: inset 0 0 15px rgba(0,0,0,0.25);
|
||||
|
||||
--am2-title-font-size: 1.15em;
|
||||
--am2-title-font-weight: bold;
|
||||
--am2-title-icon-color: #9e8aff;
|
||||
--am2-title-icon-margin: 10px;
|
||||
|
||||
--am2-button-bg: #4A4A4A;
|
||||
--am2-button-border-color: rgba(255, 255, 255, 0.2);
|
||||
--am2-button-hover-bg: rgba(255, 255, 255, 0.15);
|
||||
--am2-button-hover-border-color: #fff;
|
||||
--am2-button-text-color: #E0E0E0;
|
||||
}
|
||||
|
||||
/* --- 整体布局 --- */
|
||||
#amily2_glossary_panel {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--am2-gap-main);
|
||||
padding: var(--am2-padding-main);
|
||||
}
|
||||
|
||||
/* --- 标签页系统 --- */
|
||||
#amily2_glossary_panel .glossary-tabs {
|
||||
display: flex;
|
||||
border-bottom: 1px solid var(--am2-container-border);
|
||||
margin: 0 5px;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .glossary-tab {
|
||||
background: none;
|
||||
border: none;
|
||||
border-bottom: 3px solid transparent;
|
||||
color: var(--text-color-secondary);
|
||||
cursor: pointer;
|
||||
font-size: 1em;
|
||||
padding: 10px 15px;
|
||||
transition: all 0.3s ease;
|
||||
margin-bottom: -1px;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .glossary-tab:hover {
|
||||
background-color: rgba(255, 255, 255, 0.05);
|
||||
color: var(--text-color-light);
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .glossary-tab.active {
|
||||
color: var(--am2-title-icon-color);
|
||||
border-bottom-color: var(--am2-title-icon-color);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .glossary-tab i {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .glossary-content {
|
||||
display: none;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .glossary-content.active {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* --- 设置组 (卡片样式) --- */
|
||||
#amily2_glossary_panel .settings-group {
|
||||
background: var(--am2-container-bg);
|
||||
border: var(--am2-container-border);
|
||||
border-radius: var(--am2-container-border-radius);
|
||||
padding: var(--am2-container-padding);
|
||||
box-shadow: var(--am2-container-shadow);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 18px; /* 组内元素的间距 */
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .settings-group .legend {
|
||||
font-size: var(--am2-title-font-size);
|
||||
font-weight: var(--am2-title-font-weight);
|
||||
color: var(--am2-button-text-color);
|
||||
margin: 0;
|
||||
padding-bottom: 15px;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .settings-group .legend i {
|
||||
margin-right: var(--am2-title-icon-margin);
|
||||
color: var(--am2-title-icon-color);
|
||||
}
|
||||
|
||||
/* --- 表单控件 --- */
|
||||
#amily2_glossary_panel .control-group,
|
||||
#amily2_glossary_panel .amily2_settings_block {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 10px 15px;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .control-group label,
|
||||
#amily2_glossary_panel .amily2_settings_block > label { /* > 选择器避免影响toggle-switch内的label */
|
||||
flex: 1 1 150px;
|
||||
min-width: 120px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .control-group .text_pole,
|
||||
#amily2_glossary_panel .control-group .select-with-refresh,
|
||||
#amily2_glossary_panel .control-group input[type="range"] {
|
||||
flex: 2 1 250px;
|
||||
}
|
||||
|
||||
/* --- 开关按钮 (使用专属Class,彻底隔离污染) --- */
|
||||
#amily2_glossary_panel .amily2-glossary-toggle {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 50px;
|
||||
height: 28px;
|
||||
min-width: 50px;
|
||||
flex-shrink: 0;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .amily2-glossary-toggle input {
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .amily2-glossary-toggle .slider {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background-color: #555;
|
||||
transition: .4s;
|
||||
border-radius: 28px;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .amily2-glossary-toggle .slider:before {
|
||||
position: absolute;
|
||||
content: "";
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
left: 4px;
|
||||
top: 50%;
|
||||
background-color: white;
|
||||
border-radius: 50%;
|
||||
transition: .4s;
|
||||
transform: translateY(-50%);
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .amily2-glossary-toggle input:checked + .slider {
|
||||
background-color: #8a72ff;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .amily2-glossary-toggle input:focus + .slider {
|
||||
box-shadow: 0 0 1px #8a72ff;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .amily2-glossary-toggle input:checked + .slider:before {
|
||||
transform: translateX(22px) translateY(-50%);
|
||||
}
|
||||
|
||||
/* --- 按钮 (移植自 table.css) --- */
|
||||
#amily2_glossary_panel .sybd-button-row {
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
justify-content: center;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .menu_button {
|
||||
background: var(--am2-button-bg, #4A4A4A);
|
||||
border: 1px solid var(--am2-button-border-color, rgba(255, 255, 255, 0.2)) !important;
|
||||
color: var(--am2-button-text-color, #E0E0E0) !important;
|
||||
padding: 8px 15px;
|
||||
border-radius: 8px;
|
||||
cursor: pointer;
|
||||
font-weight: bold;
|
||||
transition: all 0.4s ease-out !important;
|
||||
white-space: nowrap; /* 防止文字换行 */
|
||||
display: inline-flex; /* 确保图标和文字对齐 */
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 5px;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .menu_button:hover {
|
||||
background-color: var(--am2-button-hover-bg, rgba(255, 255, 255, 0.15));
|
||||
border-color: var(--am2-button-hover-border-color, #fff) !important;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 4px 12px rgba(0,0,0,0.3);
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .menu_button.small_button {
|
||||
padding: 5px 12px;
|
||||
font-size: 0.9em;
|
||||
border-radius: 6px;
|
||||
}
|
||||
|
||||
/* --- 世界书条目渲染 --- */
|
||||
#amily2_glossary_panel .world-book-entry-item {
|
||||
background-color: rgba(0, 0, 0, 0.2);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border-radius: 8px;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .entry-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
padding-bottom: 10px;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .entry-title {
|
||||
font-size: 1.2em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .entry-content-display pre {
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
background-color: rgba(0, 0, 0, 0.25);
|
||||
padding: 10px;
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .table-render {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .table-render th,
|
||||
#amily2_glossary_panel .table-render td {
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
padding: 8px;
|
||||
}
|
||||
|
||||
#amily2_glossary_panel .table-render th {
|
||||
background-color: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
/* --- 小说处理面板特定样式修复 --- */
|
||||
|
||||
/* 为需要水平布局的组应用flex */
|
||||
#amily2_glossary_panel #glossary-content-novel-process .horizontal-group {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 10px 15px;
|
||||
}
|
||||
#amily2_glossary_panel #glossary-content-novel-process .horizontal-group label {
|
||||
flex: 0 0 150px; /* 固定标签宽度 */
|
||||
}
|
||||
#amily2_glossary_panel #glossary-content-novel-process .horizontal-group .text_pole,
|
||||
#amily2_glossary_panel #glossary-content-novel-process .horizontal-group select {
|
||||
flex: 1 1 200px; /* 输入框占据剩余空间 */
|
||||
}
|
||||
|
||||
/* 上传按钮容器 */
|
||||
#amily2_glossary_panel #glossary-content-novel-process .upload-button-container {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 10px 0;
|
||||
}
|
||||
#amily2_glossary_panel #glossary-content-novel-process .upload-button-container .menu_button {
|
||||
cursor: pointer; /* 确保鼠标指针是手型 */
|
||||
}
|
||||
|
||||
|
||||
/* 预览区域 */
|
||||
#amily2_glossary_panel #glossary-content-novel-process .preview-container label {
|
||||
display: block;
|
||||
margin-bottom: 8px;
|
||||
font-weight: bold;
|
||||
}
|
||||
#amily2_glossary_panel #glossary-content-novel-process #novel-chunk-preview {
|
||||
height: 150px;
|
||||
width: 100%;
|
||||
overflow-y: auto;
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
padding: 10px;
|
||||
background-color: rgba(0, 0, 0, 0.2);
|
||||
border-radius: 6px;
|
||||
box-sizing: border-box;
|
||||
font-size: 0.9em;
|
||||
}
|
||||
#amily2_glossary_panel #glossary-content-novel-process #novel-chunk-preview .chunk-preview-item {
|
||||
padding: 4px;
|
||||
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
#amily2_glossary_panel #glossary-content-novel-process #novel-chunk-preview .chunk-preview-item:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
|
||||
/* 开关组的对齐 */
|
||||
#amily2_glossary_panel #glossary-content-novel-process .amily2_settings_block {
|
||||
justify-content: space-between; /* 让label和开关分布在两端 */
|
||||
padding: 12px;
|
||||
background-color: rgba(255, 255, 255, 0.05);
|
||||
border-radius: 8px;
|
||||
}
|
||||
#amily2_glossary_panel #glossary-content-novel-process .amily2_settings_block > label {
|
||||
flex: 1 1 auto; /* 让标签占据可用空间 */
|
||||
}
|
||||
#amily2_glossary_panel #glossary-content-novel-process .amily2_settings_block .amily2-glossary-toggle {
|
||||
flex: 0 0 auto; /* 开关不拉伸 */
|
||||
}
|
||||
197
assets/amily-glossary-system/amily2-glossary.html
Normal file
197
assets/amily-glossary-system/amily2-glossary.html
Normal file
@@ -0,0 +1,197 @@
|
||||
<div class="amily2-header">
|
||||
<div class="additional-features-title">
|
||||
<i class="fas fa-book"></i> 术语表 (Sybd 系统)
|
||||
</div>
|
||||
<button id="amily2_back_to_main_from_glossary" class="menu_button secondary small_button interactable">
|
||||
返回主殿 <i class="fas fa-arrow-right"></i>
|
||||
</button>
|
||||
</div>
|
||||
<hr class="header-divider">
|
||||
|
||||
<div class="glossary-tabs">
|
||||
<button class="glossary-tab active" data-tab="api">
|
||||
<i class="fas fa-bolt"></i> API 设置
|
||||
</button>
|
||||
<button class="glossary-tab" data-tab="novel-process">
|
||||
<i class="fas fa-file-invoice"></i> 小说处理
|
||||
</button>
|
||||
<button class="glossary-tab" data-tab="tools">
|
||||
<i class="fas fa-tools"></i> 条目工具
|
||||
</button>
|
||||
<button class="glossary-tab" data-tab="context">
|
||||
<i class="fas fa-book-open"></i> 世界书条目
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="glossary-content-container">
|
||||
|
||||
<div id="glossary-content-api" class="glossary-content active">
|
||||
<div class="settings-group">
|
||||
<div class="legend"><i class="fas fa-satellite-dish"></i> Sybd API 调用系统</div>
|
||||
<small class="notes" style="text-align: center; display: block; margin-bottom: 15px;">
|
||||
独立的API调用系统,可与主系统并行使用,支持全兼容和SillyTavern预设两种模式。
|
||||
</small>
|
||||
|
||||
<div class="amily2_settings_block" id="amily2_sybd_content">
|
||||
<div class="control-group">
|
||||
<label for="amily2_sybd_api_mode">API调用模式:</label>
|
||||
<select id="amily2_sybd_api_mode" class="text_pole" data-setting-key="sybdApiMode" data-type="string">
|
||||
<option value="openai_test">全兼容模式</option>
|
||||
<option value="sillytavern_preset">SillyTavern预设模式</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div id="amily2_sybd_config_panel" style="margin-top: 15px;">
|
||||
<!-- 全兼容模式配置 -->
|
||||
<div id="amily2_sybd_compatible_config">
|
||||
<div class="control-group">
|
||||
<label for="amily2_sybd_api_url">API地址:</label>
|
||||
<input type="text" id="amily2_sybd_api_url" class="text_pole" placeholder="https://api.openai.com/v1" data-setting-key="sybdApiUrl" data-type="string" />
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label for="amily2_sybd_api_key">API密钥:</label>
|
||||
<input type="password" id="amily2_sybd_api_key" class="text_pole" placeholder="sk-..." data-setting-key="sybdApiKey" data-type="string" />
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label for="amily2_sybd_model">模型:</label>
|
||||
<div class="select-with-refresh">
|
||||
<select id="amily2_sybd_model_select" class="text_pole" style="flex-grow: 1; display: none;">
|
||||
<option value="">-- 请选择模型 --</option>
|
||||
</select>
|
||||
<input type="text" id="amily2_sybd_model" class="text_pole" placeholder="gpt-4" style="flex-grow: 1;" data-setting-key="sybdModel" data-type="string" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- SillyTavern预设模式配置 -->
|
||||
<div id="amily2_sybd_preset_config" style="display: none;">
|
||||
<div class="control-group">
|
||||
<label for="amily2_sybd_tavern_profile">选择SillyTavern预设:</label>
|
||||
<select id="amily2_sybd_tavern_profile" class="text_pole" data-setting-key="sybdTavernProfile" data-type="string">
|
||||
<option value="">-- 请选择预设 --</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 通用参数配置 -->
|
||||
<div class="control-group">
|
||||
<label for="amily2_sybd_max_tokens">最大令牌数:<span id="amily2_sybd_max_tokens_value">4000</span></label>
|
||||
<input type="range" id="amily2_sybd_max_tokens" min="100" max="100000" step="100" value="4000" data-setting-key="sybdMaxTokens" data-type="integer" />
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label for="amily2_sybd_temperature">温度:<span id="amily2_sybd_temperature_value">0.7</span></label>
|
||||
<input type="range" id="amily2_sybd_temperature" min="0" max="2" step="0.1" value="0.7" data-setting-key="sybdTemperature" data-type="float" />
|
||||
</div>
|
||||
|
||||
<!-- 测试按钮组 - 水平排列 -->
|
||||
<div class="sybd-button-row" style="display: flex; gap: 10px; justify-content: center; margin-top: 15px;">
|
||||
<button id="amily2_sybd_test_connection" class="menu_button primary small_button interactable">
|
||||
<i class="fas fa-plug"></i> 测试连接
|
||||
</button>
|
||||
<button id="amily2_sybd_fetch_models" class="menu_button secondary small_button interactable" title="获取可用模型列表">
|
||||
<i class="fas fa-download"></i> 获取模型
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="glossary-content-tools" class="glossary-content">
|
||||
<div class="settings-group">
|
||||
<div class="legend"><i class="fas fa-sitemap"></i> 按标题重组条目</div>
|
||||
<small class="notes" style="text-align: center; display: block; margin-bottom: 15px;">
|
||||
在下方文本框中输入您想要合并的标题 (不带'#'),每行一个。<br>
|
||||
插件将精确查找这些标题,并将它们的内容合并到同名的新条目中。
|
||||
</small>
|
||||
<div class="control-group" style="margin: 15px auto; max-width: 80%;">
|
||||
<label for="reorganize-headings-list" style="display: block; text-align: center; margin-bottom: 5px;">要重组的标题列表:</label>
|
||||
<textarea id="reorganize-headings-list" class="text_pole" style="width: 100%; min-height: 120px;" placeholder="世界观设定 章节内容概述 时间线 角色关系网 角色总览"></textarea>
|
||||
</div>
|
||||
<div class="sybd-button-row" style="justify-content: center; margin-top: 10px;">
|
||||
<button id="reorganize-entries-by-heading" class="menu_button primary interactable">
|
||||
<i class="fas fa-play-circle"></i> 开始重组
|
||||
</button>
|
||||
</div>
|
||||
<div id="reorganize-status" style="text-align: center; margin-top: 10px; font-weight: bold;">
|
||||
请选择一个世界书并开始操作...
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="glossary-content-context" class="glossary-content">
|
||||
<div class="settings-group">
|
||||
<div class="legend"><i class="fas fa-book-open"></i> 世界书条目预览</div>
|
||||
<small class="notes" style="text-align: center; display: block; margin-bottom: 15px;">
|
||||
此处将显示在“小说处理”标签页中选定世界书的条目。
|
||||
</small>
|
||||
<div class="amily2-glossary-toolbar" style="text-align: center; margin-bottom: 15px;">
|
||||
|
||||
</div>
|
||||
<div id="world-book-entries-display" class="world-book-entries-container">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="glossary-content-novel-process" class="glossary-content">
|
||||
<div class="settings-group">
|
||||
<div class="legend"><i class="fas fa-file-upload"></i> 小说文件处理流程</div>
|
||||
|
||||
<div class="control-group horizontal-group">
|
||||
<label for="novel-world-book-select">1. 选择目标世界书:</label>
|
||||
<select id="novel-world-book-select" class="text_pole"></select>
|
||||
</div>
|
||||
|
||||
<div class="upload-button-container" style="display: flex; gap: 10px; justify-content: center;">
|
||||
<label for="novel-file-input" class="menu_button secondary interactable">
|
||||
<i class="fas fa-upload"></i> 2a. 上传本地文件 (.txt)
|
||||
</label>
|
||||
<input type="file" id="novel-file-input" accept=".txt" style="display: none;">
|
||||
<button id="select-from-database-button" class="menu_button secondary interactable">
|
||||
<i class="fas fa-database"></i> 2b. 从数据库选择
|
||||
</button>
|
||||
</div>
|
||||
<div id="database-file-list-container" class="world-book-entries-container" style="display: none; margin-top: 10px; max-height: 200px; overflow-y: auto;">
|
||||
|
||||
</div>
|
||||
|
||||
<div class="control-group horizontal-group">
|
||||
<label for="novel-chunk-size">3. 每批处理字符数:</label>
|
||||
<input type="number" id="novel-chunk-size" class="text_pole" value="300000" min="1000" step="500" data-setting-key="novelChunkSize" data-type="integer">
|
||||
</div>
|
||||
|
||||
<div class="control-group horizontal-group">
|
||||
<label for="novel-start-batch-index" title="如果处理中断,可在此指定从第几批重新开始。">指定开始批次:</label>
|
||||
<input type="number" id="novel-start-batch-index" class="text_pole" value="1" min="1" step="1">
|
||||
</div>
|
||||
|
||||
<hr class="header-divider">
|
||||
|
||||
<div class="preview-container">
|
||||
<label>4. 内容分块预览 (共 <span id="novel-chunk-count">0</span> 块):</label>
|
||||
<div id="novel-chunk-preview">
|
||||
<small>请先上传文件...</small>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="amily2_settings_block">
|
||||
<label for="novel-force-new">强制新建条目 (不更新现有条目)</label>
|
||||
<label class="amily2-glossary-toggle">
|
||||
<input id="novel-force-new" type="checkbox" />
|
||||
<span class="slider"></span>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="sybd-button-row">
|
||||
<button id="novel-confirm-and-process" class="menu_button primary interactable" disabled>
|
||||
<i class="fas fa-play-circle"></i> 确认并开始处理
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div id="novel-process-status" style="text-align: center; margin-top: 10px; font-weight: bold;">
|
||||
等待操作...
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
Reference in New Issue
Block a user