@memberjunction/ng-dashboards 5.25.0 → 5.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts +96 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js +710 -0
- package/dist/AI/components/analytics/agent-runs/agent-run-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts +52 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.js +356 -0
- package/dist/AI/components/analytics/ai-analytics-resource.component.js.map +1 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts +52 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.js +306 -0
- package/dist/AI/components/analytics/analytics-filter-bar.component.js.map +1 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts +81 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js +744 -0
- package/dist/AI/components/analytics/cost-budget/cost-budget.component.js.map +1 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts +61 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js +490 -0
- package/dist/AI/components/analytics/error-analysis/error-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts +77 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js +673 -0
- package/dist/AI/components/analytics/executive-summary/executive-summary.component.js.map +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts +65 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.js +537 -0
- package/dist/AI/components/analytics/model-performance/model-performance.component.js.map +1 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts +131 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js +1030 -0
- package/dist/AI/components/analytics/prompt-runs/prompt-run-analysis.component.js.map +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts +78 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.d.ts.map +1 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js +569 -0
- package/dist/AI/components/analytics/usage-patterns/usage-patterns.component.js.map +1 -0
- package/dist/AI/components/execution-monitoring.component.d.ts.map +1 -1
- package/dist/AI/components/execution-monitoring.component.js +4 -14
- package/dist/AI/components/execution-monitoring.component.js.map +1 -1
- package/dist/AI/components/overview/ai-overview-hub.component.d.ts +58 -0
- package/dist/AI/components/overview/ai-overview-hub.component.d.ts.map +1 -0
- package/dist/AI/components/overview/ai-overview-hub.component.js +315 -0
- package/dist/AI/components/overview/ai-overview-hub.component.js.map +1 -0
- package/dist/AI/components/prompts/prompt-management.component.js +1 -1
- package/dist/AI/components/prompts/prompt-management.component.js.map +1 -1
- package/dist/AI/index.d.ts +11 -0
- package/dist/AI/index.d.ts.map +1 -1
- package/dist/AI/index.js +13 -0
- package/dist/AI/index.js.map +1 -1
- package/dist/AI/interfaces/analytics-preferences.interface.d.ts +50 -0
- package/dist/AI/interfaces/analytics-preferences.interface.d.ts.map +1 -0
- package/dist/AI/interfaces/analytics-preferences.interface.js +9 -0
- package/dist/AI/interfaces/analytics-preferences.interface.js.map +1 -0
- package/dist/ComponentStudio/components/artifact-load-dialog.component.d.ts.map +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js +1 -1
- package/dist/ComponentStudio/components/artifact-load-dialog.component.js.map +1 -1
- package/dist/Home/home-dashboard.component.js +2 -2
- package/dist/MCP/index.d.ts +1 -0
- package/dist/MCP/index.d.ts.map +1 -1
- package/dist/MCP/index.js +2 -0
- package/dist/MCP/index.js.map +1 -1
- package/dist/MCP/mcp-dashboard.component.d.ts +1 -0
- package/dist/MCP/mcp-dashboard.component.d.ts.map +1 -1
- package/dist/MCP/mcp-dashboard.component.js +5 -4
- package/dist/MCP/mcp-dashboard.component.js.map +1 -1
- package/dist/MCP/mcp-resource.component.d.ts +6 -5
- package/dist/MCP/mcp-resource.component.d.ts.map +1 -1
- package/dist/MCP/mcp-resource.component.js +7 -8
- package/dist/MCP/mcp-resource.component.js.map +1 -1
- package/dist/ai-dashboards.module.d.ts +27 -17
- package/dist/ai-dashboards.module.d.ts.map +1 -1
- package/dist/ai-dashboards.module.js +66 -3
- package/dist/ai-dashboards.module.js.map +1 -1
- package/dist/public-api.d.ts +1 -1
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +1 -1
- package/dist/public-api.js.map +1 -1
- package/package.json +49 -48
- package/dist/__tests__/analytics-resource.test.d.ts +0 -2
- package/dist/__tests__/analytics-resource.test.d.ts.map +0 -1
- package/dist/__tests__/analytics-resource.test.js +0 -181
- package/dist/__tests__/analytics-resource.test.js.map +0 -1
- package/dist/__tests__/dashboards.test.d.ts +0 -2
- package/dist/__tests__/dashboards.test.d.ts.map +0 -1
- package/dist/__tests__/dashboards.test.js +0 -40
- package/dist/__tests__/dashboards.test.js.map +0 -1
- package/dist/__tests__/integration-data-service.test.d.ts +0 -2
- package/dist/__tests__/integration-data-service.test.d.ts.map +0 -1
- package/dist/__tests__/integration-data-service.test.js +0 -132
- package/dist/__tests__/integration-data-service.test.js.map +0 -1
- package/dist/__tests__/mapping-validation.test.d.ts +0 -2
- package/dist/__tests__/mapping-validation.test.d.ts.map +0 -1
- package/dist/__tests__/mapping-validation.test.js +0 -170
- package/dist/__tests__/mapping-validation.test.js.map +0 -1
- package/dist/__tests__/scheduling.test.d.ts +0 -2
- package/dist/__tests__/scheduling.test.d.ts.map +0 -1
- package/dist/__tests__/scheduling.test.js +0 -205
- package/dist/__tests__/scheduling.test.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-budget.component.js","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/cost-budget/cost-budget.component.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * @fileoverview Cost & Budget Analytics -- Option B.\n *\n * Displays cost KPIs with period deltas, a daily cost bar chart with anomaly detection,\n * a cost breakdown treemap, and a detailed cost-by-model table with CSV export.\n */\n\nimport {\n Component, Input, Output, EventEmitter,\n OnInit, OnDestroy, ChangeDetectorRef, inject\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { RunView } from '@memberjunction/core';\nimport { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';\n\n// ── Interfaces ──\n\ninterface PromptRunRecord {\n ID: string;\n RunAt: string;\n Cost: number | null;\n TotalCost: number | null;\n TokensPrompt: number | null;\n TokensCompletion: number | null;\n TokensUsed: number | null;\n ModelID: string | null;\n Model: string | null;\n VendorID: string | null;\n Vendor: string | null;\n Success: boolean;\n}\n\ninterface CostKpi {\n Label: string;\n Value: string;\n Delta: number | null;\n DeltaDirection: 'up' | 'down' | 'stable';\n Highlighted: boolean;\n Icon: string;\n}\n\ninterface DailyBar {\n Date: string;\n Label: string;\n Cost: number;\n HeightPercent: number;\n IsAnomaly: boolean;\n}\n\ninterface TreemapCell {\n Label: string;\n Cost: number;\n Percent: number;\n Color: string;\n GridArea: string;\n}\n\ninterface CostByModelRow {\n Model: string;\n Vendor: string;\n Runs: number;\n InputTokens: number;\n OutputTokens: number;\n InputCost: number;\n OutputCost: number;\n TotalCost: number;\n PercentOfTotal: number;\n}\n\nconst FIELDS = [\n 'ID', 'RunAt', 'Cost', 'TotalCost', 'TokensPrompt', 'TokensCompletion',\n 'TokensUsed', 'ModelID', 'Model', 'VendorID', 'Vendor', 'Success'\n];\n\nconst TIME_RANGE_OPTIONS = ['Today', '7d', '30d', 'MTD'];\n\nconst TREEMAP_COLORS = [\n 'var(--mj-brand-primary)',\n 'var(--mj-brand-accent, var(--mj-brand-primary-hover))',\n 'var(--mj-status-info)',\n 'var(--mj-status-success)',\n 'var(--mj-status-warning)',\n 'var(--mj-text-disabled)'\n];\n\n@Component({\n standalone: false,\n selector: 'app-analytics-cost-budget',\n template: `\n <!-- Filter Bar -->\n <app-analytics-filter-bar\n [TimeRange]=\"TimeRange\"\n [TimeRangeOptions]=\"TimeRangeOptionsList\"\n [Filters]=\"Filters\"\n [ShowAgentFilter]=\"false\"\n [ShowPromptFilter]=\"false\"\n [ShowModelFilter]=\"true\"\n [ShowStatusFilter]=\"false\"\n [ShowCompareToggle]=\"false\"\n [ShowExportButton]=\"false\"\n (TimeRangeChange)=\"OnTimeRangeChange($event)\"\n (FiltersChange)=\"OnFiltersChange($event)\"\n ></app-analytics-filter-bar>\n\n @if (IsLoading) {\n <div class=\"loading-container\">\n <mj-loading text=\"Loading cost data...\"></mj-loading>\n </div>\n } @else {\n <!-- Cost KPI Row -->\n <div class=\"kpi-row\">\n @for (kpi of CostKpis; track kpi.Label) {\n <div class=\"kpi-card\" [class.kpi-card--highlighted]=\"kpi.Highlighted\">\n <div class=\"kpi-icon\">\n <i [class]=\"kpi.Icon\"></i>\n </div>\n <div class=\"kpi-content\">\n <div class=\"kpi-label\">{{ kpi.Label }}</div>\n <div class=\"kpi-value\">{{ kpi.Value }}</div>\n @if (kpi.Delta != null) {\n <div class=\"kpi-delta\"\n [class.kpi-delta--up]=\"kpi.DeltaDirection === 'up'\"\n [class.kpi-delta--down]=\"kpi.DeltaDirection === 'down'\">\n @if (kpi.DeltaDirection === 'up') {\n <i class=\"fa-solid fa-arrow-up\"></i>\n } @else if (kpi.DeltaDirection === 'down') {\n <i class=\"fa-solid fa-arrow-down\"></i>\n }\n {{ kpi.Delta | number:'1.1-1' }}% vs prev\n </div>\n }\n </div>\n </div>\n }\n </div>\n\n <!-- Two-Column Layout -->\n <div class=\"two-col\">\n <!-- Daily Cost Trend -->\n <div class=\"panel panel-chart\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-chart-column panel-header__icon\"></i>\n Daily Cost Trend\n </div>\n </div>\n <div class=\"chart-body\">\n @if (DailyBars.length === 0) {\n <div class=\"panel-empty\">No cost data for selected period</div>\n } @else {\n <div class=\"bar-chart\">\n <div class=\"bar-chart-area\">\n @if (AvgLinePercent > 0) {\n <div class=\"avg-line\" [style.bottom.%]=\"AvgLinePercent\">\n <span class=\"avg-label\">avg</span>\n </div>\n }\n @for (bar of DailyBars; track bar.Date) {\n <div class=\"bar-col\" [title]=\"bar.Label + ': ' + FormatCurrency(bar.Cost)\">\n <div\n class=\"bar\"\n [class.bar--anomaly]=\"bar.IsAnomaly\"\n [style.height.%]=\"bar.HeightPercent\"\n ></div>\n <div class=\"bar-label\">{{ bar.Label }}</div>\n </div>\n }\n </div>\n </div>\n }\n </div>\n </div>\n\n <!-- Cost Breakdown Treemap -->\n <div class=\"panel panel-treemap\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-chart-pie panel-header__icon\"></i>\n Cost by Vendor\n </div>\n </div>\n <div class=\"treemap-body\">\n @if (TreemapCells.length === 0) {\n <div class=\"panel-empty\">No vendor cost data</div>\n } @else {\n <div class=\"treemap-grid\">\n @for (cell of TreemapCells; track cell.Label) {\n <div\n class=\"treemap-cell\"\n [style.background]=\"cell.Color\"\n [style.flex-basis.%]=\"cell.Percent\"\n [title]=\"cell.Label + ': ' + FormatCurrency(cell.Cost) + ' (' + (cell.Percent | number:'1.0-0') + '%)'\">\n <span class=\"treemap-label\">{{ cell.Label }}</span>\n <span class=\"treemap-value\">{{ FormatCurrency(cell.Cost) }}</span>\n <span class=\"treemap-pct\">{{ cell.Percent | number:'1.0-0' }}%</span>\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n\n <!-- Cost by Model Table -->\n <div class=\"panel\">\n <div class=\"panel-header\">\n <div class=\"panel-header__title\">\n <i class=\"fa-solid fa-table panel-header__icon\"></i>\n Cost by Model\n </div>\n <button class=\"export-btn\" (click)=\"ExportCSV()\">\n <i class=\"fa-solid fa-download\"></i>\n Export CSV\n </button>\n </div>\n <div class=\"table-wrapper\">\n <table class=\"data-table\">\n <thead>\n <tr>\n <th>Model</th>\n <th>Vendor</th>\n <th class=\"col-numeric\">Runs</th>\n <th class=\"col-numeric\">Input Tokens</th>\n <th class=\"col-numeric\">Output Tokens</th>\n <th class=\"col-numeric\">Input Cost</th>\n <th class=\"col-numeric\">Output Cost</th>\n <th class=\"col-numeric\">Total Cost</th>\n <th class=\"col-numeric\">% of Total</th>\n </tr>\n </thead>\n <tbody>\n @if (CostByModelRows.length === 0) {\n <tr><td colspan=\"9\" class=\"empty-row\">No data available</td></tr>\n }\n @for (row of CostByModelRows; track row.Model) {\n <tr>\n <td class=\"cell-model\">{{ row.Model }}</td>\n <td class=\"cell-vendor\">{{ row.Vendor }}</td>\n <td class=\"cell-numeric\">{{ row.Runs | number }}</td>\n <td class=\"cell-numeric\">{{ row.InputTokens | number }}</td>\n <td class=\"cell-numeric\">{{ row.OutputTokens | number }}</td>\n <td class=\"cell-numeric\">{{ FormatCurrency(row.InputCost, 4) }}</td>\n <td class=\"cell-numeric\">{{ FormatCurrency(row.OutputCost, 4) }}</td>\n <td class=\"cell-numeric cell-cost\">{{ FormatCurrency(row.TotalCost) }}</td>\n <td class=\"cell-numeric\">{{ row.PercentOfTotal | number:'1.1-1' }}%</td>\n </tr>\n }\n </tbody>\n </table>\n </div>\n </div>\n }\n `,\n styles: [`\n :host { display: block; }\n\n .loading-container {\n display: flex;\n justify-content: center;\n align-items: center;\n min-height: 300px;\n }\n\n /* ── KPI Row ── */\n .kpi-row {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\n gap: 12px;\n margin: 16px 0;\n }\n\n .kpi-card {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 10px;\n padding: 16px;\n display: flex;\n align-items: flex-start;\n gap: 12px;\n transition: transform 0.2s ease, box-shadow 0.2s ease;\n }\n\n .kpi-card:hover {\n transform: translateY(-2px);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 8%, transparent);\n }\n\n .kpi-card--highlighted {\n border-color: var(--mj-brand-primary);\n background: color-mix(in srgb, var(--mj-brand-primary) 5%, var(--mj-bg-surface));\n }\n\n .kpi-icon {\n width: 36px;\n height: 36px;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: color-mix(in srgb, var(--mj-brand-primary) 12%, var(--mj-bg-surface));\n color: var(--mj-brand-primary);\n font-size: 14px;\n flex-shrink: 0;\n }\n\n .kpi-card--highlighted .kpi-icon {\n background: color-mix(in srgb, var(--mj-brand-primary) 20%, var(--mj-bg-surface));\n }\n\n .kpi-label {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n }\n\n .kpi-value {\n font-size: 22px;\n font-weight: 700;\n color: var(--mj-text-primary);\n margin: 2px 0;\n letter-spacing: -0.02em;\n }\n\n .kpi-delta {\n font-size: 11px;\n color: var(--mj-text-muted);\n display: flex;\n align-items: center;\n gap: 3px;\n }\n\n .kpi-delta--up {\n color: var(--mj-status-error);\n }\n\n .kpi-delta--down {\n color: var(--mj-status-success);\n }\n\n /* ── Two-Column Layout ── */\n .two-col {\n display: grid;\n grid-template-columns: 3fr 2fr;\n gap: 16px;\n margin-bottom: 16px;\n }\n\n /* ── Panel ── */\n .panel {\n background: var(--mj-bg-surface);\n border: 1px solid var(--mj-border-default);\n border-radius: 12px;\n overflow: hidden;\n margin-bottom: 16px;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .panel-header__title {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n display: flex;\n align-items: center;\n gap: 8px;\n }\n\n .panel-header__icon {\n font-size: 13px;\n color: var(--mj-brand-primary);\n }\n\n .panel-empty {\n text-align: center;\n padding: 32px;\n color: var(--mj-text-disabled);\n font-size: 13px;\n }\n\n .export-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 5px 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 6px;\n background: var(--mj-bg-surface);\n color: var(--mj-text-secondary);\n font-size: 13px;\n cursor: pointer;\n transition: background 0.15s, color 0.15s;\n }\n\n .export-btn:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n /* ── Bar Chart ── */\n .chart-body {\n padding: 16px 18px;\n }\n\n .bar-chart {\n width: 100%;\n }\n\n .bar-chart-area {\n display: flex;\n align-items: flex-end;\n gap: 4px;\n height: 180px;\n position: relative;\n padding-bottom: 24px;\n }\n\n .bar-col {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n height: 100%;\n justify-content: flex-end;\n }\n\n .bar {\n width: 100%;\n max-width: 32px;\n border-radius: 4px 4px 0 0;\n background: var(--mj-brand-primary);\n transition: height 0.4s cubic-bezier(0.4, 0, 0.2, 1);\n min-height: 2px;\n }\n\n .bar--anomaly {\n background: var(--mj-status-error);\n }\n\n .bar-label {\n font-size: 10px;\n color: var(--mj-text-muted);\n margin-top: 4px;\n white-space: nowrap;\n }\n\n .avg-line {\n position: absolute;\n left: 0;\n right: 0;\n border-top: 2px dashed var(--mj-text-disabled);\n z-index: 1;\n pointer-events: none;\n }\n\n .avg-label {\n position: absolute;\n right: 0;\n top: -14px;\n font-size: 10px;\n color: var(--mj-text-disabled);\n font-weight: 600;\n }\n\n /* ── Treemap ── */\n .treemap-body {\n padding: 16px 18px;\n }\n\n .treemap-grid {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n min-height: 160px;\n }\n\n .treemap-cell {\n border-radius: 8px;\n padding: 12px;\n display: flex;\n flex-direction: column;\n justify-content: center;\n min-width: 80px;\n min-height: 70px;\n flex-grow: 1;\n color: var(--mj-text-inverse, white);\n transition: opacity 0.2s;\n }\n\n .treemap-cell:hover {\n opacity: 0.85;\n }\n\n .treemap-label {\n font-size: 12px;\n font-weight: 600;\n opacity: 0.95;\n }\n\n .treemap-value {\n font-size: 16px;\n font-weight: 700;\n margin-top: 2px;\n }\n\n .treemap-pct {\n font-size: 11px;\n opacity: 0.8;\n }\n\n /* ── Table ── */\n .table-wrapper {\n overflow-x: auto;\n }\n\n .data-table {\n width: 100%;\n border-collapse: collapse;\n font-size: 13px;\n }\n\n .data-table th,\n .data-table td {\n padding: 10px 14px;\n text-align: left;\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .data-table th {\n font-size: 11px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.4px;\n background: var(--mj-bg-surface-card);\n position: sticky;\n top: 0;\n white-space: nowrap;\n }\n\n .col-numeric { text-align: right; }\n\n .data-table tbody tr {\n transition: background 0.15s;\n }\n\n .data-table tbody tr:hover {\n background: var(--mj-bg-surface-hover);\n }\n\n .cell-model {\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .cell-vendor {\n color: var(--mj-text-secondary);\n }\n\n .cell-numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n color: var(--mj-text-secondary);\n }\n\n .cell-cost {\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n\n .empty-row {\n text-align: center;\n color: var(--mj-text-disabled);\n padding: 24px;\n }\n\n /* ── Responsive ── */\n @media (max-width: 1200px) {\n .two-col {\n grid-template-columns: 1fr;\n }\n }\n\n @media (max-width: 768px) {\n .kpi-row {\n grid-template-columns: repeat(2, 1fr);\n }\n\n .kpi-value {\n font-size: 18px;\n }\n }\n `]\n})\nexport class AnalyticsCostBudgetComponent implements OnInit, OnDestroy {\n @Input() TimeRange = '7d';\n @Input() Filters: GlobalFilterState = { Models: [], Agents: [], Prompts: [], Statuses: [] };\n\n @Output() TimeRangeChange = new EventEmitter<string>();\n @Output() FiltersChange = new EventEmitter<GlobalFilterState>();\n\n private cdr = inject(ChangeDetectorRef);\n private destroy$ = new Subject<void>();\n\n public IsLoading = false;\n public TimeRangeOptionsList = TIME_RANGE_OPTIONS;\n\n public CostKpis: CostKpi[] = [];\n public DailyBars: DailyBar[] = [];\n public AvgLinePercent = 0;\n public TreemapCells: TreemapCell[] = [];\n public CostByModelRows: CostByModelRow[] = [];\n\n private allRuns: PromptRunRecord[] = [];\n private previousPeriodRuns: PromptRunRecord[] = [];\n\n ngOnInit(): void {\n this.LoadData();\n }\n\n ngOnDestroy(): void {\n this.destroy$.next();\n this.destroy$.complete();\n }\n\n // ── Public Handlers ──\n\n public OnTimeRangeChange(range: string): void {\n this.TimeRange = range;\n this.TimeRangeChange.emit(range);\n this.LoadData();\n }\n\n public OnFiltersChange(filters: GlobalFilterState): void {\n this.Filters = filters;\n this.FiltersChange.emit(filters);\n this.LoadData();\n }\n\n public FormatCurrency(value: number, decimals = 2): string {\n if (value === 0) return '$0.00';\n if (value < 0.01 && decimals < 4) decimals = 4;\n return '$' + value.toFixed(decimals);\n }\n\n public ExportCSV(): void {\n const header = 'Model,Vendor,Runs,Input Tokens,Output Tokens,Input Cost,Output Cost,Total Cost,% of Total';\n const rows = this.CostByModelRows.map(r =>\n `\"${r.Model}\",\"${r.Vendor}\",${r.Runs},${r.InputTokens},${r.OutputTokens},${r.InputCost.toFixed(6)},${r.OutputCost.toFixed(6)},${r.TotalCost.toFixed(6)},${r.PercentOfTotal.toFixed(1)}`\n );\n const csv = [header, ...rows].join('\\n');\n this.downloadCSV(csv, 'cost-by-model.csv');\n }\n\n // ── Data Loading ──\n\n private async LoadData(): Promise<void> {\n this.IsLoading = true;\n this.cdr.detectChanges();\n\n try {\n const rv = new RunView();\n const { currentStart, previousStart } = this.getDateBounds();\n const now = new Date();\n const modelFilter = this.buildModelFilter();\n const currentFilter = this.combineDateAndModelFilter(currentStart, now, modelFilter);\n const prevFilter = this.combineDateAndModelFilter(previousStart, currentStart, modelFilter);\n\n const [currentResult, prevResult] = await rv.RunViews([\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: currentFilter,\n Fields: FIELDS,\n OrderBy: 'RunAt ASC',\n ResultType: 'simple'\n },\n {\n EntityName: 'MJ: AI Prompt Runs',\n ExtraFilter: prevFilter,\n Fields: FIELDS,\n OrderBy: 'RunAt ASC',\n ResultType: 'simple'\n }\n ]);\n\n this.allRuns = (currentResult?.Results ?? []) as PromptRunRecord[];\n this.previousPeriodRuns = (prevResult?.Results ?? []) as PromptRunRecord[];\n\n this.computeKpis();\n this.computeDailyBars();\n this.computeTreemap();\n this.computeCostByModel();\n } catch (e) {\n console.error('Cost & Budget load error:', e);\n } finally {\n this.IsLoading = false;\n this.cdr.detectChanges();\n }\n }\n\n // ── Computations ──\n\n private computeKpis(): void {\n const now = new Date();\n const todayStart = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n const weekStart = new Date(todayStart.getTime() - 6 * 86400000);\n const monthStart = new Date(now.getFullYear(), now.getMonth(), 1);\n\n const todaySpend = this.sumCostInRange(this.allRuns, todayStart, now);\n const weekSpend = this.sumCostInRange(this.allRuns, weekStart, now);\n const monthSpend = this.sumCostInRange(this.allRuns, monthStart, now);\n\n const prevTotalCost = this.previousPeriodRuns.reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n const currentTotalCost = this.allRuns.reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n\n // Project monthly cost based on current daily average\n const daysIntoMonth = Math.max(1, now.getDate());\n const projectedMonthly = (monthSpend / daysIntoMonth) * new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate();\n\n const delta = prevTotalCost > 0 ? ((currentTotalCost - prevTotalCost) / prevTotalCost) * 100 : null;\n\n this.CostKpis = [\n {\n Label: \"Today's Spend\",\n Value: this.FormatCurrency(todaySpend),\n Delta: null,\n DeltaDirection: 'stable',\n Highlighted: false,\n Icon: 'fa-solid fa-calendar-day'\n },\n {\n Label: 'This Week',\n Value: this.FormatCurrency(weekSpend),\n Delta: null,\n DeltaDirection: 'stable',\n Highlighted: false,\n Icon: 'fa-solid fa-calendar-week'\n },\n {\n Label: 'This Month',\n Value: this.FormatCurrency(monthSpend),\n Delta: delta,\n DeltaDirection: delta != null ? (delta > 0 ? 'up' : delta < 0 ? 'down' : 'stable') : 'stable',\n Highlighted: false,\n Icon: 'fa-solid fa-calendar'\n },\n {\n Label: 'Projected Monthly',\n Value: this.FormatCurrency(projectedMonthly),\n Delta: null,\n DeltaDirection: 'stable',\n Highlighted: true,\n Icon: 'fa-solid fa-chart-line'\n }\n ];\n }\n\n private computeDailyBars(): void {\n const buckets = new Map<string, number>();\n for (const run of this.allRuns) {\n const date = new Date(run.RunAt);\n const key = date.toISOString().slice(0, 10);\n buckets.set(key, (buckets.get(key) ?? 0) + (run.Cost ?? run.TotalCost ?? 0));\n }\n\n const sortedKeys = Array.from(buckets.keys()).sort();\n const values = sortedKeys.map(k => buckets.get(k) ?? 0);\n const maxVal = Math.max(...values, 0.001);\n\n // Anomaly detection: > 2 standard deviations from mean\n const mean = values.length > 0 ? values.reduce((s, v) => s + v, 0) / values.length : 0;\n const variance = values.length > 1\n ? values.reduce((s, v) => s + Math.pow(v - mean, 2), 0) / values.length\n : 0;\n const stdDev = Math.sqrt(variance);\n const anomalyThreshold = mean + 2 * stdDev;\n\n this.DailyBars = sortedKeys.map((key, i) => ({\n Date: key,\n Label: this.formatBarLabel(key),\n Cost: values[i],\n HeightPercent: maxVal > 0 ? (values[i] / maxVal) * 100 : 0,\n IsAnomaly: stdDev > 0 && values[i] > anomalyThreshold\n }));\n\n this.AvgLinePercent = maxVal > 0 ? (mean / maxVal) * 100 : 0;\n }\n\n private computeTreemap(): void {\n const vendorCosts = new Map<string, number>();\n for (const run of this.allRuns) {\n const vendor = run.Vendor ?? 'Other';\n vendorCosts.set(vendor, (vendorCosts.get(vendor) ?? 0) + (run.Cost ?? run.TotalCost ?? 0));\n }\n\n const total = Array.from(vendorCosts.values()).reduce((s, v) => s + v, 0);\n const sorted = Array.from(vendorCosts.entries()).sort((a, b) => b[1] - a[1]);\n\n this.TreemapCells = sorted.map(([vendor, cost], i) => ({\n Label: vendor,\n Cost: cost,\n Percent: total > 0 ? (cost / total) * 100 : 0,\n Color: TREEMAP_COLORS[i % TREEMAP_COLORS.length],\n GridArea: ''\n }));\n }\n\n private computeCostByModel(): void {\n const groups = new Map<string, PromptRunRecord[]>();\n for (const run of this.allRuns) {\n const key = run.ModelID ?? 'unknown';\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(run);\n }\n\n const totalCost = this.allRuns.reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n\n const rows: CostByModelRow[] = [];\n for (const [, modelRuns] of groups) {\n const inputTokens = modelRuns.reduce((s, r) => s + (r.TokensPrompt ?? 0), 0);\n const outputTokens = modelRuns.reduce((s, r) => s + (r.TokensCompletion ?? 0), 0);\n const cost = modelRuns.reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n\n // Approximate input/output cost split based on token ratio\n const totalTk = inputTokens + outputTokens;\n const inputCost = totalTk > 0 ? cost * (inputTokens / totalTk) : 0;\n const outputCost = totalTk > 0 ? cost * (outputTokens / totalTk) : 0;\n\n rows.push({\n Model: modelRuns[0].Model ?? 'Unknown',\n Vendor: modelRuns[0].Vendor ?? 'Unknown',\n Runs: modelRuns.length,\n InputTokens: inputTokens,\n OutputTokens: outputTokens,\n InputCost: inputCost,\n OutputCost: outputCost,\n TotalCost: cost,\n PercentOfTotal: totalCost > 0 ? (cost / totalCost) * 100 : 0\n });\n }\n\n this.CostByModelRows = rows.sort((a, b) => b.TotalCost - a.TotalCost);\n }\n\n // ── Helpers ──\n\n private sumCostInRange(runs: PromptRunRecord[], start: Date, end: Date): number {\n return runs\n .filter(r => {\n const d = new Date(r.RunAt);\n return d >= start && d <= end;\n })\n .reduce((s, r) => s + (r.Cost ?? r.TotalCost ?? 0), 0);\n }\n\n private getDateBounds(): { currentStart: Date; previousStart: Date } {\n const now = new Date();\n const msMap: Record<string, number> = {\n 'Today': 86400000,\n '7d': 604800000,\n '30d': 2592000000,\n 'MTD': now.getDate() * 86400000\n };\n const ms = msMap[this.TimeRange] ?? 604800000;\n const currentStart = new Date(now.getTime() - ms);\n const previousStart = new Date(currentStart.getTime() - ms);\n return { currentStart, previousStart };\n }\n\n private buildModelFilter(): string {\n if (this.Filters.Models.length === 0) return '';\n const ids = this.Filters.Models.map(id => `'${id}'`).join(',');\n return `ModelID IN (${ids})`;\n }\n\n private combineDateAndModelFilter(start: Date, end: Date, modelFilter: string): string {\n const parts = [\n `RunAt >= '${start.toISOString()}'`,\n `RunAt <= '${end.toISOString()}'`\n ];\n if (modelFilter) parts.push(modelFilter);\n return parts.join(' AND ');\n }\n\n private formatBarLabel(dateStr: string): string {\n const d = new Date(dateStr + 'T00:00:00');\n const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n return months[d.getMonth()] + ' ' + d.getDate();\n }\n\n private downloadCSV(csv: string, filename: string): void {\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.click();\n URL.revokeObjectURL(url);\n }\n}\n\nexport function LoadAnalyticsCostBudget() { /* tree-shaking prevention */ }\n"]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Error Analysis -- Basic.
|
|
3
|
+
*
|
|
4
|
+
* Displays error summary cards, and errors grouped by source (Prompt+Model combination).
|
|
5
|
+
* Each group can be expanded to show individual error details.
|
|
6
|
+
* Data loaded from MJ: AI Prompt Runs where Success=false.
|
|
7
|
+
*/
|
|
8
|
+
import { OnInit, OnDestroy } from '@angular/core';
|
|
9
|
+
import { GlobalFilterState } from '../../../interfaces/analytics-preferences.interface';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
interface ErrorSummary {
|
|
12
|
+
TotalErrors: number;
|
|
13
|
+
ErrorRate: number;
|
|
14
|
+
MostCommonError: string;
|
|
15
|
+
}
|
|
16
|
+
interface ErrorGroup {
|
|
17
|
+
Source: string;
|
|
18
|
+
PromptName: string;
|
|
19
|
+
ModelName: string;
|
|
20
|
+
Count: number;
|
|
21
|
+
LastErrorMessage: string;
|
|
22
|
+
LastErrorTime: string;
|
|
23
|
+
IsExpanded: boolean;
|
|
24
|
+
Errors: ErrorDetail[];
|
|
25
|
+
}
|
|
26
|
+
interface ErrorDetail {
|
|
27
|
+
ID: string;
|
|
28
|
+
Time: string;
|
|
29
|
+
ErrorMessage: string;
|
|
30
|
+
Duration: string;
|
|
31
|
+
}
|
|
32
|
+
export declare class AnalyticsErrorAnalysisComponent implements OnInit, OnDestroy {
|
|
33
|
+
TimeRange: string;
|
|
34
|
+
Filters: GlobalFilterState;
|
|
35
|
+
private cdr;
|
|
36
|
+
private destroy$;
|
|
37
|
+
IsLoading: boolean;
|
|
38
|
+
Summary: ErrorSummary;
|
|
39
|
+
ErrorGroups: ErrorGroup[];
|
|
40
|
+
private failedRuns;
|
|
41
|
+
private totalRunCount;
|
|
42
|
+
ngOnInit(): void;
|
|
43
|
+
ngOnDestroy(): void;
|
|
44
|
+
OnTimeRangeChange(range: string): void;
|
|
45
|
+
OnFiltersChange(filters: GlobalFilterState): void;
|
|
46
|
+
ToggleGroup(group: ErrorGroup): void;
|
|
47
|
+
private LoadData;
|
|
48
|
+
private computeSummary;
|
|
49
|
+
private buildErrorGroups;
|
|
50
|
+
private buildDateFilter;
|
|
51
|
+
private buildExtraFilters;
|
|
52
|
+
private normalizeErrorMessage;
|
|
53
|
+
private truncateMessage;
|
|
54
|
+
private formatRelativeTime;
|
|
55
|
+
private formatDateTime;
|
|
56
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AnalyticsErrorAnalysisComponent, never>;
|
|
57
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AnalyticsErrorAnalysisComponent, "app-analytics-error-analysis", never, { "TimeRange": { "alias": "TimeRange"; "required": false; }; "Filters": { "alias": "Filters"; "required": false; }; }, {}, never, never, false, never>;
|
|
58
|
+
}
|
|
59
|
+
export declare function LoadAnalyticsErrorAnalysis(): void;
|
|
60
|
+
export {};
|
|
61
|
+
//# sourceMappingURL=error-analysis.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-analysis.component.d.ts","sourceRoot":"","sources":["../../../../../src/AI/components/analytics/error-analysis/error-analysis.component.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAEH,MAAM,EAAE,SAAS,EACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,qDAAqD,CAAC;;AAexF,UAAU,YAAY;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,UAAU;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,UAAU,WAAW;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAOD,qBAoYa,+BAAgC,YAAW,MAAM,EAAE,SAAS;IAC5D,SAAS,SAAQ;IACjB,OAAO,EAAE,iBAAiB,CAAyD;IAE5F,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,QAAQ,CAAuB;IAEhC,SAAS,UAAS;IAElB,OAAO,EAAE,YAAY,CAI1B;IAEK,WAAW,EAAE,UAAU,EAAE,CAAM;IAEtC,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,aAAa,CAAK;IAE1B,QAAQ,IAAI,IAAI;IAIhB,WAAW,IAAI,IAAI;IAOZ,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKtC,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,IAAI;IAKjD,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;YAO7B,QAAQ;IA0CtB,OAAO,CAAC,cAAc;IA2BtB,OAAO,CAAC,gBAAgB;IAsCxB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,cAAc;yCAvMb,+BAA+B;2CAA/B,+BAA+B;CA8M3C;AAED,wBAAgB,0BAA0B,SAAoC"}
|