Add editable model pricing overrides and a LiteLLM refresh path for usage cost analytics. - Add persisted model pricing override settings and apply them to token and team analytics cost calculations. - Add a Command Center pricing fetch endpoint that imports chat pricing from LiteLLM and invalidates settings caches. - Add a Global Models pricing editor with manual rows, removal, and one-click fetch support. - Cover override lookup, settings parity, analytics, route behavior, and UI editing with tests and docs. Files changed: .changeset/model-pricing-overrides.md | 5 + docs/architecture.md | 3 +- docs/dashboard-guide.md | 5 +- docs/settings-reference.md | 3 + packages/core/src/__tests__/model-pricing.test.ts | 101 +++++++++++ .../core/src/__tests__/settings-parity.test.ts | 4 + packages/core/src/__tests__/store-settings.test.ts | 25 +++ .../core/src/__tests__/token-analytics.test.ts | 39 +++++ packages/core/src/index.ts | 4 + packages/core/src/model-pricing.ts | 118 +++++++++++-- packages/core/src/settings-schema.ts | 3 + packages/core/src/team-analytics.ts | 17 +- packages/core/src/token-analytics.ts | 19 +- packages/core/src/types.ts | 12 ++ .../dashboard/app/components/SettingsModal.tsx | 2 + .../settings/sections/GlobalModelsSection.tsx | 8 +- .../settings/sections/ModelPricingSection.css | 82 +++++++++ .../settings/sections/ModelPricingSection.test.tsx | 126 ++++++++++++++ .../settings/sections/ModelPricingSection.tsx | 193 +++++++++++++++++++++ .../register-command-center-routes.test.ts | 172 +++++++++++++++++- .../src/routes/register-command-center-routes.ts | 58 +++++++ 21 files changed, 967 insertions(+), 32 deletions(-) Fusion-Task-Id: FN-6876 Fusion-Task-Lineage: 4d4e3b9d-bec4-4e14-b7bc-88f846465566
83 lines
1.6 KiB
CSS
83 lines
1.6 KiB
CSS
.model-pricing-section {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--spacing-md, var(--space-md));
|
|
}
|
|
|
|
.model-pricing-section__header {
|
|
display: flex;
|
|
align-items: flex-start;
|
|
justify-content: space-between;
|
|
gap: var(--spacing-md, var(--space-md));
|
|
}
|
|
|
|
.model-pricing-section__meta {
|
|
margin: var(--spacing-xs, var(--space-xs)) 0 0;
|
|
}
|
|
|
|
.model-pricing-table {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: var(--spacing-xs, var(--space-xs));
|
|
overflow-x: auto;
|
|
}
|
|
|
|
.model-pricing-row {
|
|
display: grid;
|
|
grid-template-columns:
|
|
minmax(12rem, 1.4fr)
|
|
minmax(7rem, 1fr)
|
|
minmax(7rem, 1fr)
|
|
minmax(7rem, 1fr)
|
|
minmax(7rem, 1fr)
|
|
minmax(10rem, 1.2fr)
|
|
minmax(5rem, auto);
|
|
gap: var(--spacing-xs, var(--space-xs));
|
|
align-items: center;
|
|
}
|
|
|
|
.model-pricing-row--head {
|
|
color: var(--text-muted);
|
|
font-size: var(--font-size-xs, 0.75rem);
|
|
font-weight: 600;
|
|
}
|
|
|
|
.model-pricing-row--add {
|
|
padding-top: var(--spacing-xs, var(--space-xs));
|
|
border-top: thin solid var(--border);
|
|
}
|
|
|
|
.model-pricing-key {
|
|
overflow-wrap: anywhere;
|
|
color: var(--text);
|
|
}
|
|
|
|
.model-pricing-empty {
|
|
grid-column: 1 / -1;
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.model-pricing-section__header {
|
|
flex-direction: column;
|
|
}
|
|
|
|
.model-pricing-section__header .btn {
|
|
width: 100%;
|
|
}
|
|
|
|
.model-pricing-row {
|
|
grid-template-columns: minmax(14rem, 1fr);
|
|
padding: var(--spacing-sm, var(--space-sm));
|
|
border: thin solid var(--border);
|
|
border-radius: var(--radius-md);
|
|
}
|
|
|
|
.model-pricing-row--head {
|
|
display: none;
|
|
}
|
|
|
|
.model-pricing-row--add {
|
|
border-top: thin solid var(--border);
|
|
}
|
|
}
|