feat: add configurable AI model pool

This commit is contained in:
Codex
2026-08-01 23:11:44 +08:00
parent 020b9596dc
commit 4430149ee4
13 changed files with 1660 additions and 273 deletions
+475
View File
@@ -1263,6 +1263,435 @@ textarea:focus-visible,
color: var(--accent-strong);
}
.model-pool {
display: grid;
gap: 18px;
padding-top: 18px;
}
.model-pool h3,
.model-pool p {
margin: 0;
}
.model-pool-intro {
padding: 12px 14px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 18px;
border-left: 3px solid var(--accent);
background: var(--accent-soft);
}
.model-pool-intro strong,
.model-group-heading h3,
.model-editor-heading h3,
.model-routing-heading h3 {
font-size: 11px;
font-weight: 680;
}
.model-pool-intro p,
.model-group-heading p,
.model-editor-heading p,
.model-routing-heading p,
.routing-row p {
margin-top: 4px;
color: var(--text-soft);
font-size: 9px;
line-height: 1.5;
}
.model-pool-summary {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
gap: 6px;
}
.model-pool-summary span,
.model-capability-list span {
padding: 4px 7px;
border-radius: 7px;
color: var(--accent-strong);
background: color-mix(in srgb, var(--surface-raised) 74%, transparent);
font-size: 8px;
font-weight: 650;
white-space: nowrap;
}
.model-editor {
padding: 15px;
border: 1px solid var(--accent);
border-radius: var(--radius-control);
background: var(--surface-raised);
box-shadow: 0 12px 32px color-mix(in srgb, var(--accent) 12%, transparent);
}
.model-editor-heading,
.model-group-heading,
.model-routing-heading {
display: flex;
align-items: flex-start;
gap: 10px;
}
.model-editor-heading {
justify-content: space-between;
margin-bottom: 14px;
}
.model-editor-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 11px 14px;
}
.model-input {
min-width: 0;
display: grid;
gap: 6px;
}
.model-input-wide {
grid-column: 1 / -1;
}
.model-input > span,
.model-capabilities legend {
color: var(--text-soft);
font-size: 9px;
font-weight: 650;
}
.model-input input,
.model-input select,
.routing-row select {
width: 100%;
min-width: 0;
height: 38px;
padding: 0 10px;
border: 1px solid var(--line-strong);
border-radius: 8px;
color: var(--text);
background: var(--surface);
font-size: 10px;
}
.model-input input::placeholder {
color: var(--text-faint);
opacity: 1;
}
.model-input input:focus-visible,
.model-input select:focus-visible,
.routing-row select:focus-visible {
outline: 2px solid var(--accent);
outline-offset: 1px;
}
.model-capabilities {
margin: 13px 0 0;
padding: 10px 0 0;
display: flex;
flex-wrap: wrap;
gap: 9px 16px;
border: 0;
border-top: 1px solid var(--line);
}
.model-capabilities legend {
padding-right: 10px;
}
.model-capabilities label {
display: flex;
align-items: center;
gap: 5px;
color: var(--text-soft);
font-size: 9px;
}
.model-capabilities input,
.model-enabled-row input {
accent-color: var(--accent);
}
.model-enabled-row {
margin-top: 12px;
padding: 10px 0;
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
border-top: 1px solid var(--line);
border-bottom: 1px solid var(--line);
}
.model-enabled-row span {
display: grid;
gap: 3px;
}
.model-enabled-row strong {
font-size: 10px;
}
.model-enabled-row small {
color: var(--text-faint);
font-size: 8px;
}
.model-enabled-row input {
width: 35px;
height: 19px;
}
.model-advanced-trigger {
margin-top: 10px;
padding: 0;
border: 0;
color: var(--accent-strong);
background: transparent;
font-size: 9px;
font-weight: 650;
}
.model-path-grid {
margin-top: 11px;
}
.model-editor-error {
margin-top: 11px !important;
display: flex;
align-items: center;
gap: 5px;
color: var(--warning);
font-size: 9px;
}
.model-editor-actions {
margin-top: 14px;
display: flex;
justify-content: flex-end;
gap: 8px;
}
.model-group {
border-top: 1px solid var(--line);
}
.model-group-heading {
min-height: 64px;
align-items: center;
}
.model-group-heading > div:nth-child(2) {
flex: 1;
}
.model-group-icon {
width: 34px;
height: 34px;
display: grid;
place-items: center;
border-radius: 9px;
color: var(--accent-strong);
background: var(--accent-soft);
}
.model-empty {
width: 100%;
min-height: 74px;
padding: 12px;
display: flex;
align-items: center;
justify-content: center;
gap: 9px;
border: 1px dashed var(--line-strong);
border-radius: var(--radius-control);
color: var(--text-soft);
background: var(--surface-muted);
text-align: left;
}
.model-empty:hover {
color: var(--text);
border-color: var(--accent);
}
.model-empty span {
display: grid;
gap: 3px;
}
.model-empty strong {
font-size: 10px;
}
.model-empty small {
color: var(--text-faint);
font-size: 8px;
}
.model-list {
display: grid;
gap: 7px;
}
.model-row {
padding: 10px 11px;
display: grid;
grid-template-columns: 30px minmax(170px, 1fr) minmax(120px, auto) auto;
align-items: center;
gap: 9px;
border: 1px solid var(--line);
border-radius: var(--radius-control);
background: var(--surface-raised);
}
.model-row.disabled {
opacity: 0.66;
}
.model-state {
width: 30px;
height: 30px;
display: grid;
place-items: center;
border-radius: 50%;
}
.model-state.ok {
color: var(--accent-strong);
background: var(--accent-soft);
}
.model-state.failed {
color: var(--warning);
background: var(--warning-soft);
}
.model-state.untested {
color: var(--text-faint);
background: var(--surface-muted);
}
.model-identity {
min-width: 0;
display: grid;
grid-template-columns: auto 1fr;
gap: 3px 7px;
align-items: center;
}
.model-identity > div {
min-width: 0;
display: flex;
align-items: center;
gap: 6px;
}
.model-identity strong {
overflow: hidden;
font-size: 10px;
text-overflow: ellipsis;
white-space: nowrap;
}
.model-identity small {
color: var(--warning);
font-size: 8px;
}
.model-identity code {
overflow: hidden;
grid-column: 1 / -1;
color: var(--text-soft);
font-family: "Cascadia Code", monospace;
font-size: 9px;
text-overflow: ellipsis;
white-space: nowrap;
}
.model-identity > span {
grid-column: 1 / -1;
color: var(--text-faint);
font-size: 8px;
}
.model-capability-list {
display: flex;
flex-wrap: wrap;
justify-content: flex-end;
gap: 4px;
}
.model-row-actions {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 5px;
}
.icon-button.danger {
color: var(--warning);
}
.model-test-message {
grid-column: 2 / -1;
color: var(--text-faint) !important;
font-size: 8px !important;
line-height: 1.45 !important;
}
.model-test-message.ok {
color: var(--accent-strong) !important;
}
.model-test-message.failed {
color: var(--warning) !important;
}
.model-routing {
border-top: 1px solid var(--line);
}
.model-routing-heading {
padding: 15px 0 12px;
}
.model-routing-heading > svg {
flex: 0 0 auto;
color: var(--accent-strong);
}
.routing-row {
min-height: 66px;
padding: 11px 0;
display: grid;
grid-template-columns: minmax(180px, 1fr) minmax(210px, 0.82fr);
align-items: center;
gap: 10px 18px;
border-top: 1px solid var(--line);
}
.routing-row strong {
font-size: 10px;
}
.routing-row-adaptive {
grid-template-columns: minmax(180px, 1fr) minmax(165px, 0.54fr) minmax(210px, 0.72fr);
}
.routing-auto-note {
margin: 0 !important;
padding: 9px 10px;
border-radius: 8px;
background: var(--surface-muted);
}
.spin {
animation: settings-spin 900ms linear infinite;
}
@@ -1449,6 +1878,52 @@ textarea:focus-visible,
margin-top: 6px;
}
.model-pool-intro {
align-items: flex-start;
flex-direction: column;
}
.model-pool-summary {
justify-content: flex-start;
}
.model-editor-grid,
.routing-row,
.routing-row-adaptive {
grid-template-columns: 1fr;
}
.model-input-wide {
grid-column: auto;
}
.model-group-heading {
align-items: flex-start;
padding: 12px 0;
}
.model-group-heading .button {
margin-left: auto;
}
.model-row {
grid-template-columns: 30px minmax(0, 1fr) auto;
}
.model-capability-list {
grid-column: 2 / -1;
justify-content: flex-start;
}
.model-row-actions {
grid-column: 3;
grid-row: 1;
}
.model-test-message {
grid-column: 2 / -1;
}
.settings-footer {
padding: 10px 12px;
}