预设兼容:按真实抓包对齐装配与包装层,补上声明式工具与预设正则。

- 装配只认 prompt_order.enabled;squash_system_messages 只合并相邻 system(新增 system 档,连接符按酒馆用单换行)
- 包装层:new_chat_prompt、示例对话(new_example_chat_prompt + <START> 切段 + name)、角色卡三块与 personality_format/scenario_format、{{user}}/{{char}} 取值、任务契约并进预设条目
- 工具协议:按 ToolBindings / 伪工具协议数据声明真 tools(presetToolPolicy=preset),工具描述用到的条目不再重复作为消息发出
- 正则:promptOnly 作用于对话历史(含 depth 过滤)、写入时脚本改写回复;{{//}} 注释按配平扫描
- tools/st-request-diff:真假上游抓包对比工具、三份预设的机制结论与实测报告
This commit is contained in:
2026-10-23 00:13:08 +08:00
parent ed09e5c831
commit 9dc927282f
94 changed files with 11558 additions and 413 deletions
+570 -18
View File
@@ -1,11 +1,85 @@
.chat-shell {
--rail-left: minmax(200px, 240px);
--rail-right: minmax(260px, 320px);
display: grid;
grid-template-columns: minmax(200px, 240px) minmax(0, 1fr) minmax(260px, 320px);
grid-template-columns: var(--rail-left) minmax(0, 1fr) var(--rail-right);
min-height: 0;
flex: 1;
}
/* 侧栏收起:宽度归零,主区仍固定在第 2 列,卡片直接变宽 */
.chat-shell.is-left-hidden {
--rail-left: 0px;
}
.chat-shell.is-left-hidden .chat-rail {
display: none;
}
.chat-shell.is-right-hidden {
--rail-right: 0px;
}
.chat-shell.is-right-hidden .chat-context {
display: none;
}
/* 侧栏边缘的收起/展开小把手 */
.chat-rail-toggle,
.chat-rail-reopen {
position: absolute;
top: 10px;
z-index: 4;
width: 18px;
height: 42px;
display: grid;
place-items: center;
padding: 0;
border: 1px solid var(--st-border-strong);
border-radius: 8px;
background: var(--st-surface);
color: var(--st-muted);
font: inherit;
font-size: 13px;
line-height: 1;
cursor: pointer;
opacity: 0.75;
}
.chat-rail-toggle:hover,
.chat-rail-toggle:focus-visible,
.chat-rail-reopen:hover,
.chat-rail-reopen:focus-visible {
opacity: 1;
color: var(--st-accent);
border-color: var(--st-accent);
background: var(--st-accent-soft);
outline: none;
}
.chat-rail-reopen[hidden] {
display: none;
}
.chat-rail-toggle-left {
right: -9px;
}
.chat-rail-toggle-right {
left: -9px;
}
.chat-rail-reopen-left {
left: 2px;
}
.chat-rail-reopen-right {
right: 2px;
}
.chat-rail {
grid-column: 1;
position: relative;
display: flex;
flex-direction: column;
gap: 10px;
@@ -123,6 +197,14 @@
color: var(--st-muted);
}
.chat-rail-item-actions {
display: flex;
flex-shrink: 0;
align-items: center;
gap: 2px;
}
.chat-rail-item-copy,
.chat-rail-item-del {
flex-shrink: 0;
border: 0;
@@ -130,13 +212,28 @@
color: var(--st-faint);
cursor: pointer;
padding: 2px 4px;
font: inherit;
font-size: 12px;
}
.chat-rail-item-del:hover {
.chat-rail-item-copy:hover,
.chat-rail-item-copy:focus-visible {
color: var(--st-text);
}
.chat-rail-item-del:hover,
.chat-rail-item-del:focus-visible {
color: var(--st-danger);
}
.chat-rail-item-main:focus-visible,
.chat-rail-item-copy:focus-visible,
.chat-rail-item-del:focus-visible,
.st-btn:focus-visible {
outline: 2px solid var(--st-accent);
outline-offset: 2px;
}
.chat-rail-note {
margin: 0;
font-size: 11px;
@@ -145,6 +242,8 @@
}
.chat-main {
grid-column: 2;
position: relative;
display: flex;
flex-direction: column;
min-width: 0;
@@ -202,6 +301,8 @@
}
.chat-context {
grid-column: 3;
position: relative;
display: flex;
flex-direction: column;
min-width: 0;
@@ -212,18 +313,12 @@
.chat-context-head {
flex-shrink: 0;
padding: 12px 14px 8px;
padding: 10px 14px 8px;
border-bottom: 1px solid var(--st-border);
}
.chat-context-head h2 {
margin: 0;
font-size: 14px;
font-weight: 650;
}
.chat-context-sub {
margin: 4px 0 0;
margin: 0;
font-size: 11px;
color: var(--st-muted);
line-height: 1.35;
@@ -266,9 +361,139 @@
.chat-shell-editor-actions {
display: flex;
justify-content: flex-end;
gap: 8px;
padding-top: 4px;
}
/* 右侧面板的两个页签:上下文 / 保留统计 */
.chat-context-tabs {
flex-shrink: 0;
display: flex;
gap: 2px;
padding: 8px 14px 0;
border-bottom: 1px solid var(--st-border);
}
.chat-context-tab {
border: 1px solid transparent;
border-bottom: 0;
border-radius: 6px 6px 0 0;
background: transparent;
color: var(--st-muted);
font: inherit;
font-size: 12px;
line-height: 1;
padding: 7px 10px;
cursor: pointer;
}
.chat-context-tab:hover,
.chat-context-tab:focus-visible {
color: var(--st-text);
background: color-mix(in srgb, var(--st-muted) 10%, transparent);
outline: none;
}
.chat-context-tab.is-active {
border-color: var(--st-border);
background: var(--st-surface);
color: var(--st-text);
font-weight: 600;
margin-bottom: -1px;
}
.chat-shell-editor[hidden],
.chat-keep-stats[hidden] {
display: none !important;
}
/* 保留统计:条状图,按次数降序 */
.chat-keep-stats {
flex: 1;
min-height: 0;
display: flex;
flex-direction: column;
gap: 10px;
padding: 12px 14px 16px;
overflow: auto;
}
.chat-keep-stats-hint {
margin: 0;
font-size: 11px;
line-height: 1.4;
color: var(--st-muted);
}
.chat-keep-stats-list {
display: grid;
gap: 10px;
align-content: start;
}
.chat-keep-bar {
display: grid;
gap: 4px;
}
.chat-keep-bar-head {
display: flex;
align-items: baseline;
gap: 8px;
min-width: 0;
}
.chat-keep-bar-name {
flex: 1;
min-width: 0;
font-size: 12px;
font-weight: 600;
color: var(--st-text);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.chat-keep-bar-count {
flex-shrink: 0;
font-size: 11px;
font-variant-numeric: tabular-nums;
color: var(--st-muted);
}
.chat-keep-bar-track {
height: 8px;
border-radius: 99px;
background: color-mix(in srgb, var(--st-muted) 14%, transparent);
overflow: hidden;
}
.chat-keep-bar-fill {
height: 100%;
border-radius: 99px;
background: color-mix(in srgb, var(--st-accent) 72%, var(--st-muted));
}
.chat-keep-bar-model {
margin: 0;
font-size: 11px;
color: var(--st-faint);
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.chat-keep-stats-foot {
margin-top: auto;
display: flex;
justify-content: flex-end;
}
.chat-keep-stats-foot .st-btn {
font-size: 11px;
padding: 4px 8px;
}
/* —— 模型竞技场:用户气泡 + 横向回复卡片 —— */
.chat-arena {
position: relative;
@@ -487,6 +712,100 @@
font-size: 14px;
}
.chat-user-bubble.is-editing {
width: min(92%, 42rem);
}
.chat-user-foot,
.chat-user-edit-bar {
display: flex;
align-items: center;
justify-content: flex-end;
flex-wrap: wrap;
gap: 2px;
width: 100%;
}
.chat-turn-variants {
display: inline-flex;
align-items: center;
gap: 0;
margin-right: auto;
}
.chat-turn-variant-count {
min-width: 2.2rem;
text-align: center;
font-size: 11px;
font-variant-numeric: tabular-nums;
color: #64748b;
}
.chat-user-foot .chat-nav-btn {
width: 22px;
height: 22px;
border-radius: 6px;
color: #64748b;
}
.chat-user-act {
border: 0;
background: transparent;
color: #475569;
font: inherit;
font-size: 12px;
line-height: 1;
padding: 3px 6px;
border-radius: 6px;
cursor: pointer;
}
.chat-user-act:hover,
.chat-user-act:focus-visible {
color: #1d4ed8;
background: rgba(255, 255, 255, 0.72);
outline: none;
}
.chat-user-act.is-primary {
color: #1d4ed8;
font-weight: 600;
}
.chat-user-act:disabled {
opacity: 0.4;
cursor: default;
}
.chat-user-edit {
width: 100%;
min-height: 4.5rem;
max-height: 320px;
box-sizing: border-box;
resize: vertical;
border: 1px solid #93c5fd;
border-radius: 8px;
background: #fff;
color: #1e293b;
font: inherit;
font-size: 14px;
line-height: 1.55;
padding: 8px;
}
.chat-user-edit:focus {
outline: 2px solid #bfdbfe;
outline-offset: 1px;
}
.chat-user-edit-hint {
margin: 0;
width: 100%;
font-size: 11px;
line-height: 1.3;
color: #64748b;
}
.chat-bubble-time {
font-size: 10px;
line-height: 1.2;
@@ -506,6 +825,32 @@
color: var(--st-faint);
}
/* 本轮有多个失败时,一键重跑全部失败窗口;已成功的卡片不动 */
.chat-retry-all {
margin-left: auto;
border: 1px solid var(--st-border-strong);
border-radius: 6px;
background: var(--st-surface);
color: var(--st-text);
font: inherit;
font-size: 11px;
font-weight: 500;
padding: 3px 8px;
cursor: pointer;
}
.chat-retry-all:hover,
.chat-retry-all:focus-visible {
border-color: var(--st-accent);
background: var(--st-accent-soft);
outline: none;
}
.chat-retry-all:disabled {
opacity: 0.5;
cursor: default;
}
.chat-strip-nav {
display: flex;
align-items: center;
@@ -590,17 +935,18 @@
width: 100%;
}
.chat-reply-card.is-collapsed {
.chat-reply-card.is-collapsed,
.chat-reply-card.is-capped {
overflow: hidden;
}
.chat-reply-card.is-collapsed .chat-reply-card-body {
.chat-reply-card:is(.is-collapsed, .is-capped) .chat-reply-card-body {
flex: 1 1 auto;
min-height: 0;
overflow: hidden;
}
.chat-reply-card.is-collapsed .chat-reply-card-text {
.chat-reply-card:is(.is-collapsed, .is-capped) .chat-reply-card-text {
flex: 1 1 auto;
min-height: 0;
height: 100%;
@@ -609,7 +955,7 @@
scrollbar-width: none;
}
.chat-reply-card.is-collapsed .chat-reply-card-text::-webkit-scrollbar {
.chat-reply-card:is(.is-collapsed, .is-capped) .chat-reply-card-text::-webkit-scrollbar {
width: 0;
}
@@ -630,6 +976,24 @@
border-radius: 99px;
}
/* 分卡片:正文没在顶端就一直露着滚动条,滚回顶端才收 */
.chat-reply-card:is(.is-collapsed, .is-capped) .chat-reply-card-text.is-scrolled,
.chat-reply-card:is(.is-collapsed, .is-capped) .chat-reply-card-text.is-vscroll {
scrollbar-width: thin;
scrollbar-color: color-mix(in srgb, var(--st-muted) 42%, transparent) transparent;
}
.chat-reply-card:is(.is-collapsed, .is-capped) .chat-reply-card-text.is-scrolled::-webkit-scrollbar,
.chat-reply-card:is(.is-collapsed, .is-capped) .chat-reply-card-text.is-vscroll::-webkit-scrollbar {
width: 6px;
}
.chat-reply-card:is(.is-collapsed, .is-capped) .chat-reply-card-text.is-scrolled::-webkit-scrollbar-thumb,
.chat-reply-card:is(.is-collapsed, .is-capped) .chat-reply-card-text.is-vscroll::-webkit-scrollbar-thumb {
background: color-mix(in srgb, var(--st-muted) 45%, transparent);
border-radius: 99px;
}
.chat-reply-card.is-selected {
border-color: var(--st-accent);
background: color-mix(in srgb, var(--st-accent-soft) 55%, var(--st-surface));
@@ -653,6 +1017,13 @@
min-width: 0;
}
.chat-reply-card-actions {
display: flex;
align-items: center;
gap: 6px;
flex-shrink: 0;
}
.chat-reply-card-name {
display: block;
font-size: 13px;
@@ -673,6 +1044,44 @@
white-space: nowrap;
}
/* 盲测:编号当按钮用,点一下只揭示这一张卡 */
.chat-reply-card-name.is-blind {
display: block;
max-width: 100%;
padding: 1px 8px;
border: 1px solid var(--st-border);
border-radius: 999px;
background: color-mix(in srgb, var(--st-muted) 8%, transparent);
font-size: 12px;
font-weight: 600;
color: var(--st-muted);
text-align: left;
cursor: pointer;
transition: color 0.12s ease, border-color 0.12s ease, background 0.12s ease;
}
.chat-reply-card-name.is-blind:hover {
color: var(--st-text);
border-color: color-mix(in srgb, var(--st-accent) 50%, var(--st-border));
}
.chat-reply-card-name.is-blind.is-revealed {
color: var(--st-text);
border-color: color-mix(in srgb, var(--st-accent) 50%, var(--st-border));
background: var(--st-accent-soft);
}
.chat-reply-card-name.is-blind:focus-visible {
outline: 2px solid var(--st-accent);
outline-offset: 1px;
}
.chat-reply-card-model.is-revealed {
font-size: 12px;
font-weight: 600;
color: var(--st-text);
}
.chat-reply-card-body {
flex: 1 1 auto;
min-height: 0;
@@ -694,6 +1103,25 @@
.chat-reply-card-text {
min-width: 0;
cursor: text;
user-select: text;
-webkit-user-select: text;
touch-action: auto;
}
/* 关闭复制:卡片任意处都能拖动滚动,正文不再选中 */
.chat-arena.is-copy-off .chat-reply-card-text,
.chat-arena.is-copy-off .chat-reply-card-text *,
.chat-arena.is-copy-off .chat-reply-card-body {
cursor: grab;
user-select: none;
-webkit-user-select: none;
touch-action: none;
}
.chat-reply-track.is-dragging .chat-reply-card-text,
.chat-reply-track.is-dragging .chat-reply-card-text * {
cursor: grabbing;
}
.chat-reply-card-text .md-p {
@@ -824,7 +1252,10 @@
outline: none;
}
.chat-copy-btn,
.chat-remove-btn,
.chat-retry-btn,
.chat-regen-btn,
.chat-select-btn {
border: 1px solid var(--st-border-strong);
border-radius: 6px;
@@ -837,15 +1268,38 @@
cursor: pointer;
}
.chat-copy-btn:hover,
.chat-remove-btn:hover,
.chat-retry-btn:hover,
.chat-regen-btn:hover,
.chat-select-btn:hover,
.chat-copy-btn:focus-visible,
.chat-remove-btn:focus-visible,
.chat-retry-btn:focus-visible,
.chat-regen-btn:focus-visible,
.chat-select-btn:focus-visible {
border-color: var(--st-accent);
background: var(--st-accent-soft);
outline: none;
}
.chat-regen-btn:disabled {
opacity: 0.5;
cursor: default;
}
.chat-regen-btn:disabled:hover {
border-color: var(--st-border-strong);
background: var(--st-surface);
}
/* 失败卡片上的重试按钮:用强调色标出来 */
.chat-retry-btn {
border-color: var(--st-accent);
color: var(--st-text);
font-weight: 600;
}
.chat-select-btn.is-on {
border-color: var(--st-accent);
background: var(--st-accent-soft);
@@ -853,15 +1307,44 @@
font-weight: 650;
}
.chat-bubble-thinking {
/* 思维链:默认折叠成一行,点开才铺开正文 */
.chat-think {
margin: 0 0 8px;
padding: 8px;
border: 1px dashed var(--st-border-strong);
border-radius: 6px;
background: color-mix(in srgb, var(--st-bg) 80%, transparent);
color: var(--st-muted);
font-size: 12px;
}
.chat-think-summary {
cursor: pointer;
padding: 5px 8px;
color: var(--st-muted);
user-select: none;
-webkit-user-select: none;
font-size: 12px;
}
.chat-think-summary:hover,
.chat-think-summary:focus-visible {
color: var(--st-text);
outline: none;
}
.chat-think[open] .chat-think-summary {
border-bottom: 1px dashed var(--st-border);
}
.chat-think-body {
padding: 8px;
color: var(--st-muted);
}
/* 关闭复制时整张卡都能拖,但折叠条仍要能点 */
.chat-arena.is-copy-off .chat-think-summary {
cursor: pointer;
}
.chat-composer {
position: relative;
z-index: 1;
@@ -1062,6 +1545,33 @@
font: inherit;
}
.chat-dialog input[type="checkbox"] {
width: 14px;
height: 14px;
margin: 0;
padding: 0;
border: 0;
border-radius: 3px;
background: transparent;
accent-color: var(--st-accent);
flex: 0 0 auto;
}
.chat-model-pick {
border: 0;
margin: 0;
padding: 0;
min-width: 0;
display: grid;
gap: 4px;
}
.chat-model-pick legend {
padding: 0;
font-size: 12px;
color: var(--st-muted);
}
.chat-dialog-actions {
display: flex;
justify-content: flex-end;
@@ -1079,8 +1589,30 @@
display: flex;
align-items: center;
gap: 8px;
min-width: 0;
color: var(--st-text);
font-size: 13px;
padding: 4px 2px;
border-radius: 6px;
}
.chat-compare-list label:hover {
background: var(--st-accent-soft);
}
.chat-compare-list label:has(input:disabled) {
opacity: 0.55;
}
.chat-compare-list label:has(input:disabled):hover {
background: transparent;
}
.chat-compare-list label span {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.chat-compare-result-head {
@@ -1122,7 +1654,8 @@
@media (max-width: 1100px) {
.chat-shell {
grid-template-columns: minmax(180px, 220px) minmax(0, 1fr) minmax(220px, 280px);
--rail-left: minmax(180px, 220px);
--rail-right: minmax(220px, 280px);
}
}
@@ -1133,6 +1666,25 @@
overflow: auto;
}
.chat-rail,
.chat-main,
.chat-context {
grid-column: auto;
}
/* 单列时按可见的块重排行高 */
.chat-shell.is-left-hidden {
grid-template-rows: minmax(0, 1fr) auto;
}
.chat-shell.is-right-hidden {
grid-template-rows: auto minmax(0, 1fr);
}
.chat-shell.is-left-hidden.is-right-hidden {
grid-template-rows: minmax(0, 1fr);
}
.chat-rail {
border-right: 0;
border-bottom: 1px solid var(--st-border);