@frugalco/frugal-sdk-node 0.2.0 → 0.4.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 (55) hide show
  1. package/README.md +21 -10
  2. package/dist/config.d.ts +17 -0
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +130 -4
  5. package/dist/config.js.map +1 -1
  6. package/dist/duplicate-filter.d.ts +46 -0
  7. package/dist/duplicate-filter.d.ts.map +1 -0
  8. package/dist/duplicate-filter.js +168 -0
  9. package/dist/duplicate-filter.js.map +1 -0
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/instrument.d.ts +36 -1
  15. package/dist/instrument.d.ts.map +1 -1
  16. package/dist/instrument.js +242 -22
  17. package/dist/instrument.js.map +1 -1
  18. package/dist/otel.d.ts +2 -0
  19. package/dist/otel.d.ts.map +1 -1
  20. package/dist/otel.js +17 -2
  21. package/dist/otel.js.map +1 -1
  22. package/dist/prompt-analyzer.d.ts +12 -1
  23. package/dist/prompt-analyzer.d.ts.map +1 -1
  24. package/dist/prompt-analyzer.js +185 -14
  25. package/dist/prompt-analyzer.js.map +1 -1
  26. package/dist/providers.d.ts +87 -0
  27. package/dist/providers.d.ts.map +1 -0
  28. package/dist/providers.js +128 -0
  29. package/dist/providers.js.map +1 -0
  30. package/dist/semconv.d.ts +12 -0
  31. package/dist/semconv.d.ts.map +1 -1
  32. package/dist/semconv.js +31 -0
  33. package/dist/semconv.js.map +1 -1
  34. package/dist/streams.d.ts.map +1 -1
  35. package/dist/streams.js +15 -2
  36. package/dist/streams.js.map +1 -1
  37. package/dist/track.d.ts +32 -4
  38. package/dist/track.d.ts.map +1 -1
  39. package/dist/track.js +2 -1
  40. package/dist/track.js.map +1 -1
  41. package/dist/wrappers/anthropic.d.ts.map +1 -1
  42. package/dist/wrappers/anthropic.js +9 -1
  43. package/dist/wrappers/anthropic.js.map +1 -1
  44. package/dist/wrappers/batch.d.ts +11 -0
  45. package/dist/wrappers/batch.d.ts.map +1 -0
  46. package/dist/wrappers/batch.js +338 -0
  47. package/dist/wrappers/batch.js.map +1 -0
  48. package/dist/wrappers/openai.d.ts.map +1 -1
  49. package/dist/wrappers/openai.js +37 -30
  50. package/dist/wrappers/openai.js.map +1 -1
  51. package/dist/wrappers/patching.d.ts +10 -0
  52. package/dist/wrappers/patching.d.ts.map +1 -0
  53. package/dist/wrappers/patching.js +38 -0
  54. package/dist/wrappers/patching.js.map +1 -0
  55. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-analyzer.d.ts","sourceRoot":"","sources":["../src/prompt-analyzer.ts"],"names":[],"mappings":"AAeA,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,CActE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAWpE;AAyKD,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,MAAmB,GACzB,OAAO,CAYT"}
1
+ {"version":3,"file":"prompt-analyzer.d.ts","sourceRoot":"","sources":["../src/prompt-analyzer.ts"],"names":[],"mappings":"AAQA,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qCAAqC;IACrC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,wEAAwE;IACxE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;OAKG;IACH,kBAAkB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACpC;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,cAAc,CActE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAWpE;AA2JD,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAGnE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa,CAQtD;AA0HD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,cAAc,EACvB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CA8Bf;AA6BD,wBAAgB,YAAY,CAC1B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,GAAE,MAAmB,GACzB,OAAO,CAYT"}
@@ -11,8 +11,8 @@ export function analyzeRequest(payload) {
11
11
  userHash: safe(() => hashUserBlock(payload), null),
12
12
  toolsHash: safe(() => hashJSON(payload.tools), null),
13
13
  schemaHash: safe(() => hashJSON(payload.responseFormat), null),
14
- historyDepth: safe(() => historyDepth(payload), null),
15
14
  fewShotCount: safe(() => fewShotCount(payload), null),
15
+ fewShotTokens: safe(() => fewShotTokens(payload), null),
16
16
  noiseRatio: safe(() => noiseRatio(payload), null),
17
17
  structuredOutputHint: safe(() => structuredOutputHint(payload), false),
18
18
  };
@@ -49,14 +49,98 @@ function hashJSON(value) {
49
49
  return sha256(canonicalize(value));
50
50
  }
51
51
  function canonicalize(value) {
52
- if (value === null || typeof value !== "object")
53
- return JSON.stringify(value);
54
- if (Array.isArray(value)) {
55
- return "[" + value.map((v) => canonicalize(v)).join(",") + "]";
52
+ const parts = [];
53
+ streamCanonical(value, (chunk) => parts.push(chunk));
54
+ return parts.join("");
55
+ }
56
+ // Canonical-JSON serialization pushed through a sink chunk by chunk, so the
57
+ // signature path can hash incrementally under a byte budget instead of
58
+ // materializing one giant string. Normalized to JSON wire semantics: an
59
+ // explicitly-undefined property serializes identically to an omitted one, so
60
+ // SDK-built objects with optional undefined props can't evade duplicate
61
+ // detection. Binary content (TypedArray / ArrayBuffer — e.g. Bedrock Converse
62
+ // images) contributes only its byteLength, never its bytes: hashing megabytes
63
+ // of image data per call buys no duplicate signal worth its CPU cost, and the
64
+ // generic object branch would sort one key per byte.
65
+ //
66
+ // This walk runs on 100% of chat calls, so every input dimension is bounded,
67
+ // not just the total output (the sink's byte budget checks a chunk only after
68
+ // it exists):
69
+ // - String leaves are capped at MAX_STRING_LEAF_CHARS before stringification.
70
+ // Base64 images arrive as plain strings (OpenAI `image_url.url`, Anthropic
71
+ // `source.data`) — stringifying a multi-MB data URL whole would allocate a
72
+ // same-sized escaped copy per call. The leaf contributes its head plus its
73
+ // total length, so strings identical through the cap but of different
74
+ // lengths still differ; same-length strings differing only past the cap
75
+ // collide — the same trade-off as the binary byteLength branch.
76
+ // - Recursion is depth-capped (everything below MAX_CANONICAL_DEPTH collapses
77
+ // to one marker) — the byte budget bounds breadth but not depth, and a
78
+ // pathologically nested payload would exhaust the JS stack first.
79
+ // - Ancestor cycles emit a marker instead of recursing forever. The guard is
80
+ // path-scoped (added on entry, removed on exit), so a shared sub-object
81
+ // appearing twice (a DAG) still serializes both times.
82
+ const MAX_STRING_LEAF_CHARS = 8 * 1024;
83
+ const MAX_CANONICAL_DEPTH = 64;
84
+ function streamCanonical(value, sink) {
85
+ walkCanonical(value, sink, 0, new WeakSet());
86
+ }
87
+ function walkCanonical(value, sink, depth, ancestors) {
88
+ if (typeof value === "string" && value.length > MAX_STRING_LEAF_CHARS) {
89
+ sink(JSON.stringify(`${value.slice(0, MAX_STRING_LEAF_CHARS)}<str:${value.length}>`));
90
+ return;
91
+ }
92
+ if (value === null || typeof value !== "object") {
93
+ // JSON.stringify yields undefined for undefined/function/symbol — all
94
+ // serialize as null on the wire.
95
+ sink(JSON.stringify(value) ?? "null");
96
+ return;
97
+ }
98
+ if (ArrayBuffer.isView(value)) {
99
+ sink(`"<binary:${value.byteLength}>"`);
100
+ return;
101
+ }
102
+ if (value instanceof ArrayBuffer) {
103
+ sink(`"<binary:${value.byteLength}>"`);
104
+ return;
105
+ }
106
+ if (depth >= MAX_CANONICAL_DEPTH) {
107
+ sink('"<maxdepth>"');
108
+ return;
109
+ }
110
+ if (ancestors.has(value)) {
111
+ sink('"<cycle>"');
112
+ return;
113
+ }
114
+ ancestors.add(value);
115
+ try {
116
+ if (Array.isArray(value)) {
117
+ sink("[");
118
+ for (let i = 0; i < value.length; i++) {
119
+ if (i > 0)
120
+ sink(",");
121
+ walkCanonical(value[i], sink, depth + 1, ancestors);
122
+ }
123
+ sink("]");
124
+ return;
125
+ }
126
+ const obj = value;
127
+ const keys = Object.keys(obj)
128
+ .filter((k) => obj[k] !== undefined)
129
+ .sort();
130
+ sink("{");
131
+ for (let i = 0; i < keys.length; i++) {
132
+ if (i > 0)
133
+ sink(",");
134
+ sink(JSON.stringify(keys[i]) + ":");
135
+ walkCanonical(obj[keys[i]], sink, depth + 1, ancestors);
136
+ }
137
+ sink("}");
138
+ }
139
+ finally {
140
+ // finally, not post-loop: the budget sink aborts the walk by throwing, and
141
+ // the ancestor set must unwind with the stack either way.
142
+ ancestors.delete(value);
56
143
  }
57
- const keys = Object.keys(value).sort();
58
- const parts = keys.map((k) => JSON.stringify(k) + ":" + canonicalize(value[k]));
59
- return "{" + parts.join(",") + "}";
60
144
  }
61
145
  function hashSystemBlock(payload) {
62
146
  const blocks = [];
@@ -88,12 +172,27 @@ function hashUserBlock(payload) {
88
172
  return hashJSON(blocks);
89
173
  }
90
174
  // --- structural counts -----------------------------------------------------
91
- function historyDepth(payload) {
175
+ export function historyDepth(payload) {
92
176
  if (!Array.isArray(payload.messages))
93
177
  return null;
94
178
  return payload.messages.length;
95
179
  }
96
- function fewShotCount(payload) {
180
+ export function historyBucket(n) {
181
+ if (n <= 0)
182
+ return "0";
183
+ if (n <= 2)
184
+ return "1-2";
185
+ if (n <= 5)
186
+ return "3-5";
187
+ if (n <= 10)
188
+ return "6-10";
189
+ if (n <= 20)
190
+ return "11-20";
191
+ if (n <= 50)
192
+ return "21-50";
193
+ return "51+";
194
+ }
195
+ function fewShotSpan(payload) {
97
196
  if (!Array.isArray(payload.messages))
98
197
  return null;
99
198
  const msgs = payload.messages.filter((m) => m !== null && typeof m === "object");
@@ -113,20 +212,51 @@ function fewShotCount(payload) {
113
212
  if (Array.isArray(m.tool_calls) && m.tool_calls.length > 0)
114
213
  return null;
115
214
  }
116
- // Count consecutive (user, assistant) pairs preceding the final user.
117
- let pairs = 0;
215
+ // Collect consecutive (user, assistant) pairs preceding the final user.
216
+ const exampleMessages = [];
118
217
  let j = i;
119
218
  const lastIdx = msgs.length - 1; // final user
120
219
  while (j + 1 < lastIdx) {
121
220
  if (msgs[j].role === "user" && msgs[j + 1].role === "assistant") {
122
- pairs++;
221
+ exampleMessages.push(msgs[j], msgs[j + 1]);
123
222
  j += 2;
124
223
  }
125
224
  else {
126
225
  break;
127
226
  }
128
227
  }
129
- return pairs;
228
+ return { pairs: exampleMessages.length / 2, exampleMessages };
229
+ }
230
+ function fewShotCount(payload) {
231
+ const span = fewShotSpan(payload);
232
+ return span === null ? null : span.pairs;
233
+ }
234
+ function fewShotTokens(payload) {
235
+ const span = fewShotSpan(payload);
236
+ if (span === null)
237
+ return null;
238
+ return estimateTokens(messagesText(span.exampleMessages));
239
+ }
240
+ function estimateTokens(text) {
241
+ return Math.ceil(text.length / 4);
242
+ }
243
+ function messagesText(messages) {
244
+ const parts = [];
245
+ for (const m of messages) {
246
+ const content = m.content;
247
+ if (typeof content === "string")
248
+ parts.push(content);
249
+ else if (Array.isArray(content)) {
250
+ for (const c of content) {
251
+ if (!c || typeof c !== "object")
252
+ continue;
253
+ const text = c.text;
254
+ if (typeof text === "string")
255
+ parts.push(text);
256
+ }
257
+ }
258
+ }
259
+ return parts.join("\n");
130
260
  }
131
261
  // --- noise ratio -----------------------------------------------------------
132
262
  const HTML_TAG_REGEX = /<[^>]+>/g;
@@ -170,6 +300,47 @@ function collectText(payload) {
170
300
  }
171
301
  return parts.join("\n");
172
302
  }
303
+ // The signature runs on 100% of chat calls, synchronously on the caller's hot
304
+ // path, so its cost must stay bounded regardless of payload size. Hashing is
305
+ // incremental (no giant intermediate string) and capped: past
306
+ // SIGNATURE_MAX_CHARS canonical characters, traversal stops and a truncation
307
+ // marker plus the message count is folded in instead. Multi-MB payloads
308
+ // identical in their first 256K canonical chars therefore collide — an
309
+ // accepted trade-off; the alternative is serializing megabytes per call.
310
+ const SIGNATURE_MAX_CHARS = 256 * 1024;
311
+ const TRUNCATED = Symbol("frugal.signature.truncated");
312
+ export function requestSignature(payload, model, callSiteId) {
313
+ if (!Array.isArray(payload.messages))
314
+ return null;
315
+ const hash = createHash("sha256");
316
+ let remaining = SIGNATURE_MAX_CHARS;
317
+ const sink = (chunk) => {
318
+ remaining -= chunk.length;
319
+ if (remaining < 0)
320
+ throw TRUNCATED;
321
+ hash.update(chunk);
322
+ };
323
+ try {
324
+ streamCanonical({
325
+ site: callSiteId,
326
+ model,
327
+ system: payload.system ?? null,
328
+ messages: payload.messages,
329
+ tools: payload.tools ?? null,
330
+ responseFormat: payload.responseFormat ?? null,
331
+ maxTokens: payload.maxTokens ?? null,
332
+ ...(payload.previousResponseId
333
+ ? { previousResponseId: payload.previousResponseId }
334
+ : {}),
335
+ }, sink);
336
+ }
337
+ catch (err) {
338
+ if (err !== TRUNCATED)
339
+ throw err;
340
+ hash.update(`|truncated|messages:${payload.messages.length}`);
341
+ }
342
+ return hash.digest("hex");
343
+ }
173
344
  // --- structured output hint ------------------------------------------------
174
345
  const STRUCTURED_HINT_REGEXES = [
175
346
  /format\s+as\s+JSON/i,
@@ -1 +1 @@
1
- {"version":3,"file":"prompt-analyzer.js","sourceRoot":"","sources":["../src/prompt-analyzer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"prompt-analyzer.js","sourceRoot":"","sources":["../src/prompt-analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { OP_OTHER } from "./semconv.js";
2
+ export interface ProviderEntry {
3
+ /** Legacy `gen_ai.system` value — kept for back-compat. */
4
+ system: string;
5
+ /** New `gen_ai.provider.name` value — current OTel spelling. */
6
+ providerName: string;
7
+ }
8
+ export declare const PROVIDERS: readonly [{
9
+ readonly system: "openai";
10
+ readonly providerName: "openai";
11
+ }, {
12
+ readonly system: "anthropic";
13
+ readonly providerName: "anthropic";
14
+ }, {
15
+ readonly system: "aws.bedrock";
16
+ readonly providerName: "aws.bedrock";
17
+ }, {
18
+ readonly system: "vertex_ai";
19
+ readonly providerName: "gcp.vertex_ai";
20
+ }, {
21
+ readonly system: "az.ai.openai";
22
+ readonly providerName: "azure.ai.openai";
23
+ }, {
24
+ readonly system: "cohere";
25
+ readonly providerName: "cohere";
26
+ }, {
27
+ readonly system: "mistral_ai";
28
+ readonly providerName: "mistral_ai";
29
+ }, {
30
+ readonly system: "deepseek";
31
+ readonly providerName: "deepseek";
32
+ }, {
33
+ readonly system: "groq";
34
+ readonly providerName: "groq";
35
+ }, {
36
+ readonly system: "perplexity";
37
+ readonly providerName: "perplexity";
38
+ }, {
39
+ readonly system: "x_ai";
40
+ readonly providerName: "x_ai";
41
+ }, {
42
+ readonly system: "ibm.watsonx.ai";
43
+ readonly providerName: "ibm.watsonx.ai";
44
+ }, {
45
+ readonly system: "gcp.gemini";
46
+ readonly providerName: "gcp.gemini";
47
+ }];
48
+ /**
49
+ * Accepted provider values (legacy `gen_ai.system` spelling). Derived from
50
+ * PROVIDERS so the autocomplete vocabulary can never drift from the runtime
51
+ * registry — add a provider in one place. The public API fields are typed
52
+ * `GenAiSystem | (string & {})` so this gives autocomplete and catches obvious
53
+ * typos, while still permitting a free-form custom string. Includes BOTH spellings
54
+ * (legacy `system` and new `providerName`) since `normalizeProvider` accepts either.
55
+ */
56
+ export type GenAiSystem = (typeof PROVIDERS)[number]["system"] | (typeof PROVIDERS)[number]["providerName"] | "custom";
57
+ declare const OPERATIONS: readonly ["chat", "text_completion", "embeddings", "generate_content", "execute_tool", "create_agent", "invoke_agent"];
58
+ /**
59
+ * Accepted `gen_ai.operation.name` values. Derived from OPERATIONS so the
60
+ * autocomplete vocabulary can't drift from what the runtime accepts (mirrors
61
+ * GenAiSystem ← PROVIDERS). Plus the `other` sentinel that unknown operations
62
+ * coerce to (passes through without a warning).
63
+ */
64
+ export type GenAiOperation = (typeof OPERATIONS)[number] | typeof OP_OTHER;
65
+ export declare function warnInvalidOnce(key: string, message: string): void;
66
+ /** Test-only — clear the bounded invalid-value warning state. */
67
+ export declare function resetProviderWarningsForTests(): void;
68
+ /**
69
+ * Resolve a caller-supplied provider string to its canonical
70
+ * `{ system, providerName }` pair. Accepts either spelling (legacy
71
+ * `gen_ai.system` or new `gen_ai.provider.name`). A value the customer has
72
+ * registered via `customProviders` passes through verbatim (system ==
73
+ * providerName). Any other unknown value is coerced to the `custom` sentinel and
74
+ * reported (bounded warn-once). `undefined` resolves to `custom` silently (the
75
+ * intended default). Never throws.
76
+ */
77
+ export declare function normalizeProvider(input?: string, customProviders?: readonly string[]): ProviderEntry;
78
+ /**
79
+ * Resolve a caller-supplied operation string. Unknown values are coerced to the
80
+ * `other` sentinel — NOT `chat` — so a typo lands in a distinguishable bucket
81
+ * instead of inflating the real chat series, and reported (bounded warn-once).
82
+ * `undefined` resolves to `chat` (the default); an explicit `other` passes
83
+ * through silently. Never throws.
84
+ */
85
+ export declare function normalizeOperation(input?: string): string;
86
+ export {};
87
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAW,QAAQ,EAAiB,MAAM,cAAc,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,YAAY,EAAE,MAAM,CAAC;CACtB;AAMD,eAAO,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAcuB,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,MAAM,WAAW,GACnB,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,GACpC,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,GAC1C,QAAQ,CAAC;AAKb,QAAA,MAAM,UAAU,wHAQN,CAAC;AAEX;;;;;GAKG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,GAAG,OAAO,QAAQ,CAAC;AA0B3E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAclE;AAED,iEAAiE;AACjE,wBAAgB,6BAA6B,IAAI,IAAI,CAGpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,CAAC,EAAE,MAAM,EACd,eAAe,GAAE,SAAS,MAAM,EAAO,GACtC,aAAa,CAcf;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAUzD"}
@@ -0,0 +1,128 @@
1
+ // Canonical provider registry + sentinel normalization.
2
+ //
3
+ // `gen_ai.system` is the OpenTelemetry GenAI semantic-convention attribute that
4
+ // identifies the provider/platform a model runs on. OTel has since renamed it to
5
+ // `gen_ai.provider.name`, with a few new value spellings (e.g. `vertex_ai` →
6
+ // `gcp.vertex_ai`). We dual-emit both attributes: the legacy `gen_ai.system`
7
+ // value (unchanged for the providers we already supported, so existing queries
8
+ // and historical series keep matching) plus the new `gen_ai.provider.name`
9
+ // value. Consumers migrate to the new attribute at their own pace; the old one
10
+ // is dropped afterward.
11
+ //
12
+ // Any value outside the well-known set is a bug (a typo like `amazon-bedrock`
13
+ // silently produces a series no query ever matches). Such values are coerced to
14
+ // the `custom` sentinel — a wrong label never reaches metrics — and surfaced
15
+ // once via the debug channel so the mistake is visible. Everything here is pure
16
+ // and never throws: the SDK is safe by construction.
17
+ import { emitLog } from "./debug.js";
18
+ import { OP_CHAT, OP_OTHER, SYSTEM_CUSTOM } from "./semconv.js";
19
+ // Single source of truth. `system` preserves the spelling Frugal already emitted
20
+ // for the providers it historically supported (so existing dashboards/history
21
+ // keep matching); `providerName` is the current OTel spelling. For providers we
22
+ // never emitted before, both columns are the same OTel-standard string.
23
+ export const PROVIDERS = [
24
+ { system: "openai", providerName: "openai" },
25
+ { system: "anthropic", providerName: "anthropic" },
26
+ { system: "aws.bedrock", providerName: "aws.bedrock" },
27
+ { system: "vertex_ai", providerName: "gcp.vertex_ai" },
28
+ { system: "az.ai.openai", providerName: "azure.ai.openai" },
29
+ { system: "cohere", providerName: "cohere" },
30
+ { system: "mistral_ai", providerName: "mistral_ai" },
31
+ { system: "deepseek", providerName: "deepseek" },
32
+ { system: "groq", providerName: "groq" },
33
+ { system: "perplexity", providerName: "perplexity" },
34
+ { system: "x_ai", providerName: "x_ai" },
35
+ { system: "ibm.watsonx.ai", providerName: "ibm.watsonx.ai" },
36
+ { system: "gcp.gemini", providerName: "gcp.gemini" },
37
+ ];
38
+ // Operations accepted without warning: the three defaults plus other OTel-defined
39
+ // values. Single source of truth for both GenAiOperation below and the coercion
40
+ // warning's "use one of" list.
41
+ const OPERATIONS = [
42
+ "chat",
43
+ "text_completion",
44
+ "embeddings",
45
+ "generate_content",
46
+ "execute_tool",
47
+ "create_agent",
48
+ "invoke_agent",
49
+ ];
50
+ const CUSTOM = { system: SYSTEM_CUSTOM, providerName: SYSTEM_CUSTOM };
51
+ // Lookup by either spelling, built once — keeps normalizeProvider O(1) on the hot
52
+ // path instead of scanning PROVIDERS on every call.
53
+ const BY_VALUE = new Map();
54
+ for (const entry of PROVIDERS) {
55
+ BY_VALUE.set(entry.system, entry);
56
+ BY_VALUE.set(entry.providerName, entry);
57
+ }
58
+ // Bounded warn-once: surface each distinct invalid provider/operation value
59
+ // once, but cap how many distinct values we track so a high-cardinality caller
60
+ // (e.g. a gateway labeling calls from request data) can't grow this set without
61
+ // bound. Past the cap, further unknown values are coerced silently after a
62
+ // single generic notice. We do our own de-dup here (emitLog, not emitLogOnce) so
63
+ // the cap is enforced in one place — and so every distinct typo is surfaced, not
64
+ // just the first one.
65
+ const MAX_TRACKED_INVALID = 32;
66
+ const warnedInvalid = new Set();
67
+ let capNoticeEmitted = false;
68
+ // Exported for the custom_label coercion in instrument.ts — every label
69
+ // vocabulary in the SDK that coerces to a sentinel reports through this one
70
+ // bounded helper.
71
+ export function warnInvalidOnce(key, message) {
72
+ if (warnedInvalid.has(key))
73
+ return;
74
+ if (warnedInvalid.size >= MAX_TRACKED_INVALID) {
75
+ if (!capNoticeEmitted) {
76
+ capNoticeEmitted = true;
77
+ emitLog("warn", `frugal-metrics: ${MAX_TRACKED_INVALID}+ distinct invalid provider/operation values seen; further unknown values are coerced to the sentinel without an individual warning.`);
78
+ }
79
+ return;
80
+ }
81
+ warnedInvalid.add(key);
82
+ emitLog("warn", message);
83
+ }
84
+ /** Test-only — clear the bounded invalid-value warning state. */
85
+ export function resetProviderWarningsForTests() {
86
+ warnedInvalid.clear();
87
+ capNoticeEmitted = false;
88
+ }
89
+ /**
90
+ * Resolve a caller-supplied provider string to its canonical
91
+ * `{ system, providerName }` pair. Accepts either spelling (legacy
92
+ * `gen_ai.system` or new `gen_ai.provider.name`). A value the customer has
93
+ * registered via `customProviders` passes through verbatim (system ==
94
+ * providerName). Any other unknown value is coerced to the `custom` sentinel and
95
+ * reported (bounded warn-once). `undefined` resolves to `custom` silently (the
96
+ * intended default). Never throws.
97
+ */
98
+ export function normalizeProvider(input, customProviders = []) {
99
+ if (input === undefined || input === SYSTEM_CUSTOM)
100
+ return CUSTOM;
101
+ const entry = BY_VALUE.get(input);
102
+ if (entry !== undefined)
103
+ return entry;
104
+ // Customer-registered passthrough: no OTel mapping, so both labels carry the
105
+ // raw name. The set is capped at config-load time, so cardinality stays bounded.
106
+ if (customProviders.includes(input)) {
107
+ return { system: input, providerName: input };
108
+ }
109
+ warnInvalidOnce(`provider:${input}`, `unknown gen_ai provider "${input}" — coerced to "custom". Use a well-known OpenTelemetry GenAI provider value (e.g. "aws.bedrock", "vertex_ai", "anthropic", "openai"), or register it via FRUGAL_CUSTOM_PROVIDERS.`);
110
+ return CUSTOM;
111
+ }
112
+ /**
113
+ * Resolve a caller-supplied operation string. Unknown values are coerced to the
114
+ * `other` sentinel — NOT `chat` — so a typo lands in a distinguishable bucket
115
+ * instead of inflating the real chat series, and reported (bounded warn-once).
116
+ * `undefined` resolves to `chat` (the default); an explicit `other` passes
117
+ * through silently. Never throws.
118
+ */
119
+ export function normalizeOperation(input) {
120
+ if (input === undefined)
121
+ return OP_CHAT;
122
+ if (input === OP_OTHER || OPERATIONS.includes(input)) {
123
+ return input;
124
+ }
125
+ warnInvalidOnce(`operation:${input}`, `unknown gen_ai.operation.name "${input}" — coerced to "other". Use one of: ${OPERATIONS.join(", ")}.`);
126
+ return OP_OTHER;
127
+ }
128
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../src/providers.ts"],"names":[],"mappings":"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"}
package/dist/semconv.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export declare const GEN_AI_SYSTEM = "gen_ai.system";
2
+ export declare const GEN_AI_PROVIDER_NAME = "gen_ai.provider.name";
2
3
  export declare const GEN_AI_REQUEST_MODEL = "gen_ai.request.model";
3
4
  export declare const GEN_AI_RESPONSE_MODEL = "gen_ai.response.model";
4
5
  export declare const GEN_AI_OPERATION_NAME = "gen_ai.operation.name";
@@ -12,6 +13,7 @@ export declare const SYSTEM_CUSTOM = "custom";
12
13
  export declare const OP_CHAT = "chat";
13
14
  export declare const OP_TEXT_COMPLETION = "text_completion";
14
15
  export declare const OP_EMBEDDINGS = "embeddings";
16
+ export declare const OP_OTHER = "other";
15
17
  export declare const TOKEN_INPUT = "input";
16
18
  export declare const TOKEN_OUTPUT = "output";
17
19
  export declare const METRIC_OPERATION_DURATION = "gen_ai.client.operation.duration";
@@ -26,8 +28,10 @@ export declare const METRIC_OUTPUT_CAP_UTILIZATION = "frugal.gen_ai.output_cap_u
26
28
  export declare const METRIC_CACHE_PREFIX_STABLE = "frugal.gen_ai.cache_prefix_stable";
27
29
  export declare const METRIC_HISTORY_DEPTH = "frugal.gen_ai.history_depth";
28
30
  export declare const METRIC_FEW_SHOT_COUNT = "frugal.gen_ai.few_shot_count";
31
+ export declare const METRIC_FEW_SHOT_TOKENS = "frugal.gen_ai.few_shot_tokens";
29
32
  export declare const METRIC_NOISE_RATIO = "frugal.gen_ai.noise_ratio";
30
33
  export declare const METRIC_STRUCTURED_OUTPUT_HINT = "frugal.gen_ai.structured_output_hint";
34
+ export declare const METRIC_DUPLICATE_REQUESTS = "frugal.gen_ai.duplicate_requests";
31
35
  export declare const FRUGAL_CUSTOMER_ID = "frugal.customer_id";
32
36
  export declare const FRUGAL_PROJECT_ID = "frugal.project_id";
33
37
  export declare const FRUGAL_COMPONENT = "frugal.component";
@@ -38,6 +42,14 @@ export declare const FRUGAL_BATCHED = "frugal.batched";
38
42
  export declare const FRUGAL_STRUCTURED_OUTPUT_MODE = "frugal.structured_output_mode";
39
43
  export declare const FRUGAL_BLOCK = "frugal.block";
40
44
  export declare const FRUGAL_STABLE = "frugal.stable";
45
+ export declare const FRUGAL_CUSTOM_LABEL = "frugal.custom_label";
46
+ export declare const CUSTOM_LABEL_OTHER = "other";
47
+ export declare const FRUGAL_HISTORY_BUCKET = "frugal.history_bucket";
48
+ export declare const FRUGAL_DUP_STATE = "frugal.dup_state";
49
+ export declare const DUP_FIRST_SEEN = "first_seen";
50
+ export declare const DUP_REPEAT_SEEN = "repeat_seen";
51
+ export declare const HISTORY_BUCKETS: readonly ["0", "1-2", "3-5", "6-10", "11-20", "21-50", "51+"];
52
+ export type HistoryBucket = (typeof HISTORY_BUCKETS)[number];
41
53
  export declare const STRUCTURED_OUTPUT_NONE = "none";
42
54
  export declare const STRUCTURED_OUTPUT_JSON_OBJECT = "json_object";
43
55
  export declare const STRUCTURED_OUTPUT_JSON_SCHEMA = "json_schema";
@@ -1 +1 @@
1
- {"version":3,"file":"semconv.d.ts","sourceRoot":"","sources":["../src/semconv.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,oBAAoB,yBAAyB,CAAC;AAC3D,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAC7D,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AAErD,eAAO,MAAM,aAAa,WAAW,CAAC;AACtC,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAC5C,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAClD,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAChD,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAC5C,eAAO,MAAM,aAAa,WAAW,CAAC;AAEtC,eAAO,MAAM,OAAO,SAAS,CAAC;AAC9B,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AACpD,eAAO,MAAM,aAAa,eAAe,CAAC;AAE1C,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,eAAO,MAAM,yBAAyB,qCAAqC,CAAC;AAC5E,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAE9D,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAClD,eAAO,MAAM,wBAAwB,oCAAoC,CAAC;AAC1E,eAAO,MAAM,yBAAyB,qCAAqC,CAAC;AAC5E,eAAO,MAAM,uBAAuB,mCAAmC,CAAC;AACxE,eAAO,MAAM,aAAa,yBAAyB,CAAC;AACpD,eAAO,MAAM,sBAAsB,kCAAkC,CAAC;AACtE,eAAO,MAAM,6BAA6B,yCAAyC,CAAC;AACpF,eAAO,MAAM,0BAA0B,sCAAsC,CAAC;AAC9E,eAAO,MAAM,oBAAoB,gCAAgC,CAAC;AAClE,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AACpE,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAC9D,eAAO,MAAM,6BAA6B,yCAAyC,CAAC;AAEpF,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AACrD,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AACnD,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAC/D,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AACrD,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,6BAA6B,kCAAkC,CAAC;AAC7E,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAC3C,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAE7C,eAAO,MAAM,sBAAsB,SAAS,CAAC;AAC7C,eAAO,MAAM,6BAA6B,gBAAgB,CAAC;AAC3D,eAAO,MAAM,6BAA6B,gBAAgB,CAAC;AAC3D,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAE/C,eAAO,MAAM,YAAY,WAAW,CAAC;AACrC,eAAO,MAAM,UAAU,SAAS,CAAC;AACjC,eAAO,MAAM,WAAW,UAAU,CAAC;AACnC,eAAO,MAAM,YAAY,WAAW,CAAC;AAErC,eAAO,MAAM,oBAAoB,eAAe,CAAC;AACjD,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"semconv.d.ts","sourceRoot":"","sources":["../src/semconv.ts"],"names":[],"mappings":"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"}
package/dist/semconv.js CHANGED
@@ -1,9 +1,16 @@
1
1
  // OpenTelemetry GenAI semantic convention constants + Frugal extensions.
2
2
  export const GEN_AI_SYSTEM = "gen_ai.system";
3
+ // OTel renamed gen_ai.system → gen_ai.provider.name; we dual-emit both during the
4
+ // transition. See providers.ts for the value mapping.
5
+ export const GEN_AI_PROVIDER_NAME = "gen_ai.provider.name";
3
6
  export const GEN_AI_REQUEST_MODEL = "gen_ai.request.model";
4
7
  export const GEN_AI_RESPONSE_MODEL = "gen_ai.response.model";
5
8
  export const GEN_AI_OPERATION_NAME = "gen_ai.operation.name";
6
9
  export const GEN_AI_TOKEN_TYPE = "gen_ai.token.type";
10
+ // Legacy gen_ai.system spellings exposed as named constants for the wrapper
11
+ // modules. The full cross-provider registry (cohere, mistral_ai, deepseek,
12
+ // groq, …) lives solely in the PROVIDERS table in providers.ts — the single
13
+ // source of truth — and those values are not re-declared here.
7
14
  export const SYSTEM_OPENAI = "openai";
8
15
  export const SYSTEM_ANTHROPIC = "anthropic";
9
16
  export const SYSTEM_AZURE_OPENAI = "az.ai.openai";
@@ -13,6 +20,9 @@ export const SYSTEM_CUSTOM = "custom";
13
20
  export const OP_CHAT = "chat";
14
21
  export const OP_TEXT_COMPLETION = "text_completion";
15
22
  export const OP_EMBEDDINGS = "embeddings";
23
+ // Sentinel for an operation outside the accepted set — parallels SYSTEM_CUSTOM so
24
+ // a typo lands in a distinguishable bucket instead of corrupting the real chat series.
25
+ export const OP_OTHER = "other";
16
26
  export const TOKEN_INPUT = "input";
17
27
  export const TOKEN_OUTPUT = "output";
18
28
  export const METRIC_OPERATION_DURATION = "gen_ai.client.operation.duration";
@@ -27,8 +37,10 @@ export const METRIC_OUTPUT_CAP_UTILIZATION = "frugal.gen_ai.output_cap_utilizati
27
37
  export const METRIC_CACHE_PREFIX_STABLE = "frugal.gen_ai.cache_prefix_stable";
28
38
  export const METRIC_HISTORY_DEPTH = "frugal.gen_ai.history_depth";
29
39
  export const METRIC_FEW_SHOT_COUNT = "frugal.gen_ai.few_shot_count";
40
+ export const METRIC_FEW_SHOT_TOKENS = "frugal.gen_ai.few_shot_tokens";
30
41
  export const METRIC_NOISE_RATIO = "frugal.gen_ai.noise_ratio";
31
42
  export const METRIC_STRUCTURED_OUTPUT_HINT = "frugal.gen_ai.structured_output_hint";
43
+ export const METRIC_DUPLICATE_REQUESTS = "frugal.gen_ai.duplicate_requests";
32
44
  export const FRUGAL_CUSTOMER_ID = "frugal.customer_id";
33
45
  export const FRUGAL_PROJECT_ID = "frugal.project_id";
34
46
  export const FRUGAL_COMPONENT = "frugal.component";
@@ -39,6 +51,25 @@ export const FRUGAL_BATCHED = "frugal.batched";
39
51
  export const FRUGAL_STRUCTURED_OUTPUT_MODE = "frugal.structured_output_mode";
40
52
  export const FRUGAL_BLOCK = "frugal.block";
41
53
  export const FRUGAL_STABLE = "frugal.stable";
54
+ export const FRUGAL_CUSTOM_LABEL = "frugal.custom_label";
55
+ export const CUSTOM_LABEL_OTHER = "other";
56
+ export const FRUGAL_HISTORY_BUCKET = "frugal.history_bucket";
57
+ export const FRUGAL_DUP_STATE = "frugal.dup_state";
58
+ export const DUP_FIRST_SEEN = "first_seen";
59
+ export const DUP_REPEAT_SEEN = "repeat_seen";
60
+ // frugal.history_bucket vocabulary — a wire contract the server cross-tabs on,
61
+ // so the values live here (single source of truth) rather than inline at the
62
+ // derivation site. Bucket edges are inclusive: 0 | 1-2 | 3-5 | 6-10 | 11-20 |
63
+ // 21-50 | 51+.
64
+ export const HISTORY_BUCKETS = [
65
+ "0",
66
+ "1-2",
67
+ "3-5",
68
+ "6-10",
69
+ "11-20",
70
+ "21-50",
71
+ "51+",
72
+ ];
42
73
  export const STRUCTURED_OUTPUT_NONE = "none";
43
74
  export const STRUCTURED_OUTPUT_JSON_OBJECT = "json_object";
44
75
  export const STRUCTURED_OUTPUT_JSON_SCHEMA = "json_schema";