@frugalco/frugal-sdk-node 0.3.0 → 0.5.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/README.md +73 -12
- package/dist/block-hash-lru.d.ts +8 -1
- package/dist/block-hash-lru.d.ts.map +1 -1
- package/dist/block-hash-lru.js +13 -4
- package/dist/block-hash-lru.js.map +1 -1
- package/dist/config.d.ts +33 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +218 -27
- package/dist/config.js.map +1 -1
- package/dist/duplicate-filter.d.ts +46 -0
- package/dist/duplicate-filter.d.ts.map +1 -0
- package/dist/duplicate-filter.js +168 -0
- package/dist/duplicate-filter.js.map +1 -0
- package/dist/instrument.d.ts +33 -0
- package/dist/instrument.d.ts.map +1 -1
- package/dist/instrument.js +277 -21
- package/dist/instrument.js.map +1 -1
- package/dist/model-cap.d.ts +24 -0
- package/dist/model-cap.d.ts.map +1 -0
- package/dist/model-cap.js +72 -0
- package/dist/model-cap.js.map +1 -0
- package/dist/otel.d.ts +32 -3
- package/dist/otel.d.ts.map +1 -1
- package/dist/otel.js +203 -7
- package/dist/otel.js.map +1 -1
- package/dist/prompt-analyzer.d.ts +12 -1
- package/dist/prompt-analyzer.d.ts.map +1 -1
- package/dist/prompt-analyzer.js +185 -14
- package/dist/prompt-analyzer.js.map +1 -1
- package/dist/providers.d.ts +1 -0
- package/dist/providers.d.ts.map +1 -1
- package/dist/providers.js +4 -1
- package/dist/providers.js.map +1 -1
- package/dist/semconv.d.ts +14 -0
- package/dist/semconv.d.ts.map +1 -1
- package/dist/semconv.js +38 -2
- package/dist/semconv.js.map +1 -1
- package/dist/streams.d.ts.map +1 -1
- package/dist/streams.js +15 -2
- package/dist/streams.js.map +1 -1
- package/dist/track.d.ts +18 -0
- package/dist/track.d.ts.map +1 -1
- package/dist/track.js +4 -1
- package/dist/track.js.map +1 -1
- package/dist/wrappers/anthropic.d.ts.map +1 -1
- package/dist/wrappers/anthropic.js +9 -1
- package/dist/wrappers/anthropic.js.map +1 -1
- package/dist/wrappers/batch.d.ts +11 -0
- package/dist/wrappers/batch.d.ts.map +1 -0
- package/dist/wrappers/batch.js +338 -0
- package/dist/wrappers/batch.js.map +1 -0
- package/dist/wrappers/openai.d.ts.map +1 -1
- package/dist/wrappers/openai.js +37 -30
- package/dist/wrappers/openai.js.map +1 -1
- package/dist/wrappers/patching.d.ts +10 -0
- package/dist/wrappers/patching.d.ts.map +1 -0
- package/dist/wrappers/patching.js +38 -0
- package/dist/wrappers/patching.js.map +1 -0
- package/package.json +1 -1
package/dist/instrument.js
CHANGED
|
@@ -7,11 +7,13 @@
|
|
|
7
7
|
// the wrapper frame and resolveCaller, or the caller attribution will be wrong.
|
|
8
8
|
import { consumeCapHitEvent, resolveCaller, } from "./caller.js";
|
|
9
9
|
import { emitLogOnce } from "./debug.js";
|
|
10
|
+
import { applyModelCap, consumeModelCapHitEvent } from "./model-cap.js";
|
|
10
11
|
import { getInstruments } from "./otel.js";
|
|
11
12
|
import { getSharedBlockHashLRU } from "./block-hash-lru.js";
|
|
12
|
-
import { normalizeOperation, normalizeProvider, } from "./providers.js";
|
|
13
|
-
import { analyzeRequest, shouldSample, structuredOutputMode, } from "./prompt-analyzer.js";
|
|
14
|
-
import {
|
|
13
|
+
import { normalizeOperation, normalizeProvider, warnInvalidOnce, } from "./providers.js";
|
|
14
|
+
import { analyzeRequest, historyBucket, historyDepth, requestSignature, shouldSample, structuredOutputMode, } from "./prompt-analyzer.js";
|
|
15
|
+
import { getSharedDuplicateFilter } from "./duplicate-filter.js";
|
|
16
|
+
import { BLOCK_SCHEMA, BLOCK_SYSTEM, BLOCK_TOOLS, BLOCK_USER, CUSTOM_LABEL_OTHER, FRUGAL_BATCHED, FRUGAL_BLOCK, FRUGAL_CALLER_FILE, FRUGAL_CALLER_FUNCTION, FRUGAL_CUSTOMER_ID, FRUGAL_CUSTOM_LABEL, FRUGAL_DUP_STATE, FRUGAL_ERROR_TYPE, FRUGAL_HISTORY_BUCKET, FRUGAL_PROJECT_ID, FRUGAL_STABLE, FRUGAL_STRUCTURED_OUTPUT_MODE, GEN_AI_OPERATION_NAME, GEN_AI_PROVIDER_NAME, GEN_AI_REQUEST_MODEL, GEN_AI_RESPONSE_MODEL, GEN_AI_SYSTEM, GEN_AI_TOKEN_TYPE, TOKEN_INPUT, TOKEN_OUTPUT, } from "./semconv.js";
|
|
15
17
|
export function startCall(config, ctx, opts = {}) {
|
|
16
18
|
const instruments = getInstruments(config);
|
|
17
19
|
const caller = opts.caller ??
|
|
@@ -22,12 +24,14 @@ export function startCall(config, ctx, opts = {}) {
|
|
|
22
24
|
maxCallSites: config.maxCallSites,
|
|
23
25
|
skipFrames: opts.skipFrames ?? 2,
|
|
24
26
|
});
|
|
27
|
+
const customLabel = resolveCustomLabel(ctx, config);
|
|
25
28
|
if (consumeCapHitEvent()) {
|
|
26
29
|
emitLogOnce("cardinality_cap", "warn", "call-site cardinality cap hit; further distinct (file, function) call sites are attributed to an overflow bucket. Raise FRUGAL_MAX_CALL_SITES if this is unexpected.");
|
|
27
30
|
try {
|
|
28
31
|
instruments.internalErrors.add(1, {
|
|
29
32
|
...(config.customerId ? { [FRUGAL_CUSTOMER_ID]: config.customerId } : {}),
|
|
30
33
|
[FRUGAL_PROJECT_ID]: config.projectId,
|
|
34
|
+
...(customLabel !== null ? { [FRUGAL_CUSTOM_LABEL]: customLabel } : {}),
|
|
31
35
|
"frugal.internal_error.stage": "cardinality_cap_hit",
|
|
32
36
|
});
|
|
33
37
|
}
|
|
@@ -72,20 +76,38 @@ export class CallEmitter {
|
|
|
72
76
|
this.finalized = true;
|
|
73
77
|
const attrs = this.baseAttrs();
|
|
74
78
|
if (usage.responseModel) {
|
|
75
|
-
attrs[GEN_AI_RESPONSE_MODEL] = usage.responseModel;
|
|
79
|
+
attrs[GEN_AI_RESPONSE_MODEL] = applyModelCap(usage.responseModel, this.config.maxModels);
|
|
80
|
+
// The cap can be crossed for the FIRST time by a response model (request
|
|
81
|
+
// models already all registered), and baseAttrs() drained the event
|
|
82
|
+
// before this line ran — so drain again here or the transition would go
|
|
83
|
+
// unreported until some later call happened to build base attrs. The
|
|
84
|
+
// event is one-shot process-wide, so this cannot double-emit.
|
|
85
|
+
// The custom label is read back off attrs rather than re-resolved:
|
|
86
|
+
// resolveCustomLabel warns-invalid on the way through, and calling it
|
|
87
|
+
// twice per call would double that diagnostic path.
|
|
88
|
+
const labelAttr = attrs[FRUGAL_CUSTOM_LABEL];
|
|
89
|
+
noteModelCapHit(this.instruments, this.config, typeof labelAttr === "string" ? labelAttr : null);
|
|
76
90
|
}
|
|
77
91
|
const duration = nowSeconds() - this.startSec;
|
|
78
92
|
this.instruments.operationDuration.record(duration, attrs);
|
|
79
|
-
this.
|
|
93
|
+
const shape = this.recordCallShape(attrs);
|
|
94
|
+
this.instruments.calls.add(1, shape.callAttrs);
|
|
95
|
+
// token.usage carries history_bucket (so spend can be sliced by history
|
|
96
|
+
// size directly) but deliberately NOT structured_output_mode: it is the
|
|
97
|
+
// highest-volume histogram, and the extra 4× fan-out is not worth it when
|
|
98
|
+
// that cross-tab already lives on the cheap calls counter.
|
|
99
|
+
const tokenAttrs = shape.bucket !== null
|
|
100
|
+
? { ...attrs, [FRUGAL_HISTORY_BUCKET]: shape.bucket }
|
|
101
|
+
: attrs;
|
|
80
102
|
if (nonNull(usage.inputTokens)) {
|
|
81
103
|
this.instruments.tokenUsage.record(usage.inputTokens, {
|
|
82
|
-
...
|
|
104
|
+
...tokenAttrs,
|
|
83
105
|
[GEN_AI_TOKEN_TYPE]: TOKEN_INPUT,
|
|
84
106
|
});
|
|
85
107
|
}
|
|
86
108
|
if (nonNull(usage.outputTokens)) {
|
|
87
109
|
this.instruments.tokenUsage.record(usage.outputTokens, {
|
|
88
|
-
...
|
|
110
|
+
...tokenAttrs,
|
|
89
111
|
[GEN_AI_TOKEN_TYPE]: TOKEN_OUTPUT,
|
|
90
112
|
});
|
|
91
113
|
}
|
|
@@ -98,21 +120,110 @@ export class CallEmitter {
|
|
|
98
120
|
if (nonNull(usage.reasoningTokens)) {
|
|
99
121
|
this.instruments.reasoningTokens.record(usage.reasoningTokens, attrs);
|
|
100
122
|
}
|
|
123
|
+
if (this.operation === "invoke_agent" && isPositiveInteger(usage.agentTurns)) {
|
|
124
|
+
this.instruments.agentTurns.record(usage.agentTurns, attrs);
|
|
125
|
+
}
|
|
101
126
|
this.recordCapUtilization(usage, attrs);
|
|
127
|
+
this.recordDuplicate(attrs);
|
|
102
128
|
this.maybeAnalyze(attrs);
|
|
103
129
|
}
|
|
130
|
+
// Label derivation must never cost the call its core spend metrics: this
|
|
131
|
+
// sits ahead of calls.add/token_usage.record, and a payload with a throwing
|
|
132
|
+
// getter/proxy (LangChain-style lazy objects) would otherwise drop them all.
|
|
133
|
+
// On failure the base attrs are returned unlabeled — with a diagnostic, so a
|
|
134
|
+
// permanently unlabeled call site is distinguishable from one that simply
|
|
135
|
+
// never passes a payload.
|
|
136
|
+
recordCallShape(attrs) {
|
|
137
|
+
try {
|
|
138
|
+
const payload = this.ctx.requestPayload;
|
|
139
|
+
const depth = payload ? historyDepth(payload) : null;
|
|
140
|
+
if (depth !== null) {
|
|
141
|
+
this.instruments.historyDepth.record(depth, stripErrorType(attrs));
|
|
142
|
+
}
|
|
143
|
+
const bucket = depth !== null ? historyBucket(depth) : null;
|
|
144
|
+
const callAttrs = { ...attrs };
|
|
145
|
+
if (bucket !== null) {
|
|
146
|
+
callAttrs[FRUGAL_HISTORY_BUCKET] = bucket;
|
|
147
|
+
}
|
|
148
|
+
if (payload) {
|
|
149
|
+
callAttrs[FRUGAL_STRUCTURED_OUTPUT_MODE] = structuredOutputMode(payload);
|
|
150
|
+
}
|
|
151
|
+
return { callAttrs, bucket };
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
emitLogOnce("call_shape_failed", "warn", `call-shape label derivation failed: ${errorName(err)} — history_depth and the history_bucket/structured_output_mode labels may be missing`);
|
|
155
|
+
this.recordInternalError("call_shape", err);
|
|
156
|
+
return { callAttrs: attrs, bucket: null };
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Shared internal-error emission for per-call stages. Itself guarded — our
|
|
160
|
+
// own diagnostics must never break a customer call.
|
|
161
|
+
recordInternalError(stage, err) {
|
|
162
|
+
try {
|
|
163
|
+
const customLabel = resolveCustomLabel(this.ctx, this.config);
|
|
164
|
+
this.instruments.internalErrors.add(1, {
|
|
165
|
+
...(this.config.customerId
|
|
166
|
+
? { [FRUGAL_CUSTOMER_ID]: this.config.customerId }
|
|
167
|
+
: {}),
|
|
168
|
+
[FRUGAL_PROJECT_ID]: this.config.projectId,
|
|
169
|
+
...(customLabel !== null
|
|
170
|
+
? { [FRUGAL_CUSTOM_LABEL]: customLabel }
|
|
171
|
+
: {}),
|
|
172
|
+
"frugal.internal_error.stage": stage,
|
|
173
|
+
"frugal.internal_error.type": errorName(err),
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
catch { }
|
|
177
|
+
}
|
|
178
|
+
recordDuplicate(attrs) {
|
|
179
|
+
try {
|
|
180
|
+
const filter = getSharedDuplicateFilter(this.config);
|
|
181
|
+
if (filter === null)
|
|
182
|
+
return;
|
|
183
|
+
const payload = this.ctx.requestPayload;
|
|
184
|
+
if (!payload)
|
|
185
|
+
return;
|
|
186
|
+
const callSiteId = `${this.caller.file}:${this.caller.function}`;
|
|
187
|
+
const signature = requestSignature(payload, this.ctx.requestModel, callSiteId);
|
|
188
|
+
if (signature === null)
|
|
189
|
+
return;
|
|
190
|
+
const state = filter.seenBefore(signature);
|
|
191
|
+
if (state === null)
|
|
192
|
+
return;
|
|
193
|
+
this.instruments.duplicateRequests.add(1, {
|
|
194
|
+
...stripErrorType(attrs),
|
|
195
|
+
[FRUGAL_DUP_STATE]: state,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
// Without a diagnostic, a permanently-dead filter is indistinguishable
|
|
200
|
+
// from a duplicate-free workload.
|
|
201
|
+
emitLogOnce("duplicate_detection_failed", "warn", `duplicate detection failed: ${errorName(err)} — the duplicate_requests metric may be missing or incomplete`);
|
|
202
|
+
this.recordInternalError("duplicate_detection", err);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
// Guarded: this reads payload getters (maxTokens, tools/responseFormat via
|
|
206
|
+
// structuredOutputMode) and sits upstream of the never-sampled
|
|
207
|
+
// duplicate_requests emission — a throwing lazy payload must not take the
|
|
208
|
+
// rest of the pipeline down with it. No diagnostic of its own: the same
|
|
209
|
+
// throwing payload is reported once by recordCallShape's catch.
|
|
104
210
|
recordCapUtilization(usage, attrs) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
211
|
+
try {
|
|
212
|
+
const payload = this.ctx.requestPayload;
|
|
213
|
+
if (!payload || !nonNull(payload.maxTokens) || !nonNull(usage.outputTokens)) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (payload.maxTokens <= 0)
|
|
217
|
+
return;
|
|
218
|
+
const ratio = Math.min(1, usage.outputTokens / payload.maxTokens);
|
|
219
|
+
this.instruments.outputCapUtilization.record(ratio, {
|
|
220
|
+
...attrs,
|
|
221
|
+
[FRUGAL_STRUCTURED_OUTPUT_MODE]: structuredOutputMode(payload),
|
|
222
|
+
});
|
|
108
223
|
}
|
|
109
|
-
|
|
224
|
+
catch {
|
|
110
225
|
return;
|
|
111
|
-
|
|
112
|
-
this.instruments.outputCapUtilization.record(ratio, {
|
|
113
|
-
...attrs,
|
|
114
|
-
[FRUGAL_STRUCTURED_OUTPUT_MODE]: structuredOutputMode(payload),
|
|
115
|
-
});
|
|
226
|
+
}
|
|
116
227
|
}
|
|
117
228
|
maybeAnalyze(attrs) {
|
|
118
229
|
const payload = this.ctx.requestPayload;
|
|
@@ -128,12 +239,12 @@ export class CallEmitter {
|
|
|
128
239
|
catch {
|
|
129
240
|
return;
|
|
130
241
|
}
|
|
131
|
-
if (nonNull(result.historyDepth)) {
|
|
132
|
-
this.instruments.historyDepth.record(result.historyDepth, attrs);
|
|
133
|
-
}
|
|
134
242
|
if (nonNull(result.fewShotCount)) {
|
|
135
243
|
this.instruments.fewShotCount.record(result.fewShotCount, attrs);
|
|
136
244
|
}
|
|
245
|
+
if (nonNull(result.fewShotTokens)) {
|
|
246
|
+
this.instruments.fewShotTokens.record(result.fewShotTokens, attrs);
|
|
247
|
+
}
|
|
137
248
|
if (nonNull(result.noiseRatio)) {
|
|
138
249
|
this.instruments.noiseRatio.record(result.noiseRatio, attrs);
|
|
139
250
|
}
|
|
@@ -175,15 +286,24 @@ export class CallEmitter {
|
|
|
175
286
|
attrs[FRUGAL_ERROR_TYPE] = errorName(err);
|
|
176
287
|
const duration = nowSeconds() - this.startSec;
|
|
177
288
|
this.instruments.operationDuration.record(duration, attrs);
|
|
178
|
-
|
|
289
|
+
// errors.add first: the error counter must not be lost if the labeled
|
|
290
|
+
// calls.add path fails.
|
|
179
291
|
this.instruments.errors.add(1, attrs);
|
|
292
|
+
this.instruments.calls.add(1, this.recordCallShape(attrs).callAttrs);
|
|
293
|
+
this.recordDuplicate(attrs);
|
|
180
294
|
}
|
|
181
295
|
baseAttrs() {
|
|
296
|
+
// In baseAttrs (not stamped per-instrument) because the contract is "every
|
|
297
|
+
// metric of the call, without exception" — new instruments added later
|
|
298
|
+
// inherit it automatically instead of each needing a stamp.
|
|
299
|
+
const customLabel = resolveCustomLabel(this.ctx, this.config);
|
|
300
|
+
const requestModel = applyModelCap(this.ctx.requestModel, this.config.maxModels);
|
|
301
|
+
noteModelCapHit(this.instruments, this.config, customLabel);
|
|
182
302
|
const attrs = {
|
|
183
303
|
[GEN_AI_SYSTEM]: this.provider.system,
|
|
184
304
|
[GEN_AI_PROVIDER_NAME]: this.provider.providerName,
|
|
185
305
|
[GEN_AI_OPERATION_NAME]: this.operation,
|
|
186
|
-
[GEN_AI_REQUEST_MODEL]:
|
|
306
|
+
[GEN_AI_REQUEST_MODEL]: requestModel,
|
|
187
307
|
[FRUGAL_PROJECT_ID]: this.config.projectId,
|
|
188
308
|
[FRUGAL_CALLER_FILE]: this.caller.file,
|
|
189
309
|
[FRUGAL_CALLER_FUNCTION]: this.caller.function,
|
|
@@ -192,12 +312,148 @@ export class CallEmitter {
|
|
|
192
312
|
if (this.config.customerId) {
|
|
193
313
|
attrs[FRUGAL_CUSTOMER_ID] = this.config.customerId;
|
|
194
314
|
}
|
|
315
|
+
if (customLabel !== null) {
|
|
316
|
+
attrs[FRUGAL_CUSTOM_LABEL] = customLabel;
|
|
317
|
+
}
|
|
195
318
|
return attrs;
|
|
196
319
|
}
|
|
197
320
|
}
|
|
198
321
|
function nonNull(v) {
|
|
199
322
|
return v !== null && v !== undefined;
|
|
200
323
|
}
|
|
324
|
+
function isPositiveInteger(v) {
|
|
325
|
+
return typeof v === "number" && Number.isInteger(v) && v > 0;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* Drain the one-shot model-cap event and, when it fired, surface the transition
|
|
329
|
+
* exactly once: a debug-callback warning plus a single
|
|
330
|
+
* `frugal.gen_ai.internal_errors{stage=model_cap_hit}` point. Mirrors the
|
|
331
|
+
* cardinality_cap_hit emission in startCall (same identity attribute shape).
|
|
332
|
+
* Total — never throws into customer code.
|
|
333
|
+
*/
|
|
334
|
+
function noteModelCapHit(instruments, config, customLabel) {
|
|
335
|
+
if (!consumeModelCapHitEvent())
|
|
336
|
+
return;
|
|
337
|
+
emitLogOnce("model_cap", "warn", "model cardinality cap hit; further distinct models are attributed to an overflow bucket. Raise FRUGAL_MAX_MODELS if this is unexpected.");
|
|
338
|
+
try {
|
|
339
|
+
instruments.internalErrors.add(1, {
|
|
340
|
+
...(config.customerId ? { [FRUGAL_CUSTOMER_ID]: config.customerId } : {}),
|
|
341
|
+
[FRUGAL_PROJECT_ID]: config.projectId,
|
|
342
|
+
...(customLabel !== null ? { [FRUGAL_CUSTOM_LABEL]: customLabel } : {}),
|
|
343
|
+
"frugal.internal_error.stage": "model_cap_hit",
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
catch {
|
|
347
|
+
// never let our own metric emission break a customer call
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
function batchedBaseAttrs(config, instruments, system, operation, requestModel, caller) {
|
|
351
|
+
const provider = normalizeProvider(system, config.customProviders);
|
|
352
|
+
// The batch path carries no custom label (wrapper-path rule), so the
|
|
353
|
+
// model_cap_hit point is emitted with identity attributes only.
|
|
354
|
+
const cappedModel = applyModelCap(requestModel, config.maxModels);
|
|
355
|
+
noteModelCapHit(instruments, config, null);
|
|
356
|
+
const attrs = {
|
|
357
|
+
[GEN_AI_SYSTEM]: provider.system,
|
|
358
|
+
[GEN_AI_PROVIDER_NAME]: provider.providerName,
|
|
359
|
+
[GEN_AI_OPERATION_NAME]: normalizeOperation(operation),
|
|
360
|
+
[GEN_AI_REQUEST_MODEL]: cappedModel,
|
|
361
|
+
[FRUGAL_PROJECT_ID]: config.projectId,
|
|
362
|
+
[FRUGAL_CALLER_FILE]: caller.file,
|
|
363
|
+
[FRUGAL_CALLER_FUNCTION]: caller.function,
|
|
364
|
+
[FRUGAL_BATCHED]: true,
|
|
365
|
+
};
|
|
366
|
+
if (config.customerId) {
|
|
367
|
+
attrs[FRUGAL_CUSTOMER_ID] = config.customerId;
|
|
368
|
+
}
|
|
369
|
+
return attrs;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Record the calls a batch submission carries — one counter increment per
|
|
373
|
+
* (model, count) group so mixed-model batches attribute per model. Duration
|
|
374
|
+
* and error accounting for the submitting HTTP call stay on its CallEmitter;
|
|
375
|
+
* this only records the fanned-out request volume.
|
|
376
|
+
*/
|
|
377
|
+
export function recordBatchedCalls(config, base, caller, groups) {
|
|
378
|
+
const instruments = getInstruments(config);
|
|
379
|
+
for (const group of groups) {
|
|
380
|
+
if (!(group.count > 0))
|
|
381
|
+
continue;
|
|
382
|
+
instruments.calls.add(group.count, batchedBaseAttrs(config, instruments, base.system, base.operation, group.requestModel, caller));
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Record one batch result entry's token usage. No calls increment — the
|
|
387
|
+
* request was already counted at submission; results only attribute spend.
|
|
388
|
+
*/
|
|
389
|
+
export function recordBatchedUsage(config, base, caller, requestModel, usage) {
|
|
390
|
+
const instruments = getInstruments(config);
|
|
391
|
+
const attrs = batchedBaseAttrs(config, instruments, base.system, base.operation, requestModel, caller);
|
|
392
|
+
if (usage.responseModel) {
|
|
393
|
+
attrs[GEN_AI_RESPONSE_MODEL] = applyModelCap(usage.responseModel, config.maxModels);
|
|
394
|
+
// Same reason as CallEmitter.success(): a cap first crossed by a response
|
|
395
|
+
// model must still report. null custom label — wrapper-path rule.
|
|
396
|
+
noteModelCapHit(instruments, config, null);
|
|
397
|
+
}
|
|
398
|
+
if (nonNull(usage.inputTokens)) {
|
|
399
|
+
instruments.tokenUsage.record(usage.inputTokens, {
|
|
400
|
+
...attrs,
|
|
401
|
+
[GEN_AI_TOKEN_TYPE]: TOKEN_INPUT,
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
if (nonNull(usage.outputTokens)) {
|
|
405
|
+
instruments.tokenUsage.record(usage.outputTokens, {
|
|
406
|
+
...attrs,
|
|
407
|
+
[GEN_AI_TOKEN_TYPE]: TOKEN_OUTPUT,
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
if (nonNull(usage.cacheReadTokens)) {
|
|
411
|
+
instruments.cacheReadTokens.record(usage.cacheReadTokens, attrs);
|
|
412
|
+
}
|
|
413
|
+
if (nonNull(usage.cacheWriteTokens)) {
|
|
414
|
+
instruments.cacheWriteTokens.record(usage.cacheWriteTokens, attrs);
|
|
415
|
+
}
|
|
416
|
+
if (nonNull(usage.reasoningTokens)) {
|
|
417
|
+
instruments.reasoningTokens.record(usage.reasoningTokens, attrs);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
// frugal.custom_label has a closed vocabulary: the configured allowlist
|
|
421
|
+
// (FRUGAL_CUSTOM_LABEL, hard-capped in config.ts) plus "other". The coercion
|
|
422
|
+
// lives here — at emit time, not in the track API — so a value that misses the
|
|
423
|
+
// allowlist still produces a countable "other" series instead of unbounded
|
|
424
|
+
// caller-supplied strings.
|
|
425
|
+
//
|
|
426
|
+
// Must be TOTAL: it runs inside baseAttrs(), ahead of every instrument record,
|
|
427
|
+
// and end()/fail() swallow exceptions — a throw here would silently drop all
|
|
428
|
+
// telemetry for the call. So no assumption that the value is a string: JS
|
|
429
|
+
// callers pass `unit ?? null` (absent → no label) and occasionally non-strings
|
|
430
|
+
// (→ "other", with a bounded warn-once so the misuse is discoverable, same as
|
|
431
|
+
// provider/operation typos).
|
|
432
|
+
function resolveCustomLabel(ctx, config) {
|
|
433
|
+
const raw = ctx.customLabel;
|
|
434
|
+
if (raw === undefined || raw === null)
|
|
435
|
+
return null;
|
|
436
|
+
if (typeof raw !== "string") {
|
|
437
|
+
warnInvalidOnce(`custom_label:<${typeof raw}>`, `customLabel must be a string (got ${typeof raw}) — coerced to "${CUSTOM_LABEL_OTHER}".`);
|
|
438
|
+
return CUSTOM_LABEL_OTHER;
|
|
439
|
+
}
|
|
440
|
+
const value = raw.trim();
|
|
441
|
+
if (config.customLabels.includes(value))
|
|
442
|
+
return value;
|
|
443
|
+
warnInvalidOnce(`custom_label:${value}`, `customLabel "${value}" is not in the FRUGAL_CUSTOM_LABEL allowlist — coerced to "${CUSTOM_LABEL_OTHER}". Add it to the env var (first 20 entries are honored) to attribute it.`);
|
|
444
|
+
return CUSTOM_LABEL_OTHER;
|
|
445
|
+
}
|
|
446
|
+
// history_depth and duplicate_requests are documented without an error-type
|
|
447
|
+
// label: error() adds frugal.error.type to the shared attrs before the shape/
|
|
448
|
+
// duplicate helpers run, and letting it leak onto the 2-value duplicate counter
|
|
449
|
+
// would split the series per exception class and make success/error points
|
|
450
|
+
// non-additive.
|
|
451
|
+
function stripErrorType(attrs) {
|
|
452
|
+
if (!(FRUGAL_ERROR_TYPE in attrs))
|
|
453
|
+
return attrs;
|
|
454
|
+
const { [FRUGAL_ERROR_TYPE]: _ignored, ...rest } = attrs;
|
|
455
|
+
return rest;
|
|
456
|
+
}
|
|
201
457
|
function errorName(err) {
|
|
202
458
|
if (err && typeof err === "object" && "name" in err && typeof err.name === "string") {
|
|
203
459
|
return err.name;
|
package/dist/instrument.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"instrument.js","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register `model` and return it, or return the `<overflow>` sentinel once the
|
|
3
|
+
* registry is full. `maxModels <= 0` disables the cap. Total: non-string and
|
|
4
|
+
* empty input is returned unchanged rather than throwing — this runs on the
|
|
5
|
+
* hot path ahead of every instrument record.
|
|
6
|
+
*
|
|
7
|
+
* The SDK's own sentinels pass through without consuming a slot: `<unknown>`
|
|
8
|
+
* (every wrapper's fallback when the model can't be read off the request) is
|
|
9
|
+
* one value however many call sites produce it, so charging it a slot would
|
|
10
|
+
* evict a real model for nothing; and `<overflow>` is the cap's own output —
|
|
11
|
+
* re-registering it would let the sentinel occupy a slot in the registry that
|
|
12
|
+
* decides what becomes the sentinel.
|
|
13
|
+
*/
|
|
14
|
+
export declare function applyModelCap(model: string, maxModels: number): string;
|
|
15
|
+
/**
|
|
16
|
+
* Returns true iff the model cap was crossed since the last call — exactly once
|
|
17
|
+
* per process, on the first consume after the cap was first hit. The instrument
|
|
18
|
+
* layer drains it so the transition surfaces as a single
|
|
19
|
+
* `frugal.gen_ai.internal_errors{stage=model_cap_hit}` point.
|
|
20
|
+
*/
|
|
21
|
+
export declare function consumeModelCapHitEvent(): boolean;
|
|
22
|
+
/** Test-only hook — clear the registry and re-arm the one-shot event. */
|
|
23
|
+
export declare function resetModelCapForTests(): void;
|
|
24
|
+
//# sourceMappingURL=model-cap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-cap.d.ts","sourceRoot":"","sources":["../src/model-cap.ts"],"names":[],"mappings":"AAuBA;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CActE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,IAAI,OAAO,CAMjD;AAED,yEAAyE;AACzE,wBAAgB,qBAAqB,IAAI,IAAI,CAI5C"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// Process-wide cardinality cap for the model axis.
|
|
2
|
+
//
|
|
3
|
+
// `gen_ai.request.model` and `gen_ai.response.model` are free-form provider
|
|
4
|
+
// strings: a deployment that mints model ids per experiment (or reads them from
|
|
5
|
+
// user input) multiplies every instrument's series count without bound. One
|
|
6
|
+
// first-come-first-served registry, shared by BOTH labels, keeps the axis
|
|
7
|
+
// bounded: the first N distinct model strings keep their names, everything past
|
|
8
|
+
// them collapses into the `<overflow>` sentinel.
|
|
9
|
+
//
|
|
10
|
+
// Deliberately one registry for both labels, not two: request and response
|
|
11
|
+
// models are overwhelmingly the same strings, and a shared budget is what the
|
|
12
|
+
// server-side series count actually cares about.
|
|
13
|
+
//
|
|
14
|
+
// Mirrors caller.ts's applyCap / consumeCapHitEvent / resetCachesForTests
|
|
15
|
+
// shape, including the one-shot "cap was just crossed" event the instrument
|
|
16
|
+
// layer drains to emit a single internal_errors point.
|
|
17
|
+
import { OVERFLOW, UNKNOWN } from "./semconv.js";
|
|
18
|
+
const seenModels = new Set();
|
|
19
|
+
let capHitNotified = false;
|
|
20
|
+
let capHitPending = false;
|
|
21
|
+
/**
|
|
22
|
+
* Register `model` and return it, or return the `<overflow>` sentinel once the
|
|
23
|
+
* registry is full. `maxModels <= 0` disables the cap. Total: non-string and
|
|
24
|
+
* empty input is returned unchanged rather than throwing — this runs on the
|
|
25
|
+
* hot path ahead of every instrument record.
|
|
26
|
+
*
|
|
27
|
+
* The SDK's own sentinels pass through without consuming a slot: `<unknown>`
|
|
28
|
+
* (every wrapper's fallback when the model can't be read off the request) is
|
|
29
|
+
* one value however many call sites produce it, so charging it a slot would
|
|
30
|
+
* evict a real model for nothing; and `<overflow>` is the cap's own output —
|
|
31
|
+
* re-registering it would let the sentinel occupy a slot in the registry that
|
|
32
|
+
* decides what becomes the sentinel.
|
|
33
|
+
*/
|
|
34
|
+
export function applyModelCap(model, maxModels) {
|
|
35
|
+
if (typeof model !== "string" || model.length === 0)
|
|
36
|
+
return model;
|
|
37
|
+
if (model === UNKNOWN || model === OVERFLOW)
|
|
38
|
+
return model;
|
|
39
|
+
if (maxModels <= 0)
|
|
40
|
+
return model;
|
|
41
|
+
if (seenModels.has(model))
|
|
42
|
+
return model;
|
|
43
|
+
if (seenModels.size < maxModels) {
|
|
44
|
+
seenModels.add(model);
|
|
45
|
+
return model;
|
|
46
|
+
}
|
|
47
|
+
if (!capHitNotified) {
|
|
48
|
+
capHitNotified = true;
|
|
49
|
+
capHitPending = true;
|
|
50
|
+
}
|
|
51
|
+
return OVERFLOW;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Returns true iff the model cap was crossed since the last call — exactly once
|
|
55
|
+
* per process, on the first consume after the cap was first hit. The instrument
|
|
56
|
+
* layer drains it so the transition surfaces as a single
|
|
57
|
+
* `frugal.gen_ai.internal_errors{stage=model_cap_hit}` point.
|
|
58
|
+
*/
|
|
59
|
+
export function consumeModelCapHitEvent() {
|
|
60
|
+
if (capHitPending) {
|
|
61
|
+
capHitPending = false;
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
/** Test-only hook — clear the registry and re-arm the one-shot event. */
|
|
67
|
+
export function resetModelCapForTests() {
|
|
68
|
+
seenModels.clear();
|
|
69
|
+
capHitNotified = false;
|
|
70
|
+
capHitPending = false;
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=model-cap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-cap.js","sourceRoot":"","sources":["../src/model-cap.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,EAAE;AACF,4EAA4E;AAC5E,gFAAgF;AAChF,4EAA4E;AAC5E,0EAA0E;AAC1E,gFAAgF;AAChF,iDAAiD;AACjD,EAAE;AACF,2EAA2E;AAC3E,8EAA8E;AAC9E,iDAAiD;AACjD,EAAE;AACF,0EAA0E;AAC1E,4EAA4E;AAC5E,uDAAuD;AAEvD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;AACrC,IAAI,cAAc,GAAG,KAAK,CAAC;AAC3B,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,SAAiB;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAClE,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC1D,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,UAAU,CAAC,IAAI,GAAG,SAAS,EAAE,CAAC;QAChC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,IAAI,CAAC;QACtB,aAAa,GAAG,IAAI,CAAC;IACvB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB;IACrC,IAAI,aAAa,EAAE,CAAC;QAClB,aAAa,GAAG,KAAK,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,qBAAqB;IACnC,UAAU,CAAC,KAAK,EAAE,CAAC;IACnB,cAAc,GAAG,KAAK,CAAC;IACvB,aAAa,GAAG,KAAK,CAAC;AACxB,CAAC"}
|
package/dist/otel.d.ts
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
import type { Counter, Histogram } from "@opentelemetry/api";
|
|
2
|
-
import { MeterProvider, type MetricReader, type PushMetricExporter } from "@opentelemetry/sdk-metrics";
|
|
2
|
+
import { MeterProvider, type MetricReader, type PushMetricExporter, type ResourceMetrics } from "@opentelemetry/sdk-metrics";
|
|
3
3
|
import type { Config } from "./config.js";
|
|
4
|
+
export declare const UNLIMITED_SERIES_PER_INSTRUMENT = 1000000;
|
|
5
|
+
/**
|
|
6
|
+
* Attribution identity for diagnostics emitted from inside the exporter
|
|
7
|
+
* wrapper. The wrapper is built before any instrument exists, so it cannot
|
|
8
|
+
* reach a Config through the module `cached` handle — the identity is passed
|
|
9
|
+
* in at construction instead.
|
|
10
|
+
*/
|
|
11
|
+
export interface ExporterIdentity {
|
|
12
|
+
projectId: string;
|
|
13
|
+
customerId: string | null;
|
|
14
|
+
}
|
|
4
15
|
export interface Instruments {
|
|
5
16
|
meterProvider: MeterProvider;
|
|
6
17
|
reader: MetricReader;
|
|
@@ -10,17 +21,31 @@ export interface Instruments {
|
|
|
10
21
|
cacheReadTokens: Histogram;
|
|
11
22
|
cacheWriteTokens: Histogram;
|
|
12
23
|
reasoningTokens: Histogram;
|
|
24
|
+
agentTurns: Histogram;
|
|
13
25
|
errors: Counter;
|
|
14
26
|
internalErrors: Counter;
|
|
15
27
|
outputCapUtilization: Histogram;
|
|
16
28
|
cachePrefixStable: Counter;
|
|
17
29
|
historyDepth: Histogram;
|
|
18
30
|
fewShotCount: Histogram;
|
|
31
|
+
fewShotTokens: Histogram;
|
|
19
32
|
noiseRatio: Histogram;
|
|
20
33
|
structuredOutputHint: Counter;
|
|
34
|
+
duplicateRequests: Counter;
|
|
21
35
|
}
|
|
22
36
|
export declare function getInstruments(config: Config): Instruments;
|
|
23
37
|
export declare function buildFromReader(config: Config, reader: MetricReader): Instruments;
|
|
38
|
+
export declare function buildReader(config: Config): MetricReader;
|
|
39
|
+
/**
|
|
40
|
+
* Walk exported metrics for data points OTel merged into its per-instrument
|
|
41
|
+
* overflow bucket, and return the de-duplicated, order-stable list of
|
|
42
|
+
* instrument names affected.
|
|
43
|
+
*
|
|
44
|
+
* Pure and total: runs on every export tick against SDK-shaped data we do not
|
|
45
|
+
* own, so every level is guarded and any surprise yields whatever was collected
|
|
46
|
+
* so far rather than an exception on the export path.
|
|
47
|
+
*/
|
|
48
|
+
export declare function scanForOverflow(metrics: ResourceMetrics): string[];
|
|
24
49
|
/**
|
|
25
50
|
* Wrap an OTLP exporter so persistent export failures surface as a single
|
|
26
51
|
* de-duped `error` debug callback. The periodic reader retries silently
|
|
@@ -30,8 +55,12 @@ export declare function buildFromReader(config: Config, reader: MetricReader): I
|
|
|
30
55
|
* one alert per failure run, not one per export tick.
|
|
31
56
|
*
|
|
32
57
|
* Delegates every other exporter method so behavior is otherwise unchanged.
|
|
58
|
+
*
|
|
59
|
+
* `identity` stamps frugal.project_id / frugal.customer_id onto the
|
|
60
|
+
* overflow-detection points below. Optional so tests (and any caller that only
|
|
61
|
+
* wants export-failure reporting) can wrap without a Config.
|
|
33
62
|
*/
|
|
34
|
-
export declare function wrapExporterForHealth(exporter: PushMetricExporter): PushMetricExporter;
|
|
63
|
+
export declare function wrapExporterForHealth(exporter: PushMetricExporter, identity?: ExporterIdentity): PushMetricExporter;
|
|
35
64
|
/**
|
|
36
65
|
* Force an immediate export of buffered metrics. No-op when uninitialized.
|
|
37
66
|
* Never throws on uninit (callers in shutdown.ts also guard).
|
|
@@ -42,7 +71,7 @@ export declare function flushMetrics(): Promise<void>;
|
|
|
42
71
|
* cache so a later wrap call lazily rebuilds. No-op when uninitialized.
|
|
43
72
|
*/
|
|
44
73
|
export declare function shutdownMetrics(): Promise<void>;
|
|
45
|
-
/** Test-only hook — wipe the cached instruments
|
|
74
|
+
/** Test-only hook — wipe the cached instruments (and any cached failure). */
|
|
46
75
|
export declare function resetInstrumentsForTests(): void;
|
|
47
76
|
/** Test-only hook — install pre-built instruments (e.g. with InMemory reader). */
|
|
48
77
|
export declare function setInstrumentsForTests(instruments: Instruments): void;
|
package/dist/otel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAuB,OAAO,EAAE,SAAS,EAAS,MAAM,oBAAoB,CAAC;AAQzF,OAAO,EAGL,aAAa,EAEb,KAAK,YAAY,EACjB,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../src/otel.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAuB,OAAO,EAAE,SAAS,EAAS,MAAM,oBAAoB,CAAC;AAQzF,OAAO,EAGL,aAAa,EAEb,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAuC1C,eAAO,MAAM,+BAA+B,UAAY,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,aAAa,CAAC;IAC7B,MAAM,EAAE,YAAY,CAAC;IACrB,iBAAiB,EAAE,SAAS,CAAC;IAC7B,UAAU,EAAE,SAAS,CAAC;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,eAAe,EAAE,SAAS,CAAC;IAC3B,gBAAgB,EAAE,SAAS,CAAC;IAC5B,eAAe,EAAE,SAAS,CAAC;IAC3B,UAAU,EAAE,SAAS,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,oBAAoB,EAAE,SAAS,CAAC;IAChC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,SAAS,CAAC;IACxB,YAAY,EAAE,SAAS,CAAC;IACxB,aAAa,EAAE,SAAS,CAAC;IACzB,UAAU,EAAE,SAAS,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAWD,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAW1D;AA2BD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CA8IjF;AA0DD,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,YAAY,CAwBxD;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,EAAE,CA6BlE;AAWD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,kBAAkB,EAC5B,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,kBAAkB,CAmFpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAKrD;AAeD,6EAA6E;AAC7E,wBAAgB,wBAAwB,IAAI,IAAI,CAQ/C;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAGrE"}
|