@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.
Files changed (59) hide show
  1. package/README.md +73 -12
  2. package/dist/block-hash-lru.d.ts +8 -1
  3. package/dist/block-hash-lru.d.ts.map +1 -1
  4. package/dist/block-hash-lru.js +13 -4
  5. package/dist/block-hash-lru.js.map +1 -1
  6. package/dist/config.d.ts +33 -0
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +218 -27
  9. package/dist/config.js.map +1 -1
  10. package/dist/duplicate-filter.d.ts +46 -0
  11. package/dist/duplicate-filter.d.ts.map +1 -0
  12. package/dist/duplicate-filter.js +168 -0
  13. package/dist/duplicate-filter.js.map +1 -0
  14. package/dist/instrument.d.ts +33 -0
  15. package/dist/instrument.d.ts.map +1 -1
  16. package/dist/instrument.js +277 -21
  17. package/dist/instrument.js.map +1 -1
  18. package/dist/model-cap.d.ts +24 -0
  19. package/dist/model-cap.d.ts.map +1 -0
  20. package/dist/model-cap.js +72 -0
  21. package/dist/model-cap.js.map +1 -0
  22. package/dist/otel.d.ts +32 -3
  23. package/dist/otel.d.ts.map +1 -1
  24. package/dist/otel.js +203 -7
  25. package/dist/otel.js.map +1 -1
  26. package/dist/prompt-analyzer.d.ts +12 -1
  27. package/dist/prompt-analyzer.d.ts.map +1 -1
  28. package/dist/prompt-analyzer.js +185 -14
  29. package/dist/prompt-analyzer.js.map +1 -1
  30. package/dist/providers.d.ts +1 -0
  31. package/dist/providers.d.ts.map +1 -1
  32. package/dist/providers.js +4 -1
  33. package/dist/providers.js.map +1 -1
  34. package/dist/semconv.d.ts +14 -0
  35. package/dist/semconv.d.ts.map +1 -1
  36. package/dist/semconv.js +38 -2
  37. package/dist/semconv.js.map +1 -1
  38. package/dist/streams.d.ts.map +1 -1
  39. package/dist/streams.js +15 -2
  40. package/dist/streams.js.map +1 -1
  41. package/dist/track.d.ts +18 -0
  42. package/dist/track.d.ts.map +1 -1
  43. package/dist/track.js +4 -1
  44. package/dist/track.js.map +1 -1
  45. package/dist/wrappers/anthropic.d.ts.map +1 -1
  46. package/dist/wrappers/anthropic.js +9 -1
  47. package/dist/wrappers/anthropic.js.map +1 -1
  48. package/dist/wrappers/batch.d.ts +11 -0
  49. package/dist/wrappers/batch.d.ts.map +1 -0
  50. package/dist/wrappers/batch.js +338 -0
  51. package/dist/wrappers/batch.js.map +1 -0
  52. package/dist/wrappers/openai.d.ts.map +1 -1
  53. package/dist/wrappers/openai.js +37 -30
  54. package/dist/wrappers/openai.js.map +1 -1
  55. package/dist/wrappers/patching.d.ts +10 -0
  56. package/dist/wrappers/patching.d.ts.map +1 -0
  57. package/dist/wrappers/patching.js +38 -0
  58. package/dist/wrappers/patching.js.map +1 -0
  59. package/package.json +1 -1
@@ -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 { BLOCK_SCHEMA, BLOCK_SYSTEM, BLOCK_TOOLS, BLOCK_USER, FRUGAL_BATCHED, FRUGAL_BLOCK, FRUGAL_CALLER_FILE, FRUGAL_CALLER_FUNCTION, FRUGAL_CUSTOMER_ID, FRUGAL_ERROR_TYPE, 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";
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.instruments.calls.add(1, attrs);
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
- ...attrs,
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
- ...attrs,
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
- const payload = this.ctx.requestPayload;
106
- if (!payload || !nonNull(payload.maxTokens) || !nonNull(usage.outputTokens)) {
107
- return;
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
- if (payload.maxTokens <= 0)
224
+ catch {
110
225
  return;
111
- const ratio = Math.min(1, usage.outputTokens / payload.maxTokens);
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
- this.instruments.calls.add(1, attrs);
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]: this.ctx.requestModel,
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;
@@ -1 +1 @@
1
- {"version":3,"file":"instrument.js","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,EAAE;AACF,yEAAyE;AACzE,wEAAwE;AACxE,sEAAsE;AACtE,8EAA8E;AAC9E,gFAAgF;AAIhF,OAAO,EACL,kBAAkB,EAClB,aAAa,GAEd,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,cAAc,EAAoB,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAElB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,YAAY,EACZ,oBAAoB,GAErB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,cAAc,EACd,YAAY,EACZ,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,aAAa,EACb,6BAA6B,EAC7B,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,YAAY,GACb,MAAM,cAAc,CAAC;AAiCtB,MAAM,UAAU,SAAS,CACvB,MAAc,EACd,GAAgB,EAChB,OAAyB,EAAE;IAE3B,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,MAAM,GACV,IAAI,CAAC,MAAM;QACX,aAAa,CAAC;YACZ,eAAe,EAAE,GAAG,CAAC,eAAe;YACpC,SAAS,EAAE,MAAM,CAAC,aAAa;YAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;SACjC,CAAC,CAAC;IACL,IAAI,kBAAkB,EAAE,EAAE,CAAC;QACzB,WAAW,CACT,iBAAiB,EACjB,MAAM,EACN,sKAAsK,CACvK,CAAC;QACF,IAAI,CAAC;YACH,WAAW,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,EAAE;gBAChC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzE,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,SAAS;gBACrC,6BAA6B,EAAE,qBAAqB;aACrD,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,0DAA0D;QAC5D,CAAC;IACH,CAAC;IACD,wEAAwE;IACxE,2EAA2E;IAC3E,iFAAiF;IACjF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IACvE,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACpD,OAAO,IAAI,WAAW,CACpB,MAAM,EACN,GAAG,EACH,MAAM,EACN,WAAW,EACX,UAAU,EAAE,EACZ,QAAQ,EACR,SAAS,CACV,CAAC;AACJ,CAAC;AAED,SAAS,UAAU;IACjB,uDAAuD;IACvD,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAClC,CAAC;AAED,MAAM,OAAO,WAAW;IAIH;IACA;IACR;IACQ;IACA;IAEA;IACA;IAVX,SAAS,GAAG,KAAK,CAAC;IAE1B,YACmB,MAAc,EACd,GAAgB,EACxB,MAAkB,EACV,WAAwB,EACxB,QAAgB;IACjC,iDAAiD;IAChC,QAAuB,EACvB,SAAiB;QAPjB,WAAM,GAAN,MAAM,CAAQ;QACd,QAAG,GAAH,GAAG,CAAa;QACxB,WAAM,GAAN,MAAM,CAAY;QACV,gBAAW,GAAX,WAAW,CAAa;QACxB,aAAQ,GAAR,QAAQ,CAAQ;QAEhB,aAAQ,GAAR,QAAQ,CAAe;QACvB,cAAS,GAAT,SAAS,CAAQ;IACjC,CAAC;IAEJ,OAAO,CAAC,KAAkB;QACxB,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,IAAI,KAAK,CAAC,aAAa,EAAE,CAAC;YACxB,KAAK,CAAC,qBAAqB,CAAC,GAAG,KAAK,CAAC,aAAa,CAAC;QACrD,CAAC;QACD,MAAM,QAAQ,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAErC,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,WAAY,EAAE;gBACrD,GAAG,KAAK;gBACR,CAAC,iBAAiB,CAAC,EAAE,WAAW;aACjC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,YAAa,EAAE;gBACtD,GAAG,KAAK;gBACR,CAAC,iBAAiB,CAAC,EAAE,YAAY;aAClC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,eAAgB,EAAE,KAAK,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAiB,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;QACD,IAAI,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,eAAgB,EAAE,KAAK,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAEO,oBAAoB,CAAC,KAAkB,EAAE,KAAiB;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;QACxC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5E,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,SAAU,IAAI,CAAC;YAAE,OAAO;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,YAAa,GAAG,OAAO,CAAC,SAAU,CAAC,CAAC;QACpE,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,MAAM,CAAC,KAAK,EAAE;YAClD,GAAG,KAAK;YACR,CAAC,6BAA6B,CAAC,EAAE,oBAAoB,CAAC,OAAO,CAAC;SAC/D,CAAC,CAAC;IACL,CAAC;IAEO,YAAY,CAAC,KAAiB;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;QACxC,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACjE,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC;YAAE,OAAO;QAC5E,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACH,MAAM,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,YAAa,EAAE,KAAK,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,YAAa,EAAE,KAAK,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,UAAW,EAAE,KAAK,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG;YACd,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;QACF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;YAChF,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC1E,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAC7E,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAClF,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC;IAEO,YAAY,CAClB,KAAiB,EACjB,KAAa,EACb,IAAmB,EACnB,IAAmB;QAEnB,yEAAyE;QACzE,0EAA0E;QAC1E,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO;QAC3C,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE;YACxC,GAAG,KAAK;YACR,CAAC,YAAY,CAAC,EAAE,KAAK;YACrB,CAAC,aAAa,CAAC,EAAE,IAAI,KAAK,IAAI;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,GAAY;QAChB,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC/B,KAAK,CAAC,iBAAiB,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,UAAU,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9C,IAAI,CAAC,WAAW,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAEO,SAAS;QACf,MAAM,KAAK,GAAe;YACxB,CAAC,aAAa,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM;YACrC,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,YAAY;YAClD,CAAC,qBAAqB,CAAC,EAAE,IAAI,CAAC,SAAS;YACvC,CAAC,oBAAoB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY;YAC7C,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS;YAC1C,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtC,CAAC,sBAAsB,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC9C,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,KAAK;SAC5C,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC3B,KAAK,CAAC,kBAAkB,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;QACrD,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,SAAS,OAAO,CAAC,CAA4B;IAC3C,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,CAAC;AACvC,CAAC;AAED,SAAS,SAAS,CAAC,GAAY;IAC7B,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,MAAM,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpF,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IACD,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;IACtD,OAAO,cAAc,CAAC;AACxB,CAAC"}
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 between tests. */
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;
@@ -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,EACxB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAyB1C,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,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,UAAU,EAAE,SAAS,CAAC;IACtB,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAS1D;AAYD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,WAAW,CAgHjF;AA+DD;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,kBAAkB,GAC3B,kBAAkB,CA8BpB;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAGlD;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAKrD;AAeD,kEAAkE;AAClE,wBAAgB,wBAAwB,IAAI,IAAI,CAO/C;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAErE"}
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"}