Files
fusion/packages/dashboard/app/components/settings/sections/ModelPricingSection.css
gsxdsm efb94c8623 FN-6876: add editable model pricing refresh
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
2026-06-23 01:14:11 -07:00

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);
}
}