@frugalco/frugal-sdk-node 0.4.0 → 0.6.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 (53) hide show
  1. package/README.md +91 -17
  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 +41 -0
  7. package/dist/config.d.ts.map +1 -1
  8. package/dist/config.js +232 -53
  9. package/dist/config.js.map +1 -1
  10. package/dist/instrument.d.ts +3 -0
  11. package/dist/instrument.d.ts.map +1 -1
  12. package/dist/instrument.js +70 -22
  13. package/dist/instrument.js.map +1 -1
  14. package/dist/internal-errors.d.ts +16 -0
  15. package/dist/internal-errors.d.ts.map +1 -0
  16. package/dist/internal-errors.js +54 -0
  17. package/dist/internal-errors.js.map +1 -0
  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 +45 -4
  23. package/dist/otel.d.ts.map +1 -1
  24. package/dist/otel.js +233 -24
  25. package/dist/otel.js.map +1 -1
  26. package/dist/providers.d.ts +2 -1
  27. package/dist/providers.d.ts.map +1 -1
  28. package/dist/providers.js +36 -19
  29. package/dist/providers.js.map +1 -1
  30. package/dist/semconv.d.ts +4 -0
  31. package/dist/semconv.d.ts.map +1 -1
  32. package/dist/semconv.js +17 -2
  33. package/dist/semconv.js.map +1 -1
  34. package/dist/streams.d.ts.map +1 -1
  35. package/dist/streams.js +6 -5
  36. package/dist/streams.js.map +1 -1
  37. package/dist/track.d.ts +6 -3
  38. package/dist/track.d.ts.map +1 -1
  39. package/dist/track.js +22 -7
  40. package/dist/track.js.map +1 -1
  41. package/dist/wrappers/anthropic.d.ts.map +1 -1
  42. package/dist/wrappers/anthropic.js +11 -31
  43. package/dist/wrappers/anthropic.js.map +1 -1
  44. package/dist/wrappers/batch.d.ts.map +1 -1
  45. package/dist/wrappers/batch.js +14 -34
  46. package/dist/wrappers/batch.js.map +1 -1
  47. package/dist/wrappers/bedrock.d.ts.map +1 -1
  48. package/dist/wrappers/bedrock.js +11 -30
  49. package/dist/wrappers/bedrock.js.map +1 -1
  50. package/dist/wrappers/openai.d.ts.map +1 -1
  51. package/dist/wrappers/openai.js +10 -31
  52. package/dist/wrappers/openai.js.map +1 -1
  53. package/package.json +1 -1
package/dist/config.js CHANGED
@@ -23,9 +23,14 @@
23
23
  // viewed for the whole project (component absent) or split by component.
24
24
  //
25
25
  // The older env vars (FRUGAL_OTEL_EXPORTER_OTLP_ENDPOINT,
26
- // FRUGAL_OTEL_EXPORTER_OTLP_HEADERS, FRUGAL_REPO_ROOT, FRUGAL_CUSTOMER_ID,
27
- // plus the standard OTel ones) all still work — explicit values override
28
- // the defaults so existing customers don't need to change anything.
26
+ // FRUGAL_OTEL_EXPORTER_OTLP_HEADERS, FRUGAL_REPO_ROOT, FRUGAL_CUSTOMER_ID)
27
+ // all still work — explicit values override the defaults. The export endpoint
28
+ // and headers come only from FRUGAL_-prefixed variables: the SDK never reads
29
+ // OTEL_EXPORTER_OTLP_ENDPOINT / _HEADERS, and buildReader hides
30
+ // OTEL_EXPORTER_OTLP_HEADERS / OTEL_EXPORTER_OTLP_METRICS_HEADERS from the
31
+ // exporter library while constructing it, so the host's own OTel pipeline
32
+ // never crosses wires with Frugal's. (The exporter library still reads its
33
+ // other standard variables, such as TLS, compression and timeout.)
29
34
  import { realpathSync } from "node:fs";
30
35
  import { resolve } from "node:path";
31
36
  import { emitLog, emitLogOnce } from "./debug.js";
@@ -47,10 +52,11 @@ const ENV = {
47
52
  API_KEY: "FRUGAL_API_KEY",
48
53
  FRUGAL_OTLP_ENDPOINT: "FRUGAL_OTEL_EXPORTER_OTLP_ENDPOINT",
49
54
  FRUGAL_OTLP_HEADERS: "FRUGAL_OTEL_EXPORTER_OTLP_HEADERS",
50
- OTLP_ENDPOINT: "OTEL_EXPORTER_OTLP_ENDPOINT",
51
- OTLP_HEADERS: "OTEL_EXPORTER_OTLP_HEADERS",
55
+ METRICS_EXPORTER: "FRUGAL_METRICS_EXPORTER",
52
56
  EXPORT_INTERVAL_MS: "FRUGAL_METRIC_EXPORT_INTERVAL_MS",
53
57
  MAX_CALL_SITES: "FRUGAL_MAX_CALL_SITES",
58
+ MAX_SERIES_PER_INSTRUMENT: "FRUGAL_MAX_SERIES_PER_INSTRUMENT",
59
+ MAX_MODELS: "FRUGAL_MAX_MODELS",
54
60
  PROMPT_ANALYSIS_SAMPLE_RATE: "FRUGAL_PROMPT_ANALYSIS_SAMPLE_RATE",
55
61
  DUPLICATE_DETECTION: "FRUGAL_DUPLICATE_REQUEST_DETECTION",
56
62
  DUPLICATE_WINDOW_SECONDS: "FRUGAL_DUPLICATE_WINDOW_SECONDS",
@@ -60,6 +66,18 @@ const ENV = {
60
66
  };
61
67
  const DEFAULT_OTLP_ENDPOINT = "https://metrics.frugal.co/opentelemetry/v1/metrics";
62
68
  const DEFAULT_MAX_CALL_SITES = 500;
69
+ // OTel's own default per-instrument limit is 2000 attribute SETS, which 500
70
+ // call sites × models × token types blows through immediately. See
71
+ // docs/quickstart.md §Cardinality caps for the memory reasoning behind 50000.
72
+ const DEFAULT_MAX_SERIES_PER_INSTRUMENT = 50_000;
73
+ // 100, not 50: one logical model routinely burns TWO registry slots, because
74
+ // the request carries an alias ("gpt-4o", "claude-sonnet-4-6") while the
75
+ // response reports the dated snapshot it resolved to ("gpt-4o-2024-08-06",
76
+ // "claude-sonnet-4-6-20260115"), and both labels share one registry. So a
77
+ // deployment using 50 logical models needs ~100 strings.
78
+ const DEFAULT_MAX_MODELS = 100;
79
+ const DEFAULT_EXPORT_INTERVAL_MS = 60_000;
80
+ const MAX_EXPORT_INTERVAL_MS = 2_147_483_647;
63
81
  const DEFAULT_PROMPT_ANALYSIS_SAMPLE_RATE = 0.1;
64
82
  const DEFAULT_DUPLICATE_WINDOW_SECONDS = 3600;
65
83
  const DEFAULT_DUPLICATE_CAPACITY = 10_000;
@@ -83,8 +101,18 @@ const MAX_DUPLICATE_WINDOW_SECONDS = 86_400;
83
101
  // filter degenerates); values in [0.5, 1) must warn HERE, not silently differ
84
102
  // from what the filter actually uses.
85
103
  const MAX_DUPLICATE_FP_RATE = 0.5;
104
+ // The floor bloomParams also clamps to; clamping HERE (with a warning) keeps
105
+ // the configured value equal to what the filter uses, as in the Python SDK.
106
+ const MIN_DUPLICATE_FP_RATE = 1e-6;
107
+ // Plain or scientific-notation decimal, no sign, no NaN/Infinity, no "_".
108
+ const DECIMAL = /^(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][-+]?\d+)?$/;
86
109
  /** Upper bound on customer-registered provider names — keeps label cardinality bounded. */
87
110
  const MAX_CUSTOM_PROVIDERS = 10;
111
+ // Hard bound on the FRUGAL_COMPONENTS fan-out list. Every component multiplies
112
+ // each instrument's series count by one, so like MAX_CUSTOM_LABELS this is a
113
+ // module-private literal with no env override: the cap is the cardinality
114
+ // contract for the frugal.component label, not a tuning knob.
115
+ const MAX_COMPONENTS = 10;
88
116
  // Hard bound on the frugal.custom_label allowlist. Deliberately a
89
117
  // module-private literal with no env override: the cap is the cardinality
90
118
  // contract for the label, so it must not be user-tunable.
@@ -102,8 +130,8 @@ function explicitlyOff(value) {
102
130
  const v = value.trim().toLowerCase();
103
131
  return v === "0" || v === "false" || v === "no" || v === "off";
104
132
  }
105
- // Number(raw) validates the FULL string (unlike parseInt/parseFloat, whose
106
- // prefix parsing turns "1e6" into 1 and "10,000" into 10 — a capacity of 1
133
+ // Number(raw) validates the FULL string (unlike the Number.parse* helpers,
134
+ // whose prefix parsing turns "1e6" into 1 and "10,000" into 10 — a capacity of 1
107
135
  // means a 10-bit filter that saturates instantly). Warnings are de-duped per
108
136
  // var: loadConfig() runs on every call, so a bad value must not flood the
109
137
  // bounded debug ring buffer.
@@ -122,13 +150,106 @@ function parsePositive(raw, name, fallback, { integer = false, max } = {}) {
122
150
  }
123
151
  return parsed;
124
152
  }
153
+ // Shared shape for the integer knobs: the cardinality caps (non-negative, 0 =
154
+ // "disabled") and the export interval (strictly positive).
155
+ //
156
+ // Digits only, deliberately: Number.parseInt PREFIX-parses, so "1e6" becomes 1,
157
+ // "50_000" becomes 50 and "12abc" becomes 12 — each silently installing a cap
158
+ // orders of magnitude tighter than the operator asked for, which then collapses
159
+ // real labels into <overflow> with no diagnostic. A value that is not entirely
160
+ // digits (after trim) is treated as a typo: warn once, use the default. There is
161
+ // deliberately NO upper bound — a gateway in front of the metrics backend does
162
+ // the aggregating, so a large per-process cap is the operator's call.
163
+ const DIGITS_ONLY = /^\d+$/;
164
+ /**
165
+ * Parse a digits-only integer of at least `minimum`, warning once and falling
166
+ * back to `fallback` on anything else.
167
+ *
168
+ * The safe-integer check is a VALIDITY test, not a clamp: past
169
+ * Number.MAX_SAFE_INTEGER integer arithmetic silently loses precision and a
170
+ * long enough digit string parses to Infinity, so such a value is not a cap
171
+ * anyone can reason about. It is rejected exactly like "12abc" — default plus
172
+ * one warning — and every representable value, however large, is honored
173
+ * verbatim.
174
+ */
175
+ function parseDigitsInt(raw, name, fallback, minimum, maximum = Number.MAX_SAFE_INTEGER) {
176
+ if (!raw || !raw.trim())
177
+ return fallback;
178
+ const trimmed = raw.trim();
179
+ if (DIGITS_ONLY.test(trimmed)) {
180
+ const parsed = Number(trimmed);
181
+ if (Number.isSafeInteger(parsed) && parsed >= minimum && parsed <= maximum) {
182
+ return parsed;
183
+ }
184
+ }
185
+ emitLogOnce(`bad_env_${name}`, "warn", `could not parse ${name}=${raw}; using default ${fallback}`);
186
+ return fallback;
187
+ }
188
+ /** Cardinality caps: 0 means "disabled". */
189
+ function parseNonNegativeInt(raw, name, fallback) {
190
+ return parseDigitsInt(raw, name, fallback, 0);
191
+ }
125
192
  function warnOnce(message) {
126
193
  if (warnedOnce)
127
194
  return;
128
195
  warnedOnce = true;
129
196
  emitLog("warn", `disabled: ${message}`);
130
197
  }
198
+ /**
199
+ * Load the configuration, or null when the SDK should stay a no-op.
200
+ *
201
+ * Every wrapX() calls this at the customer's module scope, so a throw here
202
+ * crashes the host app before it has run a line of its own code. Nothing in
203
+ * the body is supposed to throw — but it reads the environment and touches the
204
+ * filesystem (process.cwd() raises ENOENT when the working directory has been
205
+ * removed, realpathSync can raise on a broken mount), so the whole thing is
206
+ * contained: any failure disables the SDK with one diagnostic instead of
207
+ * taking the process with it.
208
+ */
131
209
  export function loadConfig() {
210
+ try {
211
+ return loadConfigUnguarded();
212
+ }
213
+ catch (err) {
214
+ emitLogOnce("config_load_failed", "error", `configuration could not be loaded (${err instanceof Error ? err.message : String(err)}); frugal-metrics is disabled for this process`);
215
+ return null;
216
+ }
217
+ }
218
+ /**
219
+ * Parse an OTLP `key=value,key=value` header string. Values are
220
+ * percent-decoded like OTel's own env parser (`Bearer%20tok` → `Bearer tok`);
221
+ * keys are kept literal, and a value that fails to decode is kept raw. Parts
222
+ * without `=` or with an empty key are dropped; a string with no pairs at all
223
+ * returns undefined.
224
+ * Same rule in the Python and Go SDKs.
225
+ */
226
+ export function parseHeaders(raw) {
227
+ if (!raw)
228
+ return undefined;
229
+ const out = {};
230
+ for (const part of raw.split(",")) {
231
+ const trimmed = part.trim();
232
+ if (!trimmed)
233
+ continue;
234
+ const eq = trimmed.indexOf("=");
235
+ if (eq < 0)
236
+ continue;
237
+ const key = trimmed.slice(0, eq).trim();
238
+ if (!key)
239
+ continue;
240
+ const value = trimmed.slice(eq + 1).trim();
241
+ let decoded = value;
242
+ try {
243
+ decoded = decodeURIComponent(value);
244
+ }
245
+ catch {
246
+ // URIError (e.g. `%zz`): keep the raw value.
247
+ }
248
+ out[key] = decoded;
249
+ }
250
+ return Object.keys(out).length > 0 ? out : undefined;
251
+ }
252
+ function loadConfigUnguarded() {
132
253
  if (truthy(process.env[ENV.DISABLED]))
133
254
  return null;
134
255
  const customerId = process.env[ENV.CUSTOMER_ID] || null;
@@ -137,23 +258,55 @@ export function loadConfig() {
137
258
  // override falls through to the bare name rather than blanking the value.
138
259
  const projectId = process.env[ENV.METRICS_PROJECT_ID] || process.env[ENV.PROJECT_ID];
139
260
  const repoRootEnv = process.env[ENV.REPO_ROOT];
140
- const apiKey = process.env[ENV.METRICS_API_KEY] || process.env[ENV.API_KEY];
141
- // Explicit headers override anything we'd build from the API key — keeps
142
- // existing deployments that set FRUGAL_OTEL_EXPORTER_OTLP_HEADERS directly
143
- // working unchanged.
144
- const explicitHeaders = process.env[ENV.FRUGAL_OTLP_HEADERS] ?? process.env[ENV.OTLP_HEADERS];
145
- const otlpHeaders = explicitHeaders
146
- ? explicitHeaders
147
- : apiKey
148
- ? `Authorization=Bearer ${apiKey}`
149
- : null;
150
- // Required for any useful run: PROJECT_ID (the attribution key) and SOME auth
151
- // (either FRUGAL_API_KEY or an explicit OTLP_HEADERS containing the bearer).
261
+ // Trimmed: a secret mounted with a trailing newline would otherwise put a
262
+ // CR/LF in the Authorization header, which Node's http rejects on every
263
+ // export. `%` and `,` inside the key stay verbatim. A whitespace-only value
264
+ // falls through like an empty one.
265
+ const apiKey = process.env[ENV.METRICS_API_KEY]?.trim() || process.env[ENV.API_KEY]?.trim();
266
+ // Header rule, identical across the Node, Python and Go SDKs:
267
+ // FRUGAL_OTEL_EXPORTER_OTLP_HEADERS, else the bearer built from the API key,
268
+ // else none. Endpoint and auth come only from FRUGAL_-prefixed variables: the
269
+ // generic OTEL_EXPORTER_OTLP_HEADERS / _ENDPOINT belong to the host's own OTel
270
+ // pipeline, so honoring them could send another vendor's header to Frugal or
271
+ // the Frugal bearer to another vendor (buildReader also hides the generic
272
+ // header variables from the exporter library, which would otherwise merge
273
+ // them in). `||`, not `??`: an empty value falls through to the next source.
274
+ // An explicit headers value always wins, even when it parses to no pairs:
275
+ // that is treated as missing auth below, never as a fallback to the key.
276
+ // Decided on the trimmed value: a blank (whitespace-only) value counts as
277
+ // unset and falls through to the API key, like a blank key does.
278
+ const explicitHeaders = process.env[ENV.FRUGAL_OTLP_HEADERS]?.trim() || null;
279
+ const explicitHeadersUnparseable = explicitHeaders !== null && parseHeaders(explicitHeaders) === undefined;
280
+ const otlpApiKey = !explicitHeaders && apiKey ? apiKey : null;
281
+ const otlpHeaders = explicitHeaders || (otlpApiKey ? `Authorization=Bearer ${otlpApiKey}` : null);
282
+ // Explicit opt-in for the console exporter (local verification). Anything but
283
+ // `otlp` / `console` warns once and keeps the default. Endpoint and headers
284
+ // are simply not consulted in console mode.
285
+ let exporter = "otlp";
286
+ const exporterRaw = process.env[ENV.METRICS_EXPORTER];
287
+ if (exporterRaw && exporterRaw.trim()) {
288
+ const mode = exporterRaw.trim().toLowerCase();
289
+ if (mode === "console") {
290
+ exporter = "console";
291
+ }
292
+ else if (mode !== "otlp") {
293
+ emitLogOnce(`bad_env_${ENV.METRICS_EXPORTER}`, "warn", `could not parse ${ENV.METRICS_EXPORTER}=${exporterRaw}; using default otlp`);
294
+ }
295
+ }
296
+ // Required for any useful run. OTLP mode: PROJECT_ID (the attribution key)
297
+ // and SOME auth (either FRUGAL_API_KEY or an explicit OTLP_HEADERS containing
298
+ // the bearer; an explicit headers value with no key=value pairs counts as
299
+ // missing). Console mode prints locally and sends nothing, so only the
300
+ // project id is required; the API key, endpoint and headers are ignored.
152
301
  const missing = [];
153
302
  if (!projectId)
154
303
  missing.push(ENV.PROJECT_ID);
155
- if (!otlpHeaders)
304
+ if (exporter !== "console" && explicitHeadersUnparseable) {
305
+ missing.push(`${ENV.FRUGAL_OTLP_HEADERS} (set but has no key=value pairs)`);
306
+ }
307
+ else if (exporter !== "console" && !otlpHeaders) {
156
308
  missing.push(`${ENV.API_KEY} or ${ENV.FRUGAL_OTLP_HEADERS}`);
309
+ }
157
310
  if (missing.length > 0) {
158
311
  warnOnce(`missing required env vars: ${missing.join(", ")}`);
159
312
  return null;
@@ -177,11 +330,25 @@ export function loadConfig() {
177
330
  .filter((e) => e.length > 0);
178
331
  // Optional comma-separated logical components (e.g. "ai-handler,reco"). Each
179
332
  // becomes an extra per-component series on top of the base project series.
333
+ // Each component multiplies every instrument's series count by one, so the
334
+ // list is truncated to MAX_COMPONENTS at parse time. No sentinel: a dropped
335
+ // component simply produces no per-component series — the base project-level
336
+ // series still counts every call.
337
+ //
338
+ // Deduped (order-preservingly, via Set insertion order) BEFORE the slice: a
339
+ // repeated entry costs no extra series, so letting duplicates consume budget
340
+ // would drop real components — and warn about it — for no cardinality gain.
180
341
  const componentsRaw = process.env[ENV.COMPONENTS] ?? "";
181
- const components = componentsRaw
182
- .split(",")
183
- .map((e) => e.trim())
184
- .filter((e) => e.length > 0);
342
+ const componentsAll = [
343
+ ...new Set(componentsRaw
344
+ .split(",")
345
+ .map((e) => e.trim())
346
+ .filter((e) => e.length > 0)),
347
+ ];
348
+ const components = componentsAll.slice(0, MAX_COMPONENTS);
349
+ if (components.length < componentsAll.length) {
350
+ emitLogOnce("components_truncated", "warn", `${ENV.COMPONENTS} lists ${componentsAll.length} entries; only the first ${MAX_COMPONENTS} are honored and ${componentsAll.length - components.length} are dropped (no per-component series for them).`);
351
+ }
185
352
  // Optional comma-separated allowlist of custom provider names that pass through
186
353
  // verbatim (e.g. "together_ai,fireworks"). Deduped and capped at
187
354
  // MAX_CUSTOM_PROVIDERS so a misconfigured value can't blow up label cardinality.
@@ -216,38 +383,42 @@ export function loadConfig() {
216
383
  if (customLabels.length < customLabelsParsed.length) {
217
384
  emitLogOnce("custom_labels_reserved", "warn", `${ENV.CUSTOM_LABEL} contains the reserved value "${CUSTOM_LABEL_OTHER}" (the coercion sentinel); it is ignored — rename that label to keep it distinguishable from coerced values.`);
218
385
  }
219
- if (customLabelEntries.length > MAX_CUSTOM_LABELS && customLabelsRaw.trim()) {
220
- emitLogOnce("custom_labels_truncated", "warn", `${ENV.CUSTOM_LABEL} lists ${customLabelEntries.length} entries; only the first ${MAX_CUSTOM_LABELS} are honored, values outside them are coerced to "${CUSTOM_LABEL_OTHER}".`);
221
- }
222
- const otlpEndpoint = process.env[ENV.FRUGAL_OTLP_ENDPOINT] ??
223
- process.env[ENV.OTLP_ENDPOINT] ??
224
- DEFAULT_OTLP_ENDPOINT;
225
- const intervalRaw = process.env[ENV.EXPORT_INTERVAL_MS];
226
- let exportIntervalMs = 60_000;
227
- if (intervalRaw && intervalRaw.trim()) {
228
- const parsed = Number.parseInt(intervalRaw, 10);
229
- if (Number.isFinite(parsed)) {
230
- exportIntervalMs = parsed;
231
- }
232
- else {
233
- emitLogOnce(`bad_env_${ENV.EXPORT_INTERVAL_MS}`, "warn", `could not parse ${ENV.EXPORT_INTERVAL_MS}=${intervalRaw}; using default ${exportIntervalMs}`);
234
- }
235
- }
236
- const maxCallSitesRaw = process.env[ENV.MAX_CALL_SITES];
237
- let maxCallSites = DEFAULT_MAX_CALL_SITES;
238
- if (maxCallSitesRaw && maxCallSitesRaw.trim()) {
239
- const parsed = Number.parseInt(maxCallSitesRaw, 10);
240
- if (Number.isFinite(parsed) && parsed >= 0) {
241
- maxCallSites = parsed;
242
- }
243
- else {
244
- emitLogOnce(`bad_env_${ENV.MAX_CALL_SITES}`, "warn", `could not parse ${ENV.MAX_CALL_SITES}=${maxCallSitesRaw}; using default ${maxCallSites}`);
245
- }
386
+ // Warn only when a real entry is actually dropped: blank positions past the
387
+ // 20th (a trailing comma, ", , ") cost nothing and must not warn. The text
388
+ // is shared verbatim with the Python and Go SDKs.
389
+ const dropped = customLabelEntries
390
+ .slice(MAX_CUSTOM_LABELS)
391
+ .map((e) => e.trim())
392
+ .filter((e) => e.length > 0);
393
+ if (dropped.length > 0) {
394
+ emitLogOnce("custom_labels_truncated", "warn", `${ENV.CUSTOM_LABEL} has ${dropped.length} non-empty entries past the first ${MAX_CUSTOM_LABELS}; they are ignored and values matching them are coerced to "${CUSTOM_LABEL_OTHER}".`);
246
395
  }
396
+ // `||`, not `??`: an empty value falls through to the default. The generic
397
+ // OTEL_EXPORTER_OTLP_ENDPOINT is never read (see the header comment above).
398
+ // The console exporter is chosen only via FRUGAL_METRICS_EXPORTER=console,
399
+ // never by an empty endpoint.
400
+ const otlpEndpoint = process.env[ENV.FRUGAL_OTLP_ENDPOINT] || DEFAULT_OTLP_ENDPOINT;
401
+ // Strictly positive: PeriodicExportingMetricReader THROWS on an interval of
402
+ // 0 or less, and that throw propagates out of getInstruments on the
403
+ // customer's first call. Every wrapper catches it, so the SDK degrades to a
404
+ // no-op rather than breaking the host — but a typo silently costing all
405
+ // metrics is worse than a typo that warns and uses the default.
406
+ //
407
+ // Capped at 2^31-1 ms: setInterval clamps a larger delay to 1 ms, which would
408
+ // turn the export loop into a hot spin inside the customer's process. A value
409
+ // above the cap is treated as malformed (warn once, use the default).
410
+ const exportIntervalMs = parseDigitsInt(process.env[ENV.EXPORT_INTERVAL_MS], ENV.EXPORT_INTERVAL_MS, DEFAULT_EXPORT_INTERVAL_MS, 1, MAX_EXPORT_INTERVAL_MS);
411
+ const maxCallSites = parseNonNegativeInt(process.env[ENV.MAX_CALL_SITES], ENV.MAX_CALL_SITES, DEFAULT_MAX_CALL_SITES);
412
+ const maxSeriesPerInstrument = parseNonNegativeInt(process.env[ENV.MAX_SERIES_PER_INSTRUMENT], ENV.MAX_SERIES_PER_INSTRUMENT, DEFAULT_MAX_SERIES_PER_INSTRUMENT);
413
+ const maxModels = parseNonNegativeInt(process.env[ENV.MAX_MODELS], ENV.MAX_MODELS, DEFAULT_MAX_MODELS);
414
+ // Strict decimal grammar (shared with the Python SDK): the WHOLE trimmed
415
+ // value must be a plain or scientific-notation decimal, so "0.5abc", "+0.5",
416
+ // "nan", "Infinity" and "1_0" are rejected rather than prefix-parsed.
247
417
  const sampleRateRaw = process.env[ENV.PROMPT_ANALYSIS_SAMPLE_RATE];
248
418
  let promptAnalysisSampleRate = DEFAULT_PROMPT_ANALYSIS_SAMPLE_RATE;
249
419
  if (sampleRateRaw && sampleRateRaw.trim()) {
250
- const parsed = Number.parseFloat(sampleRateRaw);
420
+ const trimmed = sampleRateRaw.trim();
421
+ const parsed = DECIMAL.test(trimmed) ? Number(trimmed) : Number.NaN;
251
422
  if (Number.isFinite(parsed) && parsed >= 0 && parsed <= 1) {
252
423
  promptAnalysisSampleRate = parsed;
253
424
  }
@@ -265,6 +436,10 @@ export function loadConfig() {
265
436
  emitLogOnce(`clamped_env_${ENV.DUPLICATE_FP_RATE}`, "warn", `${ENV.DUPLICATE_FP_RATE}=${fpRate} exceeds the maximum ${MAX_DUPLICATE_FP_RATE}; clamping to ${MAX_DUPLICATE_FP_RATE}`);
266
437
  duplicateFpRate = MAX_DUPLICATE_FP_RATE;
267
438
  }
439
+ else if (fpRate < MIN_DUPLICATE_FP_RATE) {
440
+ emitLogOnce(`clamped_env_${ENV.DUPLICATE_FP_RATE}`, "warn", `${ENV.DUPLICATE_FP_RATE}=${fpRate} is below the minimum ${MIN_DUPLICATE_FP_RATE}; clamping to ${MIN_DUPLICATE_FP_RATE}`);
441
+ duplicateFpRate = MIN_DUPLICATE_FP_RATE;
442
+ }
268
443
  // The kill switch disables only on an explicit off value. Operators reach
269
444
  // for this knob on privacy/overhead grounds, so a value we don't recognize
270
445
  // ("disabled", "n", …) must not silently leave full-payload hashing on.
@@ -283,10 +458,14 @@ export function loadConfig() {
283
458
  customLabels,
284
459
  repoRoot: repoRootAbs,
285
460
  pathBlockList,
461
+ exporter,
286
462
  otlpEndpoint,
287
- otlpHeaders: otlpHeaders,
463
+ otlpHeaders: otlpHeaders ?? "",
464
+ otlpApiKey,
288
465
  exportIntervalMs,
289
466
  maxCallSites,
467
+ maxSeriesPerInstrument,
468
+ maxModels,
290
469
  promptAnalysisSampleRate,
291
470
  duplicateDetection: !explicitlyOff(process.env[ENV.DUPLICATE_DETECTION]),
292
471
  duplicateWindowSeconds: parsePositive(process.env[ENV.DUPLICATE_WINDOW_SECONDS], ENV.DUPLICATE_WINDOW_SECONDS, DEFAULT_DUPLICATE_WINDOW_SECONDS, { max: MAX_DUPLICATE_WINDOW_SECONDS }),
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -27,6 +27,7 @@ export interface UsageReport {
27
27
  cacheReadTokens?: number | null;
28
28
  cacheWriteTokens?: number | null;
29
29
  reasoningTokens?: number | null;
30
+ agentTurns?: number | null;
30
31
  }
31
32
  export interface StartCallOptions {
32
33
  /**
@@ -49,6 +50,8 @@ export declare class CallEmitter {
49
50
  private readonly operation;
50
51
  private finalized;
51
52
  constructor(config: Config, ctx: CallContext, caller: CallerInfo, instruments: Instruments, startSec: number, provider: ProviderEntry, operation: string);
53
+ /** Count and log an emission failure caught off the wrapper's own path. */
54
+ recordEmissionFailure(err: unknown): void;
52
55
  success(usage: UsageReport): void;
53
56
  private recordCallShape;
54
57
  private recordInternalError;
@@ -1 +1 @@
1
- {"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instrument.d.ts","sourceRoot":"","sources":["../src/instrument.ts"],"names":[],"mappings":"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"}