@roastcodes/ttdash 6.1.9 → 6.2.1
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/assets/AnomalyDetection-BdGl1xvC.js +1 -0
- package/dist/assets/{AutoImportModal-C8gA0_mL.js → AutoImportModal-bokip1Pn.js} +3 -3
- package/dist/assets/CacheROI-IyVKLGZu.js +1 -0
- package/dist/assets/ChartCard-CBUnItl-.js +2 -0
- package/dist/assets/ChartLegend-B64cJdDI.js +1 -0
- package/dist/assets/CorrelationAnalysis-Dnd0YUCO.js +1 -0
- package/dist/assets/CostByModelOverTime-C10Hr2xR.js +1 -0
- package/dist/assets/CostByWeekday-X20qjGNA.js +1 -0
- package/dist/assets/CostForecast-C--EIZ4B.js +1 -0
- package/dist/assets/CumulativeCost-D9v6GDcr.js +1 -0
- package/dist/assets/CustomTooltip-CBVU1pyK.js +1 -0
- package/dist/assets/DistributionAnalysis-Cdly0pAu.js +1 -0
- package/dist/assets/DrillDownModal-BXf7B9B8.js +1 -0
- package/dist/assets/HelpPanel-HNxQElT5.js +1 -0
- package/dist/assets/InfoButton-CTgLGzb9.js +1 -0
- package/dist/assets/InfoHeading-oi90uCR7.js +1 -0
- package/dist/assets/MetricCard-Drluz0b9.js +1 -0
- package/dist/assets/ModelEfficiency-CZ4ZzDtA.js +1 -0
- package/dist/assets/ModelMix-TDHxSk5H.js +1 -0
- package/dist/assets/PeriodComparison-B9WuoaCr.js +1 -0
- package/dist/assets/ProviderEfficiency-DpDIYr_l.js +1 -0
- package/dist/assets/ProviderLimitsSection-CSuisho_.js +1 -0
- package/dist/assets/RecentDays-Cz4Yd_-Q.js +1 -0
- package/dist/assets/RequestCacheHitRateByModel-5bkvg7Hx.js +1 -0
- package/dist/assets/RequestQuality-iUIOJrpr.js +1 -0
- package/dist/assets/RequestsOverTime-D10OssgN.js +1 -0
- package/dist/assets/SettingsModal-D9-T5heB.js +1 -0
- package/dist/assets/TokenEfficiency-CGeyr8Zq.js +1 -0
- package/dist/assets/TokenTypes-BiRBF9VP.js +1 -0
- package/dist/assets/TokensOverTime-DeT3D-aC.js +1 -0
- package/dist/assets/app-settings-C3i52ycx.js +1 -0
- package/dist/assets/button-D--hHeVj.js +1 -0
- package/dist/assets/calculations-GOdNqKo6.js +1 -0
- package/dist/assets/card-h-Z9EWBl.js +1 -0
- package/dist/assets/chart-theme-D5iCFDJg.js +1 -0
- package/dist/assets/constants-jyhBMReu.js +1 -0
- package/dist/assets/dialog-C0AeNKs8.js +1 -0
- package/dist/assets/formatted-value-rO0EpKbc.js +1 -0
- package/dist/assets/formatters-yKppUXb3.js +1 -0
- package/dist/assets/help-content-Bt5KCpWS.js +1 -0
- package/dist/assets/i18n-C88wS2Uy.js +1 -0
- package/dist/assets/index-DjMakAzD.js +3 -0
- package/dist/assets/index-DuoM1Ukq.css +2 -0
- package/dist/assets/model-utils-BIvGAFGz.js +1 -0
- package/dist/assets/motion-vendor-vKc6gXHZ.js +1 -0
- package/dist/assets/provider-limits-5e1fUwPl.js +1 -0
- package/dist/assets/section-header-DbV45zH5.js +1 -0
- package/dist/assets/ui-vendor-BolBXLiD.js +45 -0
- package/dist/assets/useTranslation-BSl7t2D6.js +1 -0
- package/dist/index.html +26 -8
- package/package.json +15 -5
- package/server/report/chart-labels.js +12 -0
- package/server/report/charts.js +4 -8
- package/server/report/index.js +86 -27
- package/server/report/utils.js +64 -21
- package/server.js +281 -56
- package/shared/dashboard-domain.d.ts +12 -0
- package/shared/dashboard-domain.js +79 -0
- package/shared/dashboard-types.d.ts +4 -0
- package/shared/model-colors.d.ts +24 -0
- package/shared/model-colors.js +268 -0
- package/src/locales/de/common.json +59 -6
- package/src/locales/en/common.json +59 -5
- package/dist/assets/CustomTooltip-BXro6tIF.js +0 -1
- package/dist/assets/DrillDownModal-BnZ6q6tF.js +0 -1
- package/dist/assets/button-B26tLVFw.js +0 -1
- package/dist/assets/dialog-CA-ZSHjK.js +0 -1
- package/dist/assets/index-BfNaLs3g.js +0 -4
- package/dist/assets/index-BkGSNAne.css +0 -2
- package/dist/assets/motion-vendor-BXI2L__C.js +0 -1
- package/dist/assets/ui-vendor-BGjRFQGY.js +0 -45
- /package/dist/assets/{icons-vendor-z59La6A4.js → icons-vendor-CIvT_-Pb.js} +0 -0
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
const MODEL_COLOR_RULES = [
|
|
2
|
+
{
|
|
3
|
+
pattern: /^OpenCode$/i,
|
|
4
|
+
light: { h: 192, s: 76, l: 40 },
|
|
5
|
+
dark: { h: 192, s: 82, l: 58 },
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
pattern: /^Codex(?: .+)?$/i,
|
|
9
|
+
light: { h: 194, s: 72, l: 38 },
|
|
10
|
+
dark: { h: 194, s: 78, l: 55 },
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
pattern: /^GPT-5\.4 Codex$/i,
|
|
14
|
+
light: { h: 194, s: 76, l: 42 },
|
|
15
|
+
dark: { h: 194, s: 82, l: 60 },
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
pattern: /^GPT-5\.3 Codex$/i,
|
|
19
|
+
light: { h: 194, s: 70, l: 36 },
|
|
20
|
+
dark: { h: 194, s: 74, l: 52 },
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
pattern: /^GPT-5\.4$/i,
|
|
24
|
+
light: { h: 148, s: 68, l: 40 },
|
|
25
|
+
dark: { h: 148, s: 72, l: 57 },
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
pattern: /^GPT-5$/i,
|
|
29
|
+
light: { h: 148, s: 60, l: 33 },
|
|
30
|
+
dark: { h: 148, s: 64, l: 47 },
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
pattern: /^GPT-(?:4o|4\.1)(?: .+)?$/i,
|
|
34
|
+
light: { h: 160, s: 58, l: 34 },
|
|
35
|
+
dark: { h: 160, s: 62, l: 49 },
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
pattern: /^o4 Mini$/i,
|
|
39
|
+
light: { h: 166, s: 64, l: 33 },
|
|
40
|
+
dark: { h: 166, s: 68, l: 48 },
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
pattern: /^o1$/i,
|
|
44
|
+
light: { h: 166, s: 56, l: 30 },
|
|
45
|
+
dark: { h: 166, s: 60, l: 43 },
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
pattern: /^Gemini 3 Flash Preview(?: .+)?$/i,
|
|
49
|
+
light: { h: 48, s: 100, l: 42 },
|
|
50
|
+
dark: { h: 52, s: 98, l: 61 },
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
pattern: /^Gemini 2\.5 Flash$/i,
|
|
54
|
+
light: { h: 44, s: 92, l: 39 },
|
|
55
|
+
dark: { h: 46, s: 94, l: 56 },
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
pattern: /^Gemini 2\.5 Pro$/i,
|
|
59
|
+
light: { h: 38, s: 86, l: 34 },
|
|
60
|
+
dark: { h: 40, s: 88, l: 49 },
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
pattern: /^Gemini(?: .+)?$/i,
|
|
64
|
+
light: { h: 42, s: 88, l: 36 },
|
|
65
|
+
dark: { h: 44, s: 90, l: 52 },
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
pattern: /^(?:Claude\s+)?Opus 4\.6$/i,
|
|
69
|
+
light: { h: 274, s: 68, l: 44 },
|
|
70
|
+
dark: { h: 274, s: 74, l: 66 },
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
pattern: /^(?:Claude\s+)?Opus 4\.5$/i,
|
|
74
|
+
light: { h: 274, s: 58, l: 36 },
|
|
75
|
+
dark: { h: 274, s: 62, l: 56 },
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
pattern: /^(?:Claude\s+)?Opus(?: .+)?$/i,
|
|
79
|
+
light: { h: 274, s: 62, l: 40 },
|
|
80
|
+
dark: { h: 274, s: 68, l: 60 },
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
pattern: /^(?:Claude\s+)?Sonnet 4\.6$/i,
|
|
84
|
+
light: { h: 214, s: 72, l: 44 },
|
|
85
|
+
dark: { h: 214, s: 80, l: 63 },
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
pattern: /^(?:Claude\s+)?Sonnet 4\.5$/i,
|
|
89
|
+
light: { h: 214, s: 60, l: 36 },
|
|
90
|
+
dark: { h: 214, s: 66, l: 52 },
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
pattern: /^(?:Claude\s+)?Sonnet 4$/i,
|
|
94
|
+
light: { h: 214, s: 56, l: 34 },
|
|
95
|
+
dark: { h: 214, s: 62, l: 48 },
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
pattern: /^(?:Claude\s+)?Sonnet(?: .+)?$/i,
|
|
99
|
+
light: { h: 214, s: 64, l: 40 },
|
|
100
|
+
dark: { h: 214, s: 70, l: 56 },
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
pattern: /^(?:Claude\s+)?Haiku 4\.5$/i,
|
|
104
|
+
light: { h: 28, s: 90, l: 43 },
|
|
105
|
+
dark: { h: 28, s: 92, l: 61 },
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
pattern: /^(?:Claude\s+)?Haiku(?: .+)?$/i,
|
|
109
|
+
light: { h: 28, s: 84, l: 38 },
|
|
110
|
+
dark: { h: 28, s: 88, l: 56 },
|
|
111
|
+
},
|
|
112
|
+
]
|
|
113
|
+
|
|
114
|
+
const FALLBACK_HUES = [148, 168, 190, 208, 226, 248, 272, 332, 18, 30, 44]
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Normalizes an unknown theme value to a supported color theme.
|
|
118
|
+
*
|
|
119
|
+
* @param theme - The requested theme value.
|
|
120
|
+
* @returns The normalized shared color theme.
|
|
121
|
+
*/
|
|
122
|
+
function normalizeTheme(theme) {
|
|
123
|
+
return theme === 'light' ? 'light' : 'dark'
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function normalizeAlpha(alpha) {
|
|
127
|
+
if (typeof alpha !== 'number' || !Number.isFinite(alpha)) return null
|
|
128
|
+
if (alpha <= 0) return 0
|
|
129
|
+
if (alpha >= 1) return 1
|
|
130
|
+
return Math.round(alpha * 1000) / 1000
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function hashName(name) {
|
|
134
|
+
let hash = 0
|
|
135
|
+
const value = String(name || '')
|
|
136
|
+
.trim()
|
|
137
|
+
.toLowerCase()
|
|
138
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
139
|
+
hash = ((hash << 5) - hash + value.charCodeAt(index)) | 0
|
|
140
|
+
}
|
|
141
|
+
return hash
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function mod(value, divisor) {
|
|
145
|
+
return ((value % divisor) + divisor) % divisor
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function findKnownColor(name) {
|
|
149
|
+
return MODEL_COLOR_RULES.find((rule) => rule.pattern.test(String(name || '').trim())) ?? null
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function fallbackColor(name, theme) {
|
|
153
|
+
const hash = hashName(name)
|
|
154
|
+
const baseHue = FALLBACK_HUES[mod(hash, FALLBACK_HUES.length)]
|
|
155
|
+
const hueShift = ((Math.abs(hash >> 4) % 7) - 3) * 4
|
|
156
|
+
const hue = mod(baseHue + hueShift, 360)
|
|
157
|
+
|
|
158
|
+
if (theme === 'light') {
|
|
159
|
+
return {
|
|
160
|
+
h: hue,
|
|
161
|
+
s: 62 + (Math.abs(hash >> 8) % 10),
|
|
162
|
+
l: 34 + (Math.abs(hash >> 12) % 8),
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
return {
|
|
167
|
+
h: hue,
|
|
168
|
+
s: 68 + (Math.abs(hash >> 8) % 10),
|
|
169
|
+
l: 52 + (Math.abs(hash >> 12) % 8),
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Returns the shared color spec for a normalized model name.
|
|
175
|
+
*
|
|
176
|
+
* @param name - The model name to resolve.
|
|
177
|
+
* @param options - The theme and alpha options for color resolution.
|
|
178
|
+
* @returns The resolved HSL color spec.
|
|
179
|
+
*/
|
|
180
|
+
function getModelColorSpec(name, options = {}) {
|
|
181
|
+
const theme = normalizeTheme(options.theme)
|
|
182
|
+
const known = findKnownColor(name)
|
|
183
|
+
return known ? { ...known[theme] } : fallbackColor(name, theme)
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function toHslString(spec) {
|
|
187
|
+
return `hsl(${spec.h}, ${spec.s}%, ${spec.l}%)`
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
function toHslaString(spec, alpha) {
|
|
191
|
+
return `hsla(${spec.h}, ${spec.s}%, ${spec.l}%, ${alpha})`
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
function hslToRgb(spec) {
|
|
195
|
+
const hue = mod(spec.h, 360)
|
|
196
|
+
const saturation = Math.max(0, Math.min(100, spec.s)) / 100
|
|
197
|
+
const lightness = Math.max(0, Math.min(100, spec.l)) / 100
|
|
198
|
+
const chroma = (1 - Math.abs(2 * lightness - 1)) * saturation
|
|
199
|
+
const huePrime = hue / 60
|
|
200
|
+
const x = chroma * (1 - Math.abs((huePrime % 2) - 1))
|
|
201
|
+
|
|
202
|
+
let red = 0
|
|
203
|
+
let green = 0
|
|
204
|
+
let blue = 0
|
|
205
|
+
|
|
206
|
+
if (huePrime >= 0 && huePrime < 1) {
|
|
207
|
+
red = chroma
|
|
208
|
+
green = x
|
|
209
|
+
} else if (huePrime < 2) {
|
|
210
|
+
red = x
|
|
211
|
+
green = chroma
|
|
212
|
+
} else if (huePrime < 3) {
|
|
213
|
+
green = chroma
|
|
214
|
+
blue = x
|
|
215
|
+
} else if (huePrime < 4) {
|
|
216
|
+
green = x
|
|
217
|
+
blue = chroma
|
|
218
|
+
} else if (huePrime < 5) {
|
|
219
|
+
red = x
|
|
220
|
+
blue = chroma
|
|
221
|
+
} else {
|
|
222
|
+
red = chroma
|
|
223
|
+
blue = x
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const match = lightness - chroma / 2
|
|
227
|
+
return {
|
|
228
|
+
r: Math.round((red + match) * 255),
|
|
229
|
+
g: Math.round((green + match) * 255),
|
|
230
|
+
b: Math.round((blue + match) * 255),
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Returns the shared model color as an HSL string.
|
|
236
|
+
*
|
|
237
|
+
* @param name - The model name to resolve.
|
|
238
|
+
* @param options - The theme and alpha options for color resolution.
|
|
239
|
+
* @returns The resolved CSS color string.
|
|
240
|
+
*/
|
|
241
|
+
function getModelColor(name, options = {}) {
|
|
242
|
+
const spec = getModelColorSpec(name, options)
|
|
243
|
+
const alpha = normalizeAlpha(options.alpha)
|
|
244
|
+
return alpha === null ? toHslString(spec) : toHslaString(spec, alpha)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Returns the shared model color as an RGB string.
|
|
249
|
+
*
|
|
250
|
+
* @param name - The model name to resolve.
|
|
251
|
+
* @param options - The theme and alpha options for color resolution.
|
|
252
|
+
* @returns The resolved CSS RGB color string.
|
|
253
|
+
*/
|
|
254
|
+
function getModelColorRgb(name, options = {}) {
|
|
255
|
+
const spec = getModelColorSpec(name, options)
|
|
256
|
+
const { r, g, b } = hslToRgb(spec)
|
|
257
|
+
const alpha = normalizeAlpha(options.alpha)
|
|
258
|
+
if (alpha === null) return `rgb(${r}, ${g}, ${b})`
|
|
259
|
+
return `rgba(${r}, ${g}, ${b}, ${alpha})`
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
module.exports = {
|
|
263
|
+
MODEL_COLOR_RULES,
|
|
264
|
+
getModelColor,
|
|
265
|
+
getModelColorRgb,
|
|
266
|
+
getModelColorSpec,
|
|
267
|
+
normalizeTheme,
|
|
268
|
+
}
|
|
@@ -179,6 +179,10 @@
|
|
|
179
179
|
"title": "Tabellen",
|
|
180
180
|
"description": "Detaillierte Aufschlüsselungen"
|
|
181
181
|
},
|
|
182
|
+
"lazySectionError": {
|
|
183
|
+
"title": "Sektion nicht verfügbar",
|
|
184
|
+
"description": "Diese Dashboard-Sektion konnte gerade nicht geladen werden."
|
|
185
|
+
},
|
|
182
186
|
"cards": {
|
|
183
187
|
"periodComparison": "Periodenvergleich",
|
|
184
188
|
"anomalyDetection": "Anomalie-Erkennung",
|
|
@@ -318,7 +322,7 @@
|
|
|
318
322
|
},
|
|
319
323
|
"peakWindow": {
|
|
320
324
|
"title": "Peak-Fenster",
|
|
321
|
-
"summary": "Stärkste 7-Tage-Phase von {{start}} bis {{end}}
|
|
325
|
+
"summary": "Stärkste 7-Tage-Phase von {{start}} bis {{end}}",
|
|
322
326
|
"fallback": "Kein 7-Tage-Fenster verfügbar, daher Fokus auf den teuersten Einzelwert.",
|
|
323
327
|
"peakDay": "Peak Tag",
|
|
324
328
|
"avgPerUnit": "Ø/{{unit}}",
|
|
@@ -345,7 +349,8 @@
|
|
|
345
349
|
"costByModel": {
|
|
346
350
|
"title": "Kosten nach Modell",
|
|
347
351
|
"subtitle": "Kostenverteilung nach Modell",
|
|
348
|
-
"total": "Gesamt"
|
|
352
|
+
"total": "Gesamt",
|
|
353
|
+
"otherModels": "Weitere Modelle"
|
|
349
354
|
},
|
|
350
355
|
"costByModelOverTime": {
|
|
351
356
|
"title": "Kosten nach Modell im Zeitverlauf",
|
|
@@ -944,15 +949,55 @@
|
|
|
944
949
|
}
|
|
945
950
|
},
|
|
946
951
|
"drillDown": {
|
|
947
|
-
"description": "Detaillierte
|
|
952
|
+
"description": "Detaillierte {{periodType}}-Ansicht mit Benchmarks, Modellaufschlüsselung, Anbieter-Zusammenfassung und Token-Verteilung.",
|
|
948
953
|
"cacheRate": "Cache-Rate",
|
|
949
954
|
"tokensPerRequest": "Tokens / Anfrage",
|
|
950
955
|
"costPerRequest": "Kosten / Anfrage",
|
|
951
956
|
"costRank": "Kosten-Rang",
|
|
952
957
|
"requestRank": "Anfragen-Rang",
|
|
958
|
+
"overview": "Überblick",
|
|
959
|
+
"benchmarks": "Benchmarks",
|
|
960
|
+
"periodType": "Typ: {{period}}",
|
|
961
|
+
"coverage": "Abdeckung",
|
|
962
|
+
"coverageDays": "{{count}} Rohdaten-Tag",
|
|
963
|
+
"coverageDays_other": "{{count}} Rohdaten-Tage",
|
|
964
|
+
"singlePeriod": "1 {{period}}",
|
|
965
|
+
"activeProviders": "Aktive Anbieter",
|
|
953
966
|
"topRequestModel": "Dominant nach Anfragen",
|
|
954
|
-
"
|
|
955
|
-
"
|
|
967
|
+
"topCostModel": "Top nach Kosten",
|
|
968
|
+
"topTokenModel": "Top nach Tokens",
|
|
969
|
+
"priciestPerMillionModel": "Höchstes $/1M",
|
|
970
|
+
"topCostShare": "Top-1 Kostenanteil",
|
|
971
|
+
"topThreeCostShare": "Top-3 Kostenanteil",
|
|
972
|
+
"modelBreakdown": "Modelle im Detail",
|
|
973
|
+
"providerSummary": "Anbieter-Zusammenfassung",
|
|
974
|
+
"providerCount": "{{count}} Anbieter",
|
|
975
|
+
"modelCount": "{{count}} Modell",
|
|
976
|
+
"modelCount_other": "{{count}} Modelle",
|
|
977
|
+
"activeModelsCount": "{{count}} aktives Modell",
|
|
978
|
+
"activeModelsCount_other": "{{count}} aktive Modelle",
|
|
979
|
+
"costShare": "Kostenanteil",
|
|
980
|
+
"tokenShare": "Tokenanteil",
|
|
981
|
+
"costShareByModel": "Kostenanteil nach Modell",
|
|
982
|
+
"costVsPrevious": "Kosten vs. vorher",
|
|
983
|
+
"tokensVsPrevious": "Tokens vs. vorher",
|
|
984
|
+
"requestsVsPrevious": "Anfragen vs. vorher",
|
|
985
|
+
"costPerMillionVsPrevious": "$/1M vs. vorher",
|
|
986
|
+
"previousDay": "Vorheriger Tag",
|
|
987
|
+
"nextDay": "Nächster Tag",
|
|
988
|
+
"previousPeriod": "Vorherige Periode",
|
|
989
|
+
"nextPeriod": "Nächste Periode",
|
|
990
|
+
"position": "{{current}} / {{total}}",
|
|
991
|
+
"keyboardHint": "Mit ← / → wechseln",
|
|
992
|
+
"costVsAverageWindow": "Kosten vs. {{window}}-Ø",
|
|
993
|
+
"requestsVsAverageWindow": "Anfragen vs. {{window}}-Ø",
|
|
994
|
+
"tokensVsAverageWindow": "Tokens vs. {{window}}-Ø",
|
|
995
|
+
"costPerMillionVsAverageWindow": "$/1M vs. {{window}}-Ø",
|
|
996
|
+
"windowUnit": {
|
|
997
|
+
"day": "T",
|
|
998
|
+
"month": "M",
|
|
999
|
+
"year": "J"
|
|
1000
|
+
},
|
|
956
1001
|
"tokenDistribution": "Token-Verteilung",
|
|
957
1002
|
"requestCountShort": "{{count}} Anfragen",
|
|
958
1003
|
"modelRequestSummary": "{{costPerRequest}} / Anfrage · {{tokensPerRequest}} / Anfrage",
|
|
@@ -1101,7 +1146,15 @@
|
|
|
1101
1146
|
"charts": {
|
|
1102
1147
|
"costTrend": "Kostenverlauf",
|
|
1103
1148
|
"topModels": "Top-Modelle nach Kosten",
|
|
1104
|
-
"tokenTrend": "Token-Mix pro Zeitraum"
|
|
1149
|
+
"tokenTrend": "Token-Mix pro Zeitraum",
|
|
1150
|
+
"costTrendAlt": "Liniendiagramm der Report-Kosten pro Zeitraum.",
|
|
1151
|
+
"costTrendSummary": "Letzter Wert {{latest}}. Peak {{peak}} am {{date}}.",
|
|
1152
|
+
"topModelsAlt": "Horizontales Balkendiagramm der teuersten Modelle im Report.",
|
|
1153
|
+
"topModelsSummary": "{{model}} führt mit {{cost}} und {{share}} der Report-Kosten.",
|
|
1154
|
+
"topModelsFullNames": "Vollständige Diagramm-Labels: {{names}}.",
|
|
1155
|
+
"tokenTrendAlt": "Gestapeltes Balkendiagramm des Token-Mix pro Report-Zeitraum.",
|
|
1156
|
+
"tokenTrendSummary": "Gesamt {{total}}. Höchstes Token-Volumen {{peak}} am {{date}}.",
|
|
1157
|
+
"noDataSummary": "Nicht genug Daten für eine belastbare Diagramm-Zusammenfassung."
|
|
1105
1158
|
},
|
|
1106
1159
|
"interpretation": {
|
|
1107
1160
|
"summary": "Dieser Report umfasst {{days}} Rohdaten-Tage und {{periods}} aggregierte Zeiträume. Spitzenzeitraum: {{peak}}. Top-Modell: {{topModel}}. Führender Anbieter: {{topProvider}}.",
|
|
@@ -179,6 +179,10 @@
|
|
|
179
179
|
"title": "Tables",
|
|
180
180
|
"description": "Detailed breakdowns"
|
|
181
181
|
},
|
|
182
|
+
"lazySectionError": {
|
|
183
|
+
"title": "Section unavailable",
|
|
184
|
+
"description": "This dashboard section could not be loaded right now."
|
|
185
|
+
},
|
|
182
186
|
"cards": {
|
|
183
187
|
"periodComparison": "Period comparison",
|
|
184
188
|
"anomalyDetection": "Anomaly detection",
|
|
@@ -345,7 +349,8 @@
|
|
|
345
349
|
"costByModel": {
|
|
346
350
|
"title": "Cost by model",
|
|
347
351
|
"subtitle": "Cost distribution by model",
|
|
348
|
-
"total": "Total"
|
|
352
|
+
"total": "Total",
|
|
353
|
+
"otherModels": "Other models"
|
|
349
354
|
},
|
|
350
355
|
"costByModelOverTime": {
|
|
351
356
|
"title": "Cost by model over time",
|
|
@@ -944,15 +949,56 @@
|
|
|
944
949
|
}
|
|
945
950
|
},
|
|
946
951
|
"drillDown": {
|
|
947
|
-
"description": "Detailed
|
|
952
|
+
"description": "Detailed {{periodType}} view with benchmarks, model breakdown, provider summary, and token distribution.",
|
|
948
953
|
"cacheRate": "Cache rate",
|
|
949
954
|
"tokensPerRequest": "Tokens / Req",
|
|
950
955
|
"costPerRequest": "Cost / Req",
|
|
951
956
|
"costRank": "Cost rank",
|
|
952
957
|
"requestRank": "Request rank",
|
|
958
|
+
"overview": "Overview",
|
|
959
|
+
"benchmarks": "Benchmarks",
|
|
960
|
+
"periodType": "Type: {{period}}",
|
|
961
|
+
"coverage": "Coverage",
|
|
962
|
+
"coverageDays": "{{count}} raw day",
|
|
963
|
+
"coverageDays_other": "{{count}} raw days",
|
|
964
|
+
"singlePeriod": "1 {{period}}",
|
|
965
|
+
"activeProviders": "Active providers",
|
|
953
966
|
"topRequestModel": "Top by requests",
|
|
954
|
-
"
|
|
955
|
-
"
|
|
967
|
+
"topCostModel": "Top by cost",
|
|
968
|
+
"topTokenModel": "Top by tokens",
|
|
969
|
+
"priciestPerMillionModel": "Highest $/1M",
|
|
970
|
+
"topCostShare": "Top 1 cost share",
|
|
971
|
+
"topThreeCostShare": "Top 3 cost share",
|
|
972
|
+
"modelBreakdown": "Model breakdown",
|
|
973
|
+
"providerSummary": "Provider summary",
|
|
974
|
+
"providerCount": "{{count}} provider",
|
|
975
|
+
"providerCount_other": "{{count}} providers",
|
|
976
|
+
"modelCount": "{{count}} model",
|
|
977
|
+
"modelCount_other": "{{count}} models",
|
|
978
|
+
"activeModelsCount": "{{count}} active model",
|
|
979
|
+
"activeModelsCount_other": "{{count}} active models",
|
|
980
|
+
"costShare": "Cost share",
|
|
981
|
+
"tokenShare": "Token share",
|
|
982
|
+
"costShareByModel": "Cost share by model",
|
|
983
|
+
"costVsPrevious": "Cost vs. previous",
|
|
984
|
+
"tokensVsPrevious": "Tokens vs. previous",
|
|
985
|
+
"requestsVsPrevious": "Requests vs. previous",
|
|
986
|
+
"costPerMillionVsPrevious": "$/1M vs. previous",
|
|
987
|
+
"previousDay": "Previous day",
|
|
988
|
+
"nextDay": "Next day",
|
|
989
|
+
"previousPeriod": "Previous period",
|
|
990
|
+
"nextPeriod": "Next period",
|
|
991
|
+
"position": "{{current}} / {{total}}",
|
|
992
|
+
"keyboardHint": "Use ← / →",
|
|
993
|
+
"costVsAverageWindow": "Cost vs. {{window}} avg",
|
|
994
|
+
"requestsVsAverageWindow": "Requests vs. {{window}} avg",
|
|
995
|
+
"tokensVsAverageWindow": "Tokens vs. {{window}} avg",
|
|
996
|
+
"costPerMillionVsAverageWindow": "$/1M vs. {{window}} avg",
|
|
997
|
+
"windowUnit": {
|
|
998
|
+
"day": "D",
|
|
999
|
+
"month": "M",
|
|
1000
|
+
"year": "Y"
|
|
1001
|
+
},
|
|
956
1002
|
"tokenDistribution": "Token distribution",
|
|
957
1003
|
"requestCountShort": "{{count}} Req",
|
|
958
1004
|
"modelRequestSummary": "{{costPerRequest}}/Req · {{tokensPerRequest}}/Req",
|
|
@@ -1101,7 +1147,15 @@
|
|
|
1101
1147
|
"charts": {
|
|
1102
1148
|
"costTrend": "Cost trend",
|
|
1103
1149
|
"topModels": "Top models by cost",
|
|
1104
|
-
"tokenTrend": "Token mix by period"
|
|
1150
|
+
"tokenTrend": "Token mix by period",
|
|
1151
|
+
"costTrendAlt": "Line chart showing report cost by period.",
|
|
1152
|
+
"costTrendSummary": "Latest {{latest}}. Peak {{peak}} on {{date}}.",
|
|
1153
|
+
"topModelsAlt": "Horizontal bar chart comparing the highest-cost models in the report.",
|
|
1154
|
+
"topModelsSummary": "{{model}} leads with {{cost}} and {{share}} of report cost.",
|
|
1155
|
+
"topModelsFullNames": "Full chart labels: {{names}}.",
|
|
1156
|
+
"tokenTrendAlt": "Stacked bar chart showing the token mix for each report period.",
|
|
1157
|
+
"tokenTrendSummary": "Total {{total}}. Peak token volume {{peak}} on {{date}}.",
|
|
1158
|
+
"noDataSummary": "Not enough data for a stable chart summary."
|
|
1105
1159
|
},
|
|
1106
1160
|
"interpretation": {
|
|
1107
1161
|
"summary": "This report covers {{days}} raw days and {{periods}} aggregated periods. Peak period: {{peak}}. Top model: {{topModel}}. Leading provider: {{topProvider}}.",
|