@frugalco/frugal-sdk-node 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +227 -0
- package/dist/block-hash-lru.d.ts +18 -0
- package/dist/block-hash-lru.d.ts.map +1 -0
- package/dist/block-hash-lru.js +48 -0
- package/dist/block-hash-lru.js.map +1 -0
- package/dist/caller.d.ts +23 -0
- package/dist/caller.d.ts.map +1 -0
- package/dist/caller.js +204 -0
- package/dist/caller.js.map +1 -0
- package/dist/config.d.ts +21 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +165 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/instrument.d.ts +49 -0
- package/dist/instrument.d.ts.map +1 -0
- package/dist/instrument.js +194 -0
- package/dist/instrument.js.map +1 -0
- package/dist/otel.d.ts +27 -0
- package/dist/otel.d.ts.map +1 -0
- package/dist/otel.js +211 -0
- package/dist/otel.js.map +1 -0
- package/dist/prompt-analyzer.d.ts +26 -0
- package/dist/prompt-analyzer.d.ts.map +1 -0
- package/dist/prompt-analyzer.js +210 -0
- package/dist/prompt-analyzer.js.map +1 -0
- package/dist/semconv.d.ts +52 -0
- package/dist/semconv.d.ts.map +1 -0
- package/dist/semconv.js +53 -0
- package/dist/semconv.js.map +1 -0
- package/dist/streams.d.ts +21 -0
- package/dist/streams.d.ts.map +1 -0
- package/dist/streams.js +85 -0
- package/dist/streams.js.map +1 -0
- package/dist/track.d.ts +44 -0
- package/dist/track.d.ts.map +1 -0
- package/dist/track.js +170 -0
- package/dist/track.js.map +1 -0
- package/dist/wrappers/anthropic.d.ts +2 -0
- package/dist/wrappers/anthropic.d.ts.map +1 -0
- package/dist/wrappers/anthropic.js +229 -0
- package/dist/wrappers/anthropic.js.map +1 -0
- package/dist/wrappers/bedrock-models.d.ts +26 -0
- package/dist/wrappers/bedrock-models.d.ts.map +1 -0
- package/dist/wrappers/bedrock-models.js +320 -0
- package/dist/wrappers/bedrock-models.js.map +1 -0
- package/dist/wrappers/bedrock.d.ts +2 -0
- package/dist/wrappers/bedrock.d.ts.map +1 -0
- package/dist/wrappers/bedrock.js +284 -0
- package/dist/wrappers/bedrock.js.map +1 -0
- package/dist/wrappers/openai.d.ts +2 -0
- package/dist/wrappers/openai.d.ts.map +1 -0
- package/dist/wrappers/openai.js +347 -0
- package/dist/wrappers/openai.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
// Lightweight per-request analyzer. Inspects messages, tools, and
|
|
2
|
+
// response_format kwargs to derive low-cardinality signals for the
|
|
3
|
+
// AI cost-trap detection catalogue. Never emits raw request content; emits
|
|
4
|
+
// stats and (in-process-only) hashes that the instrument layer turns into
|
|
5
|
+
// metrics.
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
7
|
+
import { STRUCTURED_OUTPUT_JSON_OBJECT, STRUCTURED_OUTPUT_JSON_SCHEMA, STRUCTURED_OUTPUT_NONE, STRUCTURED_OUTPUT_TOOLS, } from "./semconv.js";
|
|
8
|
+
export function analyzeRequest(payload) {
|
|
9
|
+
return {
|
|
10
|
+
systemHash: safe(() => hashSystemBlock(payload), null),
|
|
11
|
+
userHash: safe(() => hashUserBlock(payload), null),
|
|
12
|
+
toolsHash: safe(() => hashJSON(payload.tools), null),
|
|
13
|
+
schemaHash: safe(() => hashJSON(payload.responseFormat), null),
|
|
14
|
+
historyDepth: safe(() => historyDepth(payload), null),
|
|
15
|
+
fewShotCount: safe(() => fewShotCount(payload), null),
|
|
16
|
+
noiseRatio: safe(() => noiseRatio(payload), null),
|
|
17
|
+
structuredOutputHint: safe(() => structuredOutputHint(payload), false),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function structuredOutputMode(payload) {
|
|
21
|
+
if (Array.isArray(payload.tools) && payload.tools.length > 0) {
|
|
22
|
+
return STRUCTURED_OUTPUT_TOOLS;
|
|
23
|
+
}
|
|
24
|
+
const rf = payload.responseFormat;
|
|
25
|
+
if (rf && typeof rf === "object") {
|
|
26
|
+
const type = rf.type;
|
|
27
|
+
if (type === "json_object")
|
|
28
|
+
return STRUCTURED_OUTPUT_JSON_OBJECT;
|
|
29
|
+
if (type === "json_schema")
|
|
30
|
+
return STRUCTURED_OUTPUT_JSON_SCHEMA;
|
|
31
|
+
}
|
|
32
|
+
return STRUCTURED_OUTPUT_NONE;
|
|
33
|
+
}
|
|
34
|
+
function safe(fn, fallback) {
|
|
35
|
+
try {
|
|
36
|
+
return fn();
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return fallback;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// --- hashing ---------------------------------------------------------------
|
|
43
|
+
function sha256(input) {
|
|
44
|
+
return createHash("sha256").update(input).digest("hex");
|
|
45
|
+
}
|
|
46
|
+
function hashJSON(value) {
|
|
47
|
+
if (value === undefined || value === null)
|
|
48
|
+
return null;
|
|
49
|
+
return sha256(canonicalize(value));
|
|
50
|
+
}
|
|
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(",") + "]";
|
|
56
|
+
}
|
|
57
|
+
const keys = Object.keys(value).sort();
|
|
58
|
+
const parts = keys.map((k) => JSON.stringify(k) + ":" + canonicalize(value[k]));
|
|
59
|
+
return "{" + parts.join(",") + "}";
|
|
60
|
+
}
|
|
61
|
+
function hashSystemBlock(payload) {
|
|
62
|
+
const blocks = [];
|
|
63
|
+
if (payload.system !== undefined && payload.system !== null) {
|
|
64
|
+
blocks.push(payload.system);
|
|
65
|
+
}
|
|
66
|
+
if (Array.isArray(payload.messages)) {
|
|
67
|
+
for (const m of payload.messages) {
|
|
68
|
+
if (m && typeof m === "object" && m.role === "system") {
|
|
69
|
+
blocks.push(m.content ?? null);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (blocks.length === 0)
|
|
74
|
+
return null;
|
|
75
|
+
return hashJSON(blocks);
|
|
76
|
+
}
|
|
77
|
+
function hashUserBlock(payload) {
|
|
78
|
+
if (!Array.isArray(payload.messages))
|
|
79
|
+
return null;
|
|
80
|
+
const blocks = [];
|
|
81
|
+
for (const m of payload.messages) {
|
|
82
|
+
if (m && typeof m === "object" && m.role === "user") {
|
|
83
|
+
blocks.push(m.content ?? null);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (blocks.length === 0)
|
|
87
|
+
return null;
|
|
88
|
+
return hashJSON(blocks);
|
|
89
|
+
}
|
|
90
|
+
// --- structural counts -----------------------------------------------------
|
|
91
|
+
function historyDepth(payload) {
|
|
92
|
+
if (!Array.isArray(payload.messages))
|
|
93
|
+
return null;
|
|
94
|
+
return payload.messages.length;
|
|
95
|
+
}
|
|
96
|
+
function fewShotCount(payload) {
|
|
97
|
+
if (!Array.isArray(payload.messages))
|
|
98
|
+
return null;
|
|
99
|
+
const msgs = payload.messages.filter((m) => m !== null && typeof m === "object");
|
|
100
|
+
// Skip leading system messages.
|
|
101
|
+
let i = 0;
|
|
102
|
+
while (i < msgs.length && msgs[i].role === "system")
|
|
103
|
+
i++;
|
|
104
|
+
// The conversation must end with a user turn for "few-shot before final
|
|
105
|
+
// user" to make sense; otherwise the shape is mid-conversation.
|
|
106
|
+
if (msgs.length === 0 || msgs[msgs.length - 1].role !== "user")
|
|
107
|
+
return null;
|
|
108
|
+
// If any tool-call turns exist, treat this as a real conversation, not a
|
|
109
|
+
// few-shot prompt.
|
|
110
|
+
for (const m of msgs) {
|
|
111
|
+
if (m.role === "tool")
|
|
112
|
+
return null;
|
|
113
|
+
if (Array.isArray(m.tool_calls) && m.tool_calls.length > 0)
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
// Count consecutive (user, assistant) pairs preceding the final user.
|
|
117
|
+
let pairs = 0;
|
|
118
|
+
let j = i;
|
|
119
|
+
const lastIdx = msgs.length - 1; // final user
|
|
120
|
+
while (j + 1 < lastIdx) {
|
|
121
|
+
if (msgs[j].role === "user" && msgs[j + 1].role === "assistant") {
|
|
122
|
+
pairs++;
|
|
123
|
+
j += 2;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return pairs;
|
|
130
|
+
}
|
|
131
|
+
// --- noise ratio -----------------------------------------------------------
|
|
132
|
+
const HTML_TAG_REGEX = /<[^>]+>/g;
|
|
133
|
+
const BASE64_REGEX = /[A-Za-z0-9+/]{40,}={0,2}/g;
|
|
134
|
+
const WHITESPACE_RUN_REGEX = /\s{4,}/g;
|
|
135
|
+
function noiseRatio(payload) {
|
|
136
|
+
const text = collectText(payload);
|
|
137
|
+
if (text.length === 0)
|
|
138
|
+
return null;
|
|
139
|
+
let noise = 0;
|
|
140
|
+
for (const match of text.matchAll(HTML_TAG_REGEX))
|
|
141
|
+
noise += match[0].length;
|
|
142
|
+
for (const match of text.matchAll(BASE64_REGEX))
|
|
143
|
+
noise += match[0].length;
|
|
144
|
+
for (const match of text.matchAll(WHITESPACE_RUN_REGEX))
|
|
145
|
+
noise += match[0].length;
|
|
146
|
+
// Cap at 1.0 — the regex classes can overlap in degenerate inputs.
|
|
147
|
+
return Math.min(1, noise / text.length);
|
|
148
|
+
}
|
|
149
|
+
function collectText(payload) {
|
|
150
|
+
const parts = [];
|
|
151
|
+
if (typeof payload.system === "string")
|
|
152
|
+
parts.push(payload.system);
|
|
153
|
+
if (Array.isArray(payload.messages)) {
|
|
154
|
+
for (const m of payload.messages) {
|
|
155
|
+
if (!m || typeof m !== "object")
|
|
156
|
+
continue;
|
|
157
|
+
const content = m.content;
|
|
158
|
+
if (typeof content === "string")
|
|
159
|
+
parts.push(content);
|
|
160
|
+
else if (Array.isArray(content)) {
|
|
161
|
+
for (const c of content) {
|
|
162
|
+
if (!c || typeof c !== "object")
|
|
163
|
+
continue;
|
|
164
|
+
const text = c.text;
|
|
165
|
+
if (typeof text === "string")
|
|
166
|
+
parts.push(text);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return parts.join("\n");
|
|
172
|
+
}
|
|
173
|
+
// --- structured output hint ------------------------------------------------
|
|
174
|
+
const STRUCTURED_HINT_REGEXES = [
|
|
175
|
+
/format\s+as\s+JSON/i,
|
|
176
|
+
/return\s+a\s+(JSON\s+)?(list|array|object)/i,
|
|
177
|
+
/respond\s+with\s+a\s+JSON/i,
|
|
178
|
+
/output\s+(must\s+be|should\s+be|in)\s+JSON/i,
|
|
179
|
+
];
|
|
180
|
+
function structuredOutputHint(payload) {
|
|
181
|
+
if (Array.isArray(payload.tools) && payload.tools.length > 0)
|
|
182
|
+
return false;
|
|
183
|
+
if (payload.responseFormat &&
|
|
184
|
+
typeof payload.responseFormat === "object" &&
|
|
185
|
+
payload.responseFormat.type !== undefined) {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
const text = collectText(payload);
|
|
189
|
+
if (text.length === 0)
|
|
190
|
+
return false;
|
|
191
|
+
return STRUCTURED_HINT_REGEXES.some((r) => r.test(text));
|
|
192
|
+
}
|
|
193
|
+
// --- sampling --------------------------------------------------------------
|
|
194
|
+
const BUCKET_MS = 60_000;
|
|
195
|
+
export function shouldSample(callSiteId, sampleRate, nowMs = Date.now()) {
|
|
196
|
+
if (sampleRate >= 1)
|
|
197
|
+
return true;
|
|
198
|
+
if (sampleRate <= 0)
|
|
199
|
+
return false;
|
|
200
|
+
const bucket = Math.floor(nowMs / BUCKET_MS);
|
|
201
|
+
const key = `${callSiteId}:${bucket}`;
|
|
202
|
+
// FNV-1a 32-bit, fast and good enough for sampling.
|
|
203
|
+
let hash = 0x811c9dc5;
|
|
204
|
+
for (let i = 0; i < key.length; i++) {
|
|
205
|
+
hash ^= key.charCodeAt(i);
|
|
206
|
+
hash = (hash + ((hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24))) >>> 0;
|
|
207
|
+
}
|
|
208
|
+
return hash / 0xffffffff < sampleRate;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=prompt-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-analyzer.js","sourceRoot":"","sources":["../src/prompt-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export declare const GEN_AI_SYSTEM = "gen_ai.system";
|
|
2
|
+
export declare const GEN_AI_REQUEST_MODEL = "gen_ai.request.model";
|
|
3
|
+
export declare const GEN_AI_RESPONSE_MODEL = "gen_ai.response.model";
|
|
4
|
+
export declare const GEN_AI_OPERATION_NAME = "gen_ai.operation.name";
|
|
5
|
+
export declare const GEN_AI_TOKEN_TYPE = "gen_ai.token.type";
|
|
6
|
+
export declare const SYSTEM_OPENAI = "openai";
|
|
7
|
+
export declare const SYSTEM_ANTHROPIC = "anthropic";
|
|
8
|
+
export declare const SYSTEM_AZURE_OPENAI = "az.ai.openai";
|
|
9
|
+
export declare const SYSTEM_AWS_BEDROCK = "aws.bedrock";
|
|
10
|
+
export declare const SYSTEM_VERTEX_AI = "vertex_ai";
|
|
11
|
+
export declare const SYSTEM_CUSTOM = "custom";
|
|
12
|
+
export declare const OP_CHAT = "chat";
|
|
13
|
+
export declare const OP_TEXT_COMPLETION = "text_completion";
|
|
14
|
+
export declare const OP_EMBEDDINGS = "embeddings";
|
|
15
|
+
export declare const TOKEN_INPUT = "input";
|
|
16
|
+
export declare const TOKEN_OUTPUT = "output";
|
|
17
|
+
export declare const METRIC_OPERATION_DURATION = "gen_ai.client.operation.duration";
|
|
18
|
+
export declare const METRIC_TOKEN_USAGE = "gen_ai.client.token.usage";
|
|
19
|
+
export declare const METRIC_CALLS = "frugal.gen_ai.calls";
|
|
20
|
+
export declare const METRIC_CACHE_READ_TOKENS = "frugal.gen_ai.cache_read_tokens";
|
|
21
|
+
export declare const METRIC_CACHE_WRITE_TOKENS = "frugal.gen_ai.cache_write_tokens";
|
|
22
|
+
export declare const METRIC_REASONING_TOKENS = "frugal.gen_ai.reasoning_tokens";
|
|
23
|
+
export declare const METRIC_ERRORS = "frugal.gen_ai.errors";
|
|
24
|
+
export declare const METRIC_INTERNAL_ERRORS = "frugal.gen_ai.internal_errors";
|
|
25
|
+
export declare const METRIC_OUTPUT_CAP_UTILIZATION = "frugal.gen_ai.output_cap_utilization";
|
|
26
|
+
export declare const METRIC_CACHE_PREFIX_STABLE = "frugal.gen_ai.cache_prefix_stable";
|
|
27
|
+
export declare const METRIC_HISTORY_DEPTH = "frugal.gen_ai.history_depth";
|
|
28
|
+
export declare const METRIC_FEW_SHOT_COUNT = "frugal.gen_ai.few_shot_count";
|
|
29
|
+
export declare const METRIC_NOISE_RATIO = "frugal.gen_ai.noise_ratio";
|
|
30
|
+
export declare const METRIC_STRUCTURED_OUTPUT_HINT = "frugal.gen_ai.structured_output_hint";
|
|
31
|
+
export declare const FRUGAL_CUSTOMER_ID = "frugal.customer_id";
|
|
32
|
+
export declare const FRUGAL_PROJECT_ID = "frugal.project_id";
|
|
33
|
+
export declare const FRUGAL_COMPONENT = "frugal.component";
|
|
34
|
+
export declare const FRUGAL_CALLER_FILE = "frugal.caller_file";
|
|
35
|
+
export declare const FRUGAL_CALLER_FUNCTION = "frugal.caller_function";
|
|
36
|
+
export declare const FRUGAL_ERROR_TYPE = "frugal.error.type";
|
|
37
|
+
export declare const FRUGAL_BATCHED = "frugal.batched";
|
|
38
|
+
export declare const FRUGAL_STRUCTURED_OUTPUT_MODE = "frugal.structured_output_mode";
|
|
39
|
+
export declare const FRUGAL_BLOCK = "frugal.block";
|
|
40
|
+
export declare const FRUGAL_STABLE = "frugal.stable";
|
|
41
|
+
export declare const STRUCTURED_OUTPUT_NONE = "none";
|
|
42
|
+
export declare const STRUCTURED_OUTPUT_JSON_OBJECT = "json_object";
|
|
43
|
+
export declare const STRUCTURED_OUTPUT_JSON_SCHEMA = "json_schema";
|
|
44
|
+
export declare const STRUCTURED_OUTPUT_TOOLS = "tools";
|
|
45
|
+
export declare const BLOCK_SYSTEM = "system";
|
|
46
|
+
export declare const BLOCK_USER = "user";
|
|
47
|
+
export declare const BLOCK_TOOLS = "tools";
|
|
48
|
+
export declare const BLOCK_SCHEMA = "schema";
|
|
49
|
+
export declare const CALLER_FILE_EXTERNAL = "<external>";
|
|
50
|
+
export declare const CALLER_FILE_UNKNOWN = "<unknown>";
|
|
51
|
+
export declare const CALLER_OVERFLOW = "<overflow>";
|
|
52
|
+
//# sourceMappingURL=semconv.d.ts.map
|
|
@@ -0,0 +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"}
|
package/dist/semconv.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// OpenTelemetry GenAI semantic convention constants + Frugal extensions.
|
|
2
|
+
export const GEN_AI_SYSTEM = "gen_ai.system";
|
|
3
|
+
export const GEN_AI_REQUEST_MODEL = "gen_ai.request.model";
|
|
4
|
+
export const GEN_AI_RESPONSE_MODEL = "gen_ai.response.model";
|
|
5
|
+
export const GEN_AI_OPERATION_NAME = "gen_ai.operation.name";
|
|
6
|
+
export const GEN_AI_TOKEN_TYPE = "gen_ai.token.type";
|
|
7
|
+
export const SYSTEM_OPENAI = "openai";
|
|
8
|
+
export const SYSTEM_ANTHROPIC = "anthropic";
|
|
9
|
+
export const SYSTEM_AZURE_OPENAI = "az.ai.openai";
|
|
10
|
+
export const SYSTEM_AWS_BEDROCK = "aws.bedrock";
|
|
11
|
+
export const SYSTEM_VERTEX_AI = "vertex_ai";
|
|
12
|
+
export const SYSTEM_CUSTOM = "custom";
|
|
13
|
+
export const OP_CHAT = "chat";
|
|
14
|
+
export const OP_TEXT_COMPLETION = "text_completion";
|
|
15
|
+
export const OP_EMBEDDINGS = "embeddings";
|
|
16
|
+
export const TOKEN_INPUT = "input";
|
|
17
|
+
export const TOKEN_OUTPUT = "output";
|
|
18
|
+
export const METRIC_OPERATION_DURATION = "gen_ai.client.operation.duration";
|
|
19
|
+
export const METRIC_TOKEN_USAGE = "gen_ai.client.token.usage";
|
|
20
|
+
export const METRIC_CALLS = "frugal.gen_ai.calls";
|
|
21
|
+
export const METRIC_CACHE_READ_TOKENS = "frugal.gen_ai.cache_read_tokens";
|
|
22
|
+
export const METRIC_CACHE_WRITE_TOKENS = "frugal.gen_ai.cache_write_tokens";
|
|
23
|
+
export const METRIC_REASONING_TOKENS = "frugal.gen_ai.reasoning_tokens";
|
|
24
|
+
export const METRIC_ERRORS = "frugal.gen_ai.errors";
|
|
25
|
+
export const METRIC_INTERNAL_ERRORS = "frugal.gen_ai.internal_errors";
|
|
26
|
+
export const METRIC_OUTPUT_CAP_UTILIZATION = "frugal.gen_ai.output_cap_utilization";
|
|
27
|
+
export const METRIC_CACHE_PREFIX_STABLE = "frugal.gen_ai.cache_prefix_stable";
|
|
28
|
+
export const METRIC_HISTORY_DEPTH = "frugal.gen_ai.history_depth";
|
|
29
|
+
export const METRIC_FEW_SHOT_COUNT = "frugal.gen_ai.few_shot_count";
|
|
30
|
+
export const METRIC_NOISE_RATIO = "frugal.gen_ai.noise_ratio";
|
|
31
|
+
export const METRIC_STRUCTURED_OUTPUT_HINT = "frugal.gen_ai.structured_output_hint";
|
|
32
|
+
export const FRUGAL_CUSTOMER_ID = "frugal.customer_id";
|
|
33
|
+
export const FRUGAL_PROJECT_ID = "frugal.project_id";
|
|
34
|
+
export const FRUGAL_COMPONENT = "frugal.component";
|
|
35
|
+
export const FRUGAL_CALLER_FILE = "frugal.caller_file";
|
|
36
|
+
export const FRUGAL_CALLER_FUNCTION = "frugal.caller_function";
|
|
37
|
+
export const FRUGAL_ERROR_TYPE = "frugal.error.type";
|
|
38
|
+
export const FRUGAL_BATCHED = "frugal.batched";
|
|
39
|
+
export const FRUGAL_STRUCTURED_OUTPUT_MODE = "frugal.structured_output_mode";
|
|
40
|
+
export const FRUGAL_BLOCK = "frugal.block";
|
|
41
|
+
export const FRUGAL_STABLE = "frugal.stable";
|
|
42
|
+
export const STRUCTURED_OUTPUT_NONE = "none";
|
|
43
|
+
export const STRUCTURED_OUTPUT_JSON_OBJECT = "json_object";
|
|
44
|
+
export const STRUCTURED_OUTPUT_JSON_SCHEMA = "json_schema";
|
|
45
|
+
export const STRUCTURED_OUTPUT_TOOLS = "tools";
|
|
46
|
+
export const BLOCK_SYSTEM = "system";
|
|
47
|
+
export const BLOCK_USER = "user";
|
|
48
|
+
export const BLOCK_TOOLS = "tools";
|
|
49
|
+
export const BLOCK_SCHEMA = "schema";
|
|
50
|
+
export const CALLER_FILE_EXTERNAL = "<external>";
|
|
51
|
+
export const CALLER_FILE_UNKNOWN = "<unknown>";
|
|
52
|
+
export const CALLER_OVERFLOW = "<overflow>";
|
|
53
|
+
//# sourceMappingURL=semconv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"semconv.js","sourceRoot":"","sources":["../src/semconv.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CallEmitter, UsageReport } from "./instrument.js";
|
|
2
|
+
export type StreamEventHandler<E = unknown> = (event: E, usage: UsageReport) => void;
|
|
3
|
+
export declare class AsyncStreamProxy<E = unknown> implements AsyncIterable<E> {
|
|
4
|
+
private readonly wrapped;
|
|
5
|
+
private readonly emit;
|
|
6
|
+
private readonly handler;
|
|
7
|
+
private usage;
|
|
8
|
+
private finalized;
|
|
9
|
+
constructor(wrapped: AsyncIterable<E>, emit: CallEmitter, handler: StreamEventHandler<E>);
|
|
10
|
+
[Symbol.asyncIterator](): AsyncIterator<E>;
|
|
11
|
+
private finalizeSuccess;
|
|
12
|
+
private finalizeError;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Attach a tee-style proxy onto an object that is iterable AND has its own
|
|
16
|
+
* helper methods/properties (as OpenAI and Anthropic stream wrappers do).
|
|
17
|
+
* Returns a proxy that looks and behaves like the original but teases off
|
|
18
|
+
* `Symbol.asyncIterator` to our accumulator.
|
|
19
|
+
*/
|
|
20
|
+
export declare function wrapStreamObject<T extends object>(wrapped: T & AsyncIterable<unknown>, emit: CallEmitter, handler: StreamEventHandler): T & AsyncIterable<unknown>;
|
|
21
|
+
//# sourceMappingURL=streams.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../src/streams.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEhE,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,OAAO,IAAI,CAC5C,KAAK,EAAE,CAAC,EACR,KAAK,EAAE,WAAW,KACf,IAAI,CAAC;AAEV,qBAAa,gBAAgB,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,aAAa,CAAC,CAAC,CAAC;IAKlE,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,SAAS,CAAS;gBAGP,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EACzB,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC;IAGjD,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC;IAuC1C,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,aAAa;CAKtB;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAC/C,OAAO,EAAE,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,EACnC,IAAI,EAAE,WAAW,EACjB,OAAO,EAAE,kBAAkB,GAC1B,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAU5B"}
|
package/dist/streams.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// Stream proxy that wraps an async iterable (OpenAI and Anthropic streaming
|
|
2
|
+
// responses), passes events through, accumulates per-event usage, and emits
|
|
3
|
+
// metrics once on drain / close / early termination.
|
|
4
|
+
export class AsyncStreamProxy {
|
|
5
|
+
wrapped;
|
|
6
|
+
emit;
|
|
7
|
+
handler;
|
|
8
|
+
usage = {};
|
|
9
|
+
finalized = false;
|
|
10
|
+
constructor(wrapped, emit, handler) {
|
|
11
|
+
this.wrapped = wrapped;
|
|
12
|
+
this.emit = emit;
|
|
13
|
+
this.handler = handler;
|
|
14
|
+
}
|
|
15
|
+
[Symbol.asyncIterator]() {
|
|
16
|
+
const inner = this.wrapped[Symbol.asyncIterator]();
|
|
17
|
+
return {
|
|
18
|
+
next: async () => {
|
|
19
|
+
let result;
|
|
20
|
+
try {
|
|
21
|
+
result = await inner.next();
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
this.finalizeError(err);
|
|
25
|
+
throw err;
|
|
26
|
+
}
|
|
27
|
+
if (result.done) {
|
|
28
|
+
this.finalizeSuccess();
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
this.handler(result.value, this.usage);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// swallow handler errors — we never want to break user code
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
},
|
|
39
|
+
return: async (value) => {
|
|
40
|
+
this.finalizeSuccess();
|
|
41
|
+
if (typeof inner.return === "function") {
|
|
42
|
+
return inner.return(value);
|
|
43
|
+
}
|
|
44
|
+
return { value: value, done: true };
|
|
45
|
+
},
|
|
46
|
+
throw: async (err) => {
|
|
47
|
+
this.finalizeError(err);
|
|
48
|
+
if (typeof inner.throw === "function") {
|
|
49
|
+
return inner.throw(err);
|
|
50
|
+
}
|
|
51
|
+
throw err;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
finalizeSuccess() {
|
|
56
|
+
if (this.finalized)
|
|
57
|
+
return;
|
|
58
|
+
this.finalized = true;
|
|
59
|
+
this.emit.success(this.usage);
|
|
60
|
+
}
|
|
61
|
+
finalizeError(err) {
|
|
62
|
+
if (this.finalized)
|
|
63
|
+
return;
|
|
64
|
+
this.finalized = true;
|
|
65
|
+
this.emit.error(err);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Attach a tee-style proxy onto an object that is iterable AND has its own
|
|
70
|
+
* helper methods/properties (as OpenAI and Anthropic stream wrappers do).
|
|
71
|
+
* Returns a proxy that looks and behaves like the original but teases off
|
|
72
|
+
* `Symbol.asyncIterator` to our accumulator.
|
|
73
|
+
*/
|
|
74
|
+
export function wrapStreamObject(wrapped, emit, handler) {
|
|
75
|
+
const proxy = new AsyncStreamProxy(wrapped, emit, handler);
|
|
76
|
+
return new Proxy(wrapped, {
|
|
77
|
+
get(target, prop, receiver) {
|
|
78
|
+
if (prop === Symbol.asyncIterator) {
|
|
79
|
+
return () => proxy[Symbol.asyncIterator]();
|
|
80
|
+
}
|
|
81
|
+
return Reflect.get(target, prop, receiver);
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=streams.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streams.js","sourceRoot":"","sources":["../src/streams.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,qDAAqD;AASrD,MAAM,OAAO,gBAAgB;IAKR;IACA;IACA;IANX,KAAK,GAAgB,EAAE,CAAC;IACxB,SAAS,GAAG,KAAK,CAAC;IAE1B,YACmB,OAAyB,EACzB,IAAiB,EACjB,OAA8B;QAF9B,YAAO,GAAP,OAAO,CAAkB;QACzB,SAAI,GAAJ,IAAI,CAAa;QACjB,YAAO,GAAP,OAAO,CAAuB;IAC9C,CAAC;IAEJ,CAAC,MAAM,CAAC,aAAa,CAAC;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;QACnD,OAAO;YACL,IAAI,EAAE,KAAK,IAAgC,EAAE;gBAC3C,IAAI,MAAyB,CAAC;gBAC9B,IAAI,CAAC;oBACH,MAAM,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC9B,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;oBACxB,MAAM,GAAG,CAAC;gBACZ,CAAC;gBACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBAChB,IAAI,CAAC,eAAe,EAAE,CAAC;oBACvB,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,IAAI,CAAC;oBACH,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBACzC,CAAC;gBAAC,MAAM,CAAC;oBACP,4DAA4D;gBAC9D,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,MAAM,EAAE,KAAK,EAAE,KAAe,EAA8B,EAAE;gBAC5D,IAAI,CAAC,eAAe,EAAE,CAAC;gBACvB,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBACvC,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC7B,CAAC;gBACD,OAAO,EAAE,KAAK,EAAE,KAAU,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YAC3C,CAAC;YACD,KAAK,EAAE,KAAK,EAAE,GAAa,EAA8B,EAAE;gBACzD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBACxB,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;oBACtC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC1B,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;SACF,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAEO,aAAa,CAAC,GAAY;QAChC,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAmC,EACnC,IAAiB,EACjB,OAA2B;IAE3B,MAAM,KAAK,GAAG,IAAI,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3D,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE;QACxB,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ;YACxB,IAAI,IAAI,KAAK,MAAM,CAAC,aAAa,EAAE,CAAC;gBAClC,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC;YAC7C,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/track.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type UsageReport } from "./instrument.js";
|
|
2
|
+
/** Metadata describing a hand-instrumented AI call. All fields optional. */
|
|
3
|
+
export interface AICallInfo {
|
|
4
|
+
/** gen_ai.system — free-form (e.g. "anthropic"). Default "custom". */
|
|
5
|
+
provider?: string;
|
|
6
|
+
/** gen_ai.operation.name. Default OP_CHAT ("chat"). */
|
|
7
|
+
operation?: string;
|
|
8
|
+
/** gen_ai.request.model. Default "<unknown>". */
|
|
9
|
+
model?: string;
|
|
10
|
+
messages?: unknown;
|
|
11
|
+
system?: unknown;
|
|
12
|
+
tools?: unknown;
|
|
13
|
+
responseFormat?: unknown;
|
|
14
|
+
maxTokens?: number | null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Usage data fed back to the SDK. Mirrors the core UsageReport exactly so it can
|
|
18
|
+
* be passed straight through — no parallel shape, no mapping.
|
|
19
|
+
*/
|
|
20
|
+
export type AIUsage = UsageReport;
|
|
21
|
+
/** Manual handle for an in-flight AI call that crosses function boundaries. */
|
|
22
|
+
export interface AICallHandle {
|
|
23
|
+
/** Merge usage into the call; last-write-wins per field. */
|
|
24
|
+
setUsage(usage: AIUsage): void;
|
|
25
|
+
/** Finalize as success; idempotent. */
|
|
26
|
+
end(usage?: AIUsage): void;
|
|
27
|
+
/** Finalize as error; idempotent; first finalize wins. */
|
|
28
|
+
fail(error: unknown): void;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Manual/try-finally form. Returns a handle whose methods are guarded no-ops
|
|
32
|
+
* when the SDK is disabled, and which never throws internal errors to the
|
|
33
|
+
* caller. Use `skipFrames: 2` and rely on `skipPackageDirs` to absorb the
|
|
34
|
+
* variable number of internal track.ts frames.
|
|
35
|
+
*/
|
|
36
|
+
export declare function startAICall(info?: AICallInfo): AICallHandle;
|
|
37
|
+
/**
|
|
38
|
+
* Foolproof callback form, built on startAICall. Runs `fn`, passing a `report`
|
|
39
|
+
* setter to feed usage; finalizes success on return / error on throw. Supports
|
|
40
|
+
* sync and async (thenable) callbacks. The resolved value and any error always
|
|
41
|
+
* pass through untouched.
|
|
42
|
+
*/
|
|
43
|
+
export declare function trackAICall<T>(info: AICallInfo, fn: (report: (usage: AIUsage) => void) => T): T;
|
|
44
|
+
//# sourceMappingURL=track.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"track.d.ts","sourceRoot":"","sources":["../src/track.ts"],"names":[],"mappings":"AAeA,OAAO,EAIL,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AAIzB,4EAA4E;AAC5E,MAAM,WAAW,UAAU;IACzB,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,WAAW,CAAC;AAElC,+EAA+E;AAC/E,MAAM,WAAW,YAAY;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,uCAAuC;IACvC,GAAG,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3B,0DAA0D;IAC1D,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5B;AAmCD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,GAAE,UAAe,GAAG,YAAY,CAqD/D;AAkBD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAC3B,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,KAAK,CAAC,GAC1C,CAAC,CA2BH"}
|