@superblocksteam/telemetry 2.0.83-next.1
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.txt +87 -0
- package/README.md +155 -0
- package/dist/browser/index.d.ts +8 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +19 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/init.d.ts +75 -0
- package/dist/browser/init.d.ts.map +1 -0
- package/dist/browser/init.js +169 -0
- package/dist/browser/init.js.map +1 -0
- package/dist/browser/resilient-exporter.d.ts +43 -0
- package/dist/browser/resilient-exporter.d.ts.map +1 -0
- package/dist/browser/resilient-exporter.js +88 -0
- package/dist/browser/resilient-exporter.js.map +1 -0
- package/dist/common/contracts/tier2-traces.d.ts +75 -0
- package/dist/common/contracts/tier2-traces.d.ts.map +1 -0
- package/dist/common/contracts/tier2-traces.js +186 -0
- package/dist/common/contracts/tier2-traces.js.map +1 -0
- package/dist/common/deployment-type.d.ts +18 -0
- package/dist/common/deployment-type.d.ts.map +1 -0
- package/dist/common/deployment-type.js +30 -0
- package/dist/common/deployment-type.js.map +1 -0
- package/dist/common/guardrails.d.ts +116 -0
- package/dist/common/guardrails.d.ts.map +1 -0
- package/dist/common/guardrails.js +189 -0
- package/dist/common/guardrails.js.map +1 -0
- package/dist/common/index.d.ts +16 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +32 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/log-sanitizer.d.ts +78 -0
- package/dist/common/log-sanitizer.d.ts.map +1 -0
- package/dist/common/log-sanitizer.js +340 -0
- package/dist/common/log-sanitizer.js.map +1 -0
- package/dist/common/policy-evaluator.d.ts +103 -0
- package/dist/common/policy-evaluator.d.ts.map +1 -0
- package/dist/common/policy-evaluator.js +200 -0
- package/dist/common/policy-evaluator.js.map +1 -0
- package/dist/common/resource.d.ts +62 -0
- package/dist/common/resource.d.ts.map +1 -0
- package/dist/common/resource.js +106 -0
- package/dist/common/resource.js.map +1 -0
- package/dist/common/tier-hints.d.ts +182 -0
- package/dist/common/tier-hints.d.ts.map +1 -0
- package/dist/common/tier-hints.js +209 -0
- package/dist/common/tier-hints.js.map +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +76 -0
- package/dist/index.js.map +1 -0
- package/dist/lint/forbidden-attributes.d.ts +149 -0
- package/dist/lint/forbidden-attributes.d.ts.map +1 -0
- package/dist/lint/forbidden-attributes.js +214 -0
- package/dist/lint/forbidden-attributes.js.map +1 -0
- package/dist/lint/index.d.ts +9 -0
- package/dist/lint/index.d.ts.map +1 -0
- package/dist/lint/index.js +16 -0
- package/dist/lint/index.js.map +1 -0
- package/dist/llmobs/index.d.ts +22 -0
- package/dist/llmobs/index.d.ts.map +1 -0
- package/dist/llmobs/index.js +29 -0
- package/dist/llmobs/index.js.map +1 -0
- package/dist/llmobs/tier1-exporter.d.ts +146 -0
- package/dist/llmobs/tier1-exporter.d.ts.map +1 -0
- package/dist/llmobs/tier1-exporter.js +196 -0
- package/dist/llmobs/tier1-exporter.js.map +1 -0
- package/dist/llmobs/tier2-summarizer.d.ts +268 -0
- package/dist/llmobs/tier2-summarizer.d.ts.map +1 -0
- package/dist/llmobs/tier2-summarizer.js +650 -0
- package/dist/llmobs/tier2-summarizer.js.map +1 -0
- package/dist/node/exporters/resilient-exporter.d.ts +77 -0
- package/dist/node/exporters/resilient-exporter.d.ts.map +1 -0
- package/dist/node/exporters/resilient-exporter.js +129 -0
- package/dist/node/exporters/resilient-exporter.js.map +1 -0
- package/dist/node/index.d.ts +11 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +24 -0
- package/dist/node/index.js.map +1 -0
- package/dist/node/init.d.ts +75 -0
- package/dist/node/init.d.ts.map +1 -0
- package/dist/node/init.js +245 -0
- package/dist/node/init.js.map +1 -0
- package/dist/node/log-processor.d.ts +83 -0
- package/dist/node/log-processor.d.ts.map +1 -0
- package/dist/node/log-processor.js +266 -0
- package/dist/node/log-processor.js.map +1 -0
- package/dist/node/metrics-client.d.ts +66 -0
- package/dist/node/metrics-client.d.ts.map +1 -0
- package/dist/node/metrics-client.js +193 -0
- package/dist/node/metrics-client.js.map +1 -0
- package/dist/node/traced-socket.d.ts +76 -0
- package/dist/node/traced-socket.d.ts.map +1 -0
- package/dist/node/traced-socket.js +261 -0
- package/dist/node/traced-socket.js.map +1 -0
- package/dist/testing/in-memory-exporter.d.ts +179 -0
- package/dist/testing/in-memory-exporter.d.ts.map +1 -0
- package/dist/testing/in-memory-exporter.js +254 -0
- package/dist/testing/in-memory-exporter.js.map +1 -0
- package/dist/testing/index.d.ts +8 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +19 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/test-init.d.ts +80 -0
- package/dist/testing/test-init.d.ts.map +1 -0
- package/dist/testing/test-init.js +144 -0
- package/dist/testing/test-init.js.map +1 -0
- package/dist/types/index.d.ts +40 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +23 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/policy.d.ts +92 -0
- package/dist/types/policy.d.ts.map +1 -0
- package/dist/types/policy.js +125 -0
- package/dist/types/policy.js.map +1 -0
- package/dist-esm/browser/index.d.ts +8 -0
- package/dist-esm/browser/index.d.ts.map +1 -0
- package/dist-esm/browser/index.js +9 -0
- package/dist-esm/browser/index.js.map +1 -0
- package/dist-esm/browser/init.d.ts +75 -0
- package/dist-esm/browser/init.d.ts.map +1 -0
- package/dist-esm/browser/init.js +162 -0
- package/dist-esm/browser/init.js.map +1 -0
- package/dist-esm/browser/resilient-exporter.d.ts +43 -0
- package/dist-esm/browser/resilient-exporter.d.ts.map +1 -0
- package/dist-esm/browser/resilient-exporter.js +84 -0
- package/dist-esm/browser/resilient-exporter.js.map +1 -0
- package/dist-esm/common/contracts/tier2-traces.d.ts +75 -0
- package/dist-esm/common/contracts/tier2-traces.d.ts.map +1 -0
- package/dist-esm/common/contracts/tier2-traces.js +178 -0
- package/dist-esm/common/contracts/tier2-traces.js.map +1 -0
- package/dist-esm/common/deployment-type.d.ts +18 -0
- package/dist-esm/common/deployment-type.d.ts.map +1 -0
- package/dist-esm/common/deployment-type.js +27 -0
- package/dist-esm/common/deployment-type.js.map +1 -0
- package/dist-esm/common/guardrails.d.ts +116 -0
- package/dist-esm/common/guardrails.d.ts.map +1 -0
- package/dist-esm/common/guardrails.js +179 -0
- package/dist-esm/common/guardrails.js.map +1 -0
- package/dist-esm/common/index.d.ts +16 -0
- package/dist-esm/common/index.d.ts.map +1 -0
- package/dist-esm/common/index.js +16 -0
- package/dist-esm/common/index.js.map +1 -0
- package/dist-esm/common/log-sanitizer.d.ts +78 -0
- package/dist-esm/common/log-sanitizer.d.ts.map +1 -0
- package/dist-esm/common/log-sanitizer.js +331 -0
- package/dist-esm/common/log-sanitizer.js.map +1 -0
- package/dist-esm/common/policy-evaluator.d.ts +103 -0
- package/dist-esm/common/policy-evaluator.d.ts.map +1 -0
- package/dist-esm/common/policy-evaluator.js +196 -0
- package/dist-esm/common/policy-evaluator.js.map +1 -0
- package/dist-esm/common/resource.d.ts +62 -0
- package/dist-esm/common/resource.d.ts.map +1 -0
- package/dist-esm/common/resource.js +100 -0
- package/dist-esm/common/resource.js.map +1 -0
- package/dist-esm/common/tier-hints.d.ts +182 -0
- package/dist-esm/common/tier-hints.d.ts.map +1 -0
- package/dist-esm/common/tier-hints.js +199 -0
- package/dist-esm/common/tier-hints.js.map +1 -0
- package/dist-esm/index.d.ts +43 -0
- package/dist-esm/index.d.ts.map +1 -0
- package/dist-esm/index.js +53 -0
- package/dist-esm/index.js.map +1 -0
- package/dist-esm/lint/forbidden-attributes.d.ts +149 -0
- package/dist-esm/lint/forbidden-attributes.d.ts.map +1 -0
- package/dist-esm/lint/forbidden-attributes.js +209 -0
- package/dist-esm/lint/forbidden-attributes.js.map +1 -0
- package/dist-esm/lint/index.d.ts +9 -0
- package/dist-esm/lint/index.d.ts.map +1 -0
- package/dist-esm/lint/index.js +9 -0
- package/dist-esm/lint/index.js.map +1 -0
- package/dist-esm/llmobs/index.d.ts +22 -0
- package/dist-esm/llmobs/index.d.ts.map +1 -0
- package/dist-esm/llmobs/index.js +22 -0
- package/dist-esm/llmobs/index.js.map +1 -0
- package/dist-esm/llmobs/tier1-exporter.d.ts +146 -0
- package/dist-esm/llmobs/tier1-exporter.d.ts.map +1 -0
- package/dist-esm/llmobs/tier1-exporter.js +190 -0
- package/dist-esm/llmobs/tier1-exporter.js.map +1 -0
- package/dist-esm/llmobs/tier2-summarizer.d.ts +268 -0
- package/dist-esm/llmobs/tier2-summarizer.d.ts.map +1 -0
- package/dist-esm/llmobs/tier2-summarizer.js +646 -0
- package/dist-esm/llmobs/tier2-summarizer.js.map +1 -0
- package/dist-esm/node/exporters/resilient-exporter.d.ts +77 -0
- package/dist-esm/node/exporters/resilient-exporter.d.ts.map +1 -0
- package/dist-esm/node/exporters/resilient-exporter.js +125 -0
- package/dist-esm/node/exporters/resilient-exporter.js.map +1 -0
- package/dist-esm/node/index.d.ts +11 -0
- package/dist-esm/node/index.d.ts.map +1 -0
- package/dist-esm/node/index.js +11 -0
- package/dist-esm/node/index.js.map +1 -0
- package/dist-esm/node/init.d.ts +75 -0
- package/dist-esm/node/init.d.ts.map +1 -0
- package/dist-esm/node/init.js +239 -0
- package/dist-esm/node/init.js.map +1 -0
- package/dist-esm/node/log-processor.d.ts +83 -0
- package/dist-esm/node/log-processor.d.ts.map +1 -0
- package/dist-esm/node/log-processor.js +261 -0
- package/dist-esm/node/log-processor.js.map +1 -0
- package/dist-esm/node/metrics-client.d.ts +66 -0
- package/dist-esm/node/metrics-client.d.ts.map +1 -0
- package/dist-esm/node/metrics-client.js +189 -0
- package/dist-esm/node/metrics-client.js.map +1 -0
- package/dist-esm/node/traced-socket.d.ts +76 -0
- package/dist-esm/node/traced-socket.d.ts.map +1 -0
- package/dist-esm/node/traced-socket.js +257 -0
- package/dist-esm/node/traced-socket.js.map +1 -0
- package/dist-esm/testing/in-memory-exporter.d.ts +179 -0
- package/dist-esm/testing/in-memory-exporter.d.ts.map +1 -0
- package/dist-esm/testing/in-memory-exporter.js +248 -0
- package/dist-esm/testing/in-memory-exporter.js.map +1 -0
- package/dist-esm/testing/index.d.ts +8 -0
- package/dist-esm/testing/index.d.ts.map +1 -0
- package/dist-esm/testing/index.js +8 -0
- package/dist-esm/testing/index.js.map +1 -0
- package/dist-esm/testing/test-init.d.ts +80 -0
- package/dist-esm/testing/test-init.d.ts.map +1 -0
- package/dist-esm/testing/test-init.js +137 -0
- package/dist-esm/testing/test-init.js.map +1 -0
- package/dist-esm/types/index.d.ts +40 -0
- package/dist-esm/types/index.d.ts.map +1 -0
- package/dist-esm/types/index.js +7 -0
- package/dist-esm/types/index.js.map +1 -0
- package/dist-esm/types/policy.d.ts +92 -0
- package/dist-esm/types/policy.d.ts.map +1 -0
- package/dist-esm/types/policy.js +122 -0
- package/dist-esm/types/policy.js.map +1 -0
- package/package.json +101 -0
|
@@ -0,0 +1,650 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Tier 2 LLMObs Summarizer
|
|
4
|
+
*
|
|
5
|
+
* Extracts operational metrics from LLMObs spans for Tier 2 export.
|
|
6
|
+
* CRITICAL: This emits metrics WITHOUT any sensitive content.
|
|
7
|
+
*
|
|
8
|
+
* Tier 2 metrics include:
|
|
9
|
+
* - LLM latency by provider/model
|
|
10
|
+
* - Token usage (input, output, cached, reasoning)
|
|
11
|
+
* - Success/failure rates by error category
|
|
12
|
+
* - Cost aggregates
|
|
13
|
+
*
|
|
14
|
+
* EXPLICITLY EXCLUDED:
|
|
15
|
+
* - Prompts, code, tool IO
|
|
16
|
+
* - File paths, stack traces
|
|
17
|
+
* - User identifiers
|
|
18
|
+
*/
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
exports.LLMObsTier2Summarizer = void 0;
|
|
21
|
+
/**
|
|
22
|
+
* LLMObs Tier 2 Summarizer.
|
|
23
|
+
*
|
|
24
|
+
* Processes Tier 1 LLMObs spans and emits Tier 2 metrics.
|
|
25
|
+
* CRITICAL: Ensures NO prompts, code, tool IO appear in metrics.
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const summarizer = new LLMObsTier2Summarizer(metricsClient);
|
|
30
|
+
*
|
|
31
|
+
* // Process each LLMObs span
|
|
32
|
+
* for (const span of llmobsSpans) {
|
|
33
|
+
* summarizer.summarize(span);
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
class LLMObsTier2Summarizer {
|
|
38
|
+
metricsClient;
|
|
39
|
+
pricing;
|
|
40
|
+
/**
|
|
41
|
+
* Create a Tier 2 summarizer.
|
|
42
|
+
*
|
|
43
|
+
* @param metricsClient - Client for emitting metrics
|
|
44
|
+
* @param customPricing - Optional custom pricing per model
|
|
45
|
+
*/
|
|
46
|
+
constructor(metricsClient, customPricing) {
|
|
47
|
+
this.metricsClient = metricsClient;
|
|
48
|
+
this.pricing = customPricing ?? this.getDefaultPricing();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Process a Tier 1 LLMObs span and emit Tier 2 metrics.
|
|
52
|
+
*
|
|
53
|
+
* @param span - The span to summarize
|
|
54
|
+
*/
|
|
55
|
+
summarize(span) {
|
|
56
|
+
const spanKind = span.attributes["llmobs.span_kind"];
|
|
57
|
+
switch (spanKind) {
|
|
58
|
+
case "llm":
|
|
59
|
+
this.summarizeLLMSpan(span);
|
|
60
|
+
break;
|
|
61
|
+
case "tool":
|
|
62
|
+
this.summarizeToolSpan(span);
|
|
63
|
+
break;
|
|
64
|
+
case "workflow":
|
|
65
|
+
case "task":
|
|
66
|
+
// Workflow/task summaries are derived from child spans
|
|
67
|
+
// No additional metrics needed at this level
|
|
68
|
+
break;
|
|
69
|
+
default:
|
|
70
|
+
// Check by span name patterns
|
|
71
|
+
if (this.isLLMSpan(span)) {
|
|
72
|
+
this.summarizeLLMSpan(span);
|
|
73
|
+
}
|
|
74
|
+
else if (this.isToolSpan(span)) {
|
|
75
|
+
this.summarizeToolSpan(span);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Extract a summary from an LLM span (for testing/debugging).
|
|
81
|
+
* Contains NO sensitive data.
|
|
82
|
+
*
|
|
83
|
+
* @param span - The span to extract from
|
|
84
|
+
* @returns Summary with safe metrics only
|
|
85
|
+
*/
|
|
86
|
+
extractLLMSummary(span) {
|
|
87
|
+
const attrs = span.attributes;
|
|
88
|
+
// Extract provider and model from various attribute names with defensive coercion
|
|
89
|
+
const providerRaw = attrs["llmobs.model_provider"] ??
|
|
90
|
+
attrs["llm.provider"] ??
|
|
91
|
+
attrs["gen_ai.system"] ??
|
|
92
|
+
attrs["gen_ai.provider.name"];
|
|
93
|
+
const provider = this.normalizeProvider(providerRaw);
|
|
94
|
+
const providerOtel = this.normalizeProviderOtel(providerRaw);
|
|
95
|
+
const modelRaw = attrs["llmobs.model_name"] ??
|
|
96
|
+
attrs["llm.model"] ??
|
|
97
|
+
attrs["gen_ai.request.model"] ??
|
|
98
|
+
attrs["gen_ai.response.model"];
|
|
99
|
+
const model = this.normalizeModel(modelRaw);
|
|
100
|
+
// Extract response model if different from request model
|
|
101
|
+
const responseModelRaw = attrs["gen_ai.response.model"];
|
|
102
|
+
const responseModel = responseModelRaw
|
|
103
|
+
? this.normalizeModel(responseModelRaw)
|
|
104
|
+
: undefined;
|
|
105
|
+
// Extract operation name (OTEL semantic convention)
|
|
106
|
+
const operationName = this.extractOperationName(span);
|
|
107
|
+
// Extract time to first token (streaming)
|
|
108
|
+
const timeToFirstTokenMs = this.extractTimeToFirstToken(attrs);
|
|
109
|
+
// Extract token counts from various attribute names, clamped to non-negative
|
|
110
|
+
const inputTokens = Math.max(0, attrs["llmobs.metrics.input_tokens"] ??
|
|
111
|
+
attrs["llmobs.metrics.inputTokens"] ??
|
|
112
|
+
attrs["llm.input_tokens"] ??
|
|
113
|
+
attrs["gen_ai.usage.input_tokens"] ??
|
|
114
|
+
0);
|
|
115
|
+
const outputTokens = Math.max(0, attrs["llmobs.metrics.output_tokens"] ??
|
|
116
|
+
attrs["llmobs.metrics.outputTokens"] ??
|
|
117
|
+
attrs["llm.output_tokens"] ??
|
|
118
|
+
attrs["gen_ai.usage.output_tokens"] ??
|
|
119
|
+
0);
|
|
120
|
+
const totalTokens = Math.max(0, attrs["llmobs.metrics.total_tokens"] ??
|
|
121
|
+
attrs["llmobs.metrics.totalTokens"] ??
|
|
122
|
+
attrs["llm.total_tokens"] ??
|
|
123
|
+
inputTokens + outputTokens);
|
|
124
|
+
const reasoningTokens = Math.max(0, attrs["llmobs.metrics.reasoning_tokens"] ??
|
|
125
|
+
attrs["llmobs.metrics.reasoningTokens"] ??
|
|
126
|
+
attrs["llm.reasoning_tokens"] ??
|
|
127
|
+
0);
|
|
128
|
+
const cachedTokens = Math.max(0, attrs["llmobs.metrics.cache_read_tokens"] ??
|
|
129
|
+
attrs["llmobs.metrics.cacheReadTokens"] ??
|
|
130
|
+
attrs["llm.cached_tokens"] ??
|
|
131
|
+
0);
|
|
132
|
+
// Extract status
|
|
133
|
+
const status = this.extractStatus(span);
|
|
134
|
+
const errorCategory = this.categorizeError(span);
|
|
135
|
+
const finishReason = this.extractFinishReason(span);
|
|
136
|
+
// Calculate duration
|
|
137
|
+
const durationMs = this.getDurationMs(span);
|
|
138
|
+
// Estimate cost
|
|
139
|
+
const estimatedCost = this.estimateCost(model, inputTokens, outputTokens);
|
|
140
|
+
return {
|
|
141
|
+
provider,
|
|
142
|
+
providerOtel,
|
|
143
|
+
model,
|
|
144
|
+
responseModel,
|
|
145
|
+
status,
|
|
146
|
+
durationMs,
|
|
147
|
+
inputTokens,
|
|
148
|
+
outputTokens,
|
|
149
|
+
totalTokens,
|
|
150
|
+
reasoningTokens,
|
|
151
|
+
cachedTokens,
|
|
152
|
+
errorCategory,
|
|
153
|
+
finishReason,
|
|
154
|
+
estimatedCost,
|
|
155
|
+
operationName,
|
|
156
|
+
timeToFirstTokenMs,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Extract a summary from a tool span.
|
|
161
|
+
*
|
|
162
|
+
* @param span - The span to extract from
|
|
163
|
+
* @returns Tool summary with safe metrics only
|
|
164
|
+
*/
|
|
165
|
+
extractToolSummary(span) {
|
|
166
|
+
const attrs = span.attributes;
|
|
167
|
+
const toolName = this.normalizeToolName(attrs["tool.name"] ||
|
|
168
|
+
span.name.replace("tool.", "") ||
|
|
169
|
+
"unknown");
|
|
170
|
+
const status = attrs["llmobs.status"] === "error" ||
|
|
171
|
+
attrs["otel.status_code"] === 2 ||
|
|
172
|
+
attrs["error"] === true
|
|
173
|
+
? "error"
|
|
174
|
+
: "success";
|
|
175
|
+
// Extract error category for tool failures (added in v0.2.0)
|
|
176
|
+
const errorCategory = status === "error"
|
|
177
|
+
? this.categorizeToolError(span)
|
|
178
|
+
: "none";
|
|
179
|
+
return {
|
|
180
|
+
toolName,
|
|
181
|
+
status,
|
|
182
|
+
durationMs: this.getDurationMs(span),
|
|
183
|
+
errorCategory,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Emit LLM span metrics.
|
|
188
|
+
* Emits BOTH legacy (llm_*) and OTEL-aligned (gen_ai.*) metrics for migration.
|
|
189
|
+
*/
|
|
190
|
+
summarizeLLMSpan(span) {
|
|
191
|
+
const summary = this.extractLLMSummary(span);
|
|
192
|
+
// === OTEL-ALIGNED METRICS (gen_ai.*) ===
|
|
193
|
+
// gen_ai.client.operation.duration (histogram with OTEL bucket boundaries)
|
|
194
|
+
const otelDurationLabels = {
|
|
195
|
+
"gen_ai.operation.name": summary.operationName,
|
|
196
|
+
"gen_ai.provider.name": summary.providerOtel,
|
|
197
|
+
"gen_ai.request.model": summary.model,
|
|
198
|
+
};
|
|
199
|
+
if (summary.responseModel) {
|
|
200
|
+
otelDurationLabels["gen_ai.response.model"] = summary.responseModel;
|
|
201
|
+
}
|
|
202
|
+
if (summary.status === "error" && summary.errorCategory !== "none") {
|
|
203
|
+
otelDurationLabels["error.type"] = summary.errorCategory;
|
|
204
|
+
}
|
|
205
|
+
this.metricsClient.recordHistogram("gen_ai.client.operation.duration", summary.durationMs / 1000, otelDurationLabels);
|
|
206
|
+
// gen_ai.client.token.usage (histogram for distribution insights)
|
|
207
|
+
const tokenBaseLabels = {
|
|
208
|
+
"gen_ai.operation.name": summary.operationName,
|
|
209
|
+
"gen_ai.provider.name": summary.providerOtel,
|
|
210
|
+
"gen_ai.request.model": summary.model,
|
|
211
|
+
};
|
|
212
|
+
if (summary.responseModel) {
|
|
213
|
+
tokenBaseLabels["gen_ai.response.model"] = summary.responseModel;
|
|
214
|
+
}
|
|
215
|
+
if (summary.inputTokens > 0) {
|
|
216
|
+
this.metricsClient.recordHistogram("gen_ai.client.token.usage", summary.inputTokens, { ...tokenBaseLabels, "gen_ai.token.type": "input" });
|
|
217
|
+
}
|
|
218
|
+
if (summary.outputTokens > 0) {
|
|
219
|
+
this.metricsClient.recordHistogram("gen_ai.client.token.usage", summary.outputTokens, { ...tokenBaseLabels, "gen_ai.token.type": "output" });
|
|
220
|
+
}
|
|
221
|
+
// gen_ai.client.time_to_first_token (streaming TTFT)
|
|
222
|
+
// Contract only allows operation names: chat, text_completion, generate_content
|
|
223
|
+
const ttftAllowedOperations = ["chat", "text_completion", "generate_content"];
|
|
224
|
+
if (summary.timeToFirstTokenMs !== undefined &&
|
|
225
|
+
summary.timeToFirstTokenMs > 0 &&
|
|
226
|
+
ttftAllowedOperations.includes(summary.operationName)) {
|
|
227
|
+
this.metricsClient.recordHistogram("gen_ai.client.time_to_first_token", summary.timeToFirstTokenMs / 1000, {
|
|
228
|
+
"gen_ai.operation.name": summary.operationName,
|
|
229
|
+
"gen_ai.provider.name": summary.providerOtel,
|
|
230
|
+
"gen_ai.request.model": summary.model,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
// NOTE: Legacy llm_* metrics have been removed.
|
|
234
|
+
// Billing data flows through CloudEvents → Snowflake, not metrics.
|
|
235
|
+
// See: engineering/projects/o11y-refactor/billing-proposal.md
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Emit tool span metrics.
|
|
239
|
+
* Uses OTEL-aligned naming with gen_ai.operation.name = "execute_tool".
|
|
240
|
+
*/
|
|
241
|
+
summarizeToolSpan(span) {
|
|
242
|
+
const summary = this.extractToolSummary(span);
|
|
243
|
+
// gen_ai.client.operation.duration for tool executions
|
|
244
|
+
const durationLabels = {
|
|
245
|
+
"gen_ai.operation.name": "execute_tool",
|
|
246
|
+
"gen_ai.tool.name": summary.toolName,
|
|
247
|
+
};
|
|
248
|
+
if (summary.status === "error" && summary.errorCategory !== "none") {
|
|
249
|
+
durationLabels["error.type"] = summary.errorCategory;
|
|
250
|
+
}
|
|
251
|
+
this.metricsClient.recordHistogram("gen_ai.client.operation.duration", summary.durationMs / 1000, durationLabels);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Check if span is an LLM span by name pattern.
|
|
255
|
+
*/
|
|
256
|
+
isLLMSpan(span) {
|
|
257
|
+
return (span.name.startsWith("llm.") ||
|
|
258
|
+
span.name.startsWith("ai.streamText") ||
|
|
259
|
+
span.name.includes(".llm") ||
|
|
260
|
+
!!span.attributes["llm.model"] ||
|
|
261
|
+
!!span.attributes["gen_ai.request.model"]);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Check if span is a tool span by name pattern.
|
|
265
|
+
*/
|
|
266
|
+
isToolSpan(span) {
|
|
267
|
+
return (span.name.startsWith("tool.") ||
|
|
268
|
+
span.attributes["llmobs.span_kind"] === "tool");
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Extract span status.
|
|
272
|
+
*/
|
|
273
|
+
extractStatus(span) {
|
|
274
|
+
const attrs = span.attributes;
|
|
275
|
+
if (attrs["llmobs.status"] === "error" ||
|
|
276
|
+
attrs["otel.status_code"] === 2 ||
|
|
277
|
+
attrs["error"] === true) {
|
|
278
|
+
return "error";
|
|
279
|
+
}
|
|
280
|
+
return "success";
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* Categorize error from span attributes.
|
|
284
|
+
* CRITICAL: Does NOT expose error messages or stack traces.
|
|
285
|
+
*/
|
|
286
|
+
categorizeError(span) {
|
|
287
|
+
if (this.extractStatus(span) !== "error") {
|
|
288
|
+
return "none";
|
|
289
|
+
}
|
|
290
|
+
const attrs = span.attributes;
|
|
291
|
+
// Check for explicit error category
|
|
292
|
+
const explicitCategory = attrs["llm.error_category"];
|
|
293
|
+
if (explicitCategory && this.isValidErrorCategory(explicitCategory)) {
|
|
294
|
+
return explicitCategory;
|
|
295
|
+
}
|
|
296
|
+
// Check metadata for error category (from llmobs observer)
|
|
297
|
+
const metadata = attrs["llmobs.metadata"];
|
|
298
|
+
if (metadata) {
|
|
299
|
+
try {
|
|
300
|
+
const parsed = JSON.parse(metadata);
|
|
301
|
+
if (parsed.errorCategory &&
|
|
302
|
+
this.isValidErrorCategory(parsed.errorCategory)) {
|
|
303
|
+
return parsed.errorCategory;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
// Ignore parse errors
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// Infer from tags (safe - checking boolean flags with strict comparison)
|
|
311
|
+
const tags = attrs["llmobs.tags"];
|
|
312
|
+
if (tags) {
|
|
313
|
+
try {
|
|
314
|
+
const parsed = JSON.parse(tags);
|
|
315
|
+
// Use strict === true to avoid truthy coercion of arbitrary values
|
|
316
|
+
if (parsed.wasAborted === true)
|
|
317
|
+
return "aborted";
|
|
318
|
+
if (parsed.errorCategory &&
|
|
319
|
+
this.isValidErrorCategory(parsed.errorCategory)) {
|
|
320
|
+
return parsed.errorCategory;
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
catch {
|
|
324
|
+
// Ignore parse errors
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return "unknown";
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Extract finish reason.
|
|
331
|
+
* Handles gen_ai.response.finish_reasons as array per OTEL semantic conventions.
|
|
332
|
+
*/
|
|
333
|
+
extractFinishReason(span) {
|
|
334
|
+
const attrs = span.attributes;
|
|
335
|
+
// Try single-value attribute first
|
|
336
|
+
const singleReason = attrs["llm.finish_reason"];
|
|
337
|
+
if (typeof singleReason === "string" && this.isValidFinishReason(singleReason)) {
|
|
338
|
+
return singleReason;
|
|
339
|
+
}
|
|
340
|
+
// Handle finish_reasons as array (OTEL semantic conventions uses plural/array)
|
|
341
|
+
const reasons = attrs["gen_ai.response.finish_reasons"];
|
|
342
|
+
if (Array.isArray(reasons) && reasons.length > 0) {
|
|
343
|
+
const firstReason = String(reasons[0]);
|
|
344
|
+
if (this.isValidFinishReason(firstReason)) {
|
|
345
|
+
return firstReason;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
else if (typeof reasons === "string" && this.isValidFinishReason(reasons)) {
|
|
349
|
+
return reasons;
|
|
350
|
+
}
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Normalize provider name to allowed values.
|
|
355
|
+
* Defensive: handles non-string inputs gracefully.
|
|
356
|
+
*/
|
|
357
|
+
normalizeProvider(provider) {
|
|
358
|
+
// Defensive string coercion - handles objects with toString()
|
|
359
|
+
if (provider == null)
|
|
360
|
+
return "openai";
|
|
361
|
+
const providerStr = typeof provider === "string" ? provider : String(provider);
|
|
362
|
+
const normalized = providerStr.toLowerCase();
|
|
363
|
+
const mapping = {
|
|
364
|
+
openai: "openai",
|
|
365
|
+
anthropic: "anthropic",
|
|
366
|
+
claude: "anthropic",
|
|
367
|
+
azure: "azure",
|
|
368
|
+
azure_openai: "azure",
|
|
369
|
+
bedrock: "bedrock",
|
|
370
|
+
aws_bedrock: "bedrock",
|
|
371
|
+
google: "google",
|
|
372
|
+
gemini: "google",
|
|
373
|
+
cohere: "cohere",
|
|
374
|
+
mistral: "mistral",
|
|
375
|
+
};
|
|
376
|
+
return mapping[normalized] ?? "openai"; // Default to openai for unknown
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Normalize provider to OTEL canonical names.
|
|
380
|
+
* Maps legacy names to OTEL gen_ai.provider.name values.
|
|
381
|
+
* @see https://opentelemetry.io/docs/specs/semconv/gen-ai/gen-ai-metrics/
|
|
382
|
+
*/
|
|
383
|
+
normalizeProviderOtel(provider) {
|
|
384
|
+
if (provider == null)
|
|
385
|
+
return "openai";
|
|
386
|
+
const providerStr = typeof provider === "string" ? provider : String(provider);
|
|
387
|
+
const normalized = providerStr.toLowerCase();
|
|
388
|
+
const mapping = {
|
|
389
|
+
openai: "openai",
|
|
390
|
+
anthropic: "anthropic",
|
|
391
|
+
claude: "anthropic",
|
|
392
|
+
azure: "azure.ai.openai",
|
|
393
|
+
azure_openai: "azure.ai.openai",
|
|
394
|
+
"azure.ai.openai": "azure.ai.openai",
|
|
395
|
+
"azure.ai.inference": "azure.ai.inference",
|
|
396
|
+
bedrock: "aws.bedrock",
|
|
397
|
+
aws_bedrock: "aws.bedrock",
|
|
398
|
+
"aws.bedrock": "aws.bedrock",
|
|
399
|
+
google: "gcp.vertex_ai",
|
|
400
|
+
gemini: "gcp.gemini",
|
|
401
|
+
vertex: "gcp.vertex_ai",
|
|
402
|
+
"gcp.gemini": "gcp.gemini",
|
|
403
|
+
"gcp.vertex_ai": "gcp.vertex_ai",
|
|
404
|
+
cohere: "cohere",
|
|
405
|
+
mistral: "mistral_ai",
|
|
406
|
+
mistral_ai: "mistral_ai",
|
|
407
|
+
deepseek: "deepseek",
|
|
408
|
+
groq: "groq",
|
|
409
|
+
};
|
|
410
|
+
return mapping[normalized] ?? "openai";
|
|
411
|
+
}
|
|
412
|
+
/**
|
|
413
|
+
* Extract operation name from span attributes.
|
|
414
|
+
* Maps span kind and attributes to OTEL gen_ai.operation.name values.
|
|
415
|
+
*/
|
|
416
|
+
extractOperationName(span) {
|
|
417
|
+
const attrs = span.attributes;
|
|
418
|
+
// Check for explicit operation name
|
|
419
|
+
const explicit = attrs["gen_ai.operation.name"];
|
|
420
|
+
if (explicit && this.isValidOperationName(explicit)) {
|
|
421
|
+
return explicit;
|
|
422
|
+
}
|
|
423
|
+
// Infer from span kind
|
|
424
|
+
const spanKind = attrs["llmobs.span_kind"];
|
|
425
|
+
if (spanKind === "tool")
|
|
426
|
+
return "execute_tool";
|
|
427
|
+
if (spanKind === "workflow" || spanKind === "agent")
|
|
428
|
+
return "invoke_agent";
|
|
429
|
+
if (spanKind === "embedding")
|
|
430
|
+
return "embeddings";
|
|
431
|
+
// Infer from span name
|
|
432
|
+
const spanName = span.name.toLowerCase();
|
|
433
|
+
if (spanName.includes("embed"))
|
|
434
|
+
return "embeddings";
|
|
435
|
+
if (spanName.includes("agent") || spanName.includes("clark"))
|
|
436
|
+
return "invoke_agent";
|
|
437
|
+
if (spanName.includes("tool"))
|
|
438
|
+
return "execute_tool";
|
|
439
|
+
if (spanName.includes("complete") && !spanName.includes("chat"))
|
|
440
|
+
return "text_completion";
|
|
441
|
+
// Default to chat (most common)
|
|
442
|
+
return "chat";
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* Extract time to first token from span attributes.
|
|
446
|
+
* Checks multiple attribute names for compatibility.
|
|
447
|
+
* Returns value in MILLISECONDS for consistent internal handling.
|
|
448
|
+
*
|
|
449
|
+
* IMPORTANT: Different attributes use different units:
|
|
450
|
+
* - gen_ai.client.time_to_first_token: SECONDS (OTEL spec)
|
|
451
|
+
* - llm.time_to_first_token_ms: MILLISECONDS
|
|
452
|
+
* - llmobs.metrics.time_to_first_token_ms: MILLISECONDS
|
|
453
|
+
* - timeToFirstTokenMs: MILLISECONDS
|
|
454
|
+
*/
|
|
455
|
+
extractTimeToFirstToken(attrs) {
|
|
456
|
+
// Check OTEL attribute first (in SECONDS) - convert to milliseconds
|
|
457
|
+
const ttftSeconds = attrs["gen_ai.client.time_to_first_token"];
|
|
458
|
+
if (typeof ttftSeconds === "number" && ttftSeconds > 0) {
|
|
459
|
+
return ttftSeconds * 1000; // Convert seconds to milliseconds
|
|
460
|
+
}
|
|
461
|
+
// Check millisecond-based attributes
|
|
462
|
+
const ttftMs = attrs["llm.time_to_first_token_ms"] ??
|
|
463
|
+
attrs["llmobs.metrics.time_to_first_token_ms"] ??
|
|
464
|
+
attrs["timeToFirstTokenMs"];
|
|
465
|
+
if (typeof ttftMs === "number" && ttftMs > 0) {
|
|
466
|
+
return ttftMs; // Already in milliseconds
|
|
467
|
+
}
|
|
468
|
+
return undefined;
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Categorize tool errors.
|
|
472
|
+
* CRITICAL: Does NOT expose error messages or stack traces.
|
|
473
|
+
*/
|
|
474
|
+
categorizeToolError(span) {
|
|
475
|
+
const attrs = span.attributes;
|
|
476
|
+
// Check for explicit error category
|
|
477
|
+
const explicit = attrs["tool.error_category"];
|
|
478
|
+
if (explicit && this.isValidToolErrorCategory(explicit)) {
|
|
479
|
+
return explicit;
|
|
480
|
+
}
|
|
481
|
+
// Check metadata
|
|
482
|
+
const metadata = attrs["llmobs.metadata"];
|
|
483
|
+
if (metadata) {
|
|
484
|
+
try {
|
|
485
|
+
const parsed = JSON.parse(metadata);
|
|
486
|
+
if (parsed.toolErrorCategory &&
|
|
487
|
+
this.isValidToolErrorCategory(parsed.toolErrorCategory)) {
|
|
488
|
+
return parsed.toolErrorCategory;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
catch {
|
|
492
|
+
// Ignore parse errors
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
// Infer from error type patterns (safe - checking enum values only)
|
|
496
|
+
const errorType = attrs["error.type"];
|
|
497
|
+
if (errorType) {
|
|
498
|
+
const normalized = errorType.toLowerCase();
|
|
499
|
+
if (normalized.includes("timeout"))
|
|
500
|
+
return "timeout";
|
|
501
|
+
if (normalized.includes("permission") || normalized.includes("auth"))
|
|
502
|
+
return "permission_denied";
|
|
503
|
+
if (normalized.includes("not_found") || normalized.includes("notfound"))
|
|
504
|
+
return "not_found";
|
|
505
|
+
if (normalized.includes("validation") || normalized.includes("invalid"))
|
|
506
|
+
return "validation_error";
|
|
507
|
+
}
|
|
508
|
+
return "execution_error"; // Default for tool errors
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Validate operation name is in the allowed enum.
|
|
512
|
+
*/
|
|
513
|
+
isValidOperationName(name) {
|
|
514
|
+
const valid = [
|
|
515
|
+
"chat",
|
|
516
|
+
"text_completion",
|
|
517
|
+
"embeddings",
|
|
518
|
+
"execute_tool",
|
|
519
|
+
"invoke_agent",
|
|
520
|
+
"generate_content",
|
|
521
|
+
];
|
|
522
|
+
return valid.includes(name);
|
|
523
|
+
}
|
|
524
|
+
/**
|
|
525
|
+
* Validate tool error category is in the allowed enum.
|
|
526
|
+
*/
|
|
527
|
+
isValidToolErrorCategory(category) {
|
|
528
|
+
const valid = [
|
|
529
|
+
"none",
|
|
530
|
+
"timeout",
|
|
531
|
+
"execution_error",
|
|
532
|
+
"validation_error",
|
|
533
|
+
"permission_denied",
|
|
534
|
+
"not_found",
|
|
535
|
+
"unknown",
|
|
536
|
+
];
|
|
537
|
+
return valid.includes(category);
|
|
538
|
+
}
|
|
539
|
+
/**
|
|
540
|
+
* Normalize model name with strict sanitization.
|
|
541
|
+
* SECURITY: Only allows alphanumeric, dots, hyphens to prevent data injection.
|
|
542
|
+
* Attacker-controlled model names could otherwise leak sensitive data to Tier 2.
|
|
543
|
+
*/
|
|
544
|
+
normalizeModel(model) {
|
|
545
|
+
// Defensive string coercion - handles objects with toString()
|
|
546
|
+
if (model == null)
|
|
547
|
+
return "unknown";
|
|
548
|
+
const modelStr = typeof model === "string" ? model : String(model);
|
|
549
|
+
// Strict allowlist: alphanumeric, dots, hyphens only
|
|
550
|
+
const sanitized = modelStr
|
|
551
|
+
.toLowerCase()
|
|
552
|
+
.replace(/[^a-z0-9.-]/g, "")
|
|
553
|
+
.slice(0, 64);
|
|
554
|
+
// Remove date version suffixes for cardinality control
|
|
555
|
+
return sanitized.replace(/[-_]?\d{4}[-_]?\d{2}[-_]?\d{2}$/, "") || "unknown";
|
|
556
|
+
}
|
|
557
|
+
/**
|
|
558
|
+
* Normalize tool name with strict sanitization.
|
|
559
|
+
* SECURITY: Only allows alphanumeric, underscores, hyphens to prevent data injection.
|
|
560
|
+
* Attacker-controlled tool names could otherwise leak sensitive data to Tier 2.
|
|
561
|
+
*/
|
|
562
|
+
normalizeToolName(toolName) {
|
|
563
|
+
// Defensive string coercion - handles objects with toString()
|
|
564
|
+
if (toolName == null)
|
|
565
|
+
return "unknown";
|
|
566
|
+
const toolStr = typeof toolName === "string" ? toolName : String(toolName);
|
|
567
|
+
return (toolStr
|
|
568
|
+
.toLowerCase()
|
|
569
|
+
.replace(/[^a-z0-9_-]/g, "_")
|
|
570
|
+
.replace(/_+/g, "_") // Collapse multiple underscores
|
|
571
|
+
.replace(/^_|_$/g, "") // Trim leading/trailing
|
|
572
|
+
.slice(0, 50) || "unknown");
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Get span duration in milliseconds, clamped to non-negative.
|
|
576
|
+
* Handles clock skew or corrupted data gracefully.
|
|
577
|
+
*/
|
|
578
|
+
getDurationMs(span) {
|
|
579
|
+
const [startSecs, startNanos] = span.startTime;
|
|
580
|
+
const [endSecs, endNanos] = span.endTime;
|
|
581
|
+
const durationMs = (endSecs - startSecs) * 1000 + (endNanos - startNanos) / 1e6;
|
|
582
|
+
return Math.max(0, durationMs);
|
|
583
|
+
}
|
|
584
|
+
/**
|
|
585
|
+
* Validate error category is in the allowed enum.
|
|
586
|
+
*/
|
|
587
|
+
isValidErrorCategory(category) {
|
|
588
|
+
const valid = [
|
|
589
|
+
"none",
|
|
590
|
+
"rate_limit",
|
|
591
|
+
"context_length",
|
|
592
|
+
"content_filter",
|
|
593
|
+
"quota",
|
|
594
|
+
"network",
|
|
595
|
+
"timeout",
|
|
596
|
+
"auth_error",
|
|
597
|
+
"api_error",
|
|
598
|
+
"validation_error",
|
|
599
|
+
"aborted",
|
|
600
|
+
"unknown",
|
|
601
|
+
];
|
|
602
|
+
return valid.includes(category);
|
|
603
|
+
}
|
|
604
|
+
/**
|
|
605
|
+
* Validate finish reason is in the allowed enum.
|
|
606
|
+
*/
|
|
607
|
+
isValidFinishReason(reason) {
|
|
608
|
+
const valid = [
|
|
609
|
+
"stop",
|
|
610
|
+
"length",
|
|
611
|
+
"content_filter",
|
|
612
|
+
"tool_calls",
|
|
613
|
+
"error",
|
|
614
|
+
];
|
|
615
|
+
return valid.includes(reason);
|
|
616
|
+
}
|
|
617
|
+
/**
|
|
618
|
+
* Estimate cost based on model and token counts.
|
|
619
|
+
* Uses rough estimates - actual costs should be calculated server-side.
|
|
620
|
+
*/
|
|
621
|
+
estimateCost(model, inputTokens, outputTokens) {
|
|
622
|
+
const pricing = this.pricing.get(model) || this.pricing.get("default");
|
|
623
|
+
if (!pricing)
|
|
624
|
+
return 0;
|
|
625
|
+
return inputTokens * pricing.input + outputTokens * pricing.output;
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Get default pricing per 1000 tokens (in USD).
|
|
629
|
+
*/
|
|
630
|
+
getDefaultPricing() {
|
|
631
|
+
return new Map([
|
|
632
|
+
// OpenAI
|
|
633
|
+
["gpt-4", { input: 0.00003, output: 0.00006 }],
|
|
634
|
+
["gpt-4-turbo", { input: 0.00001, output: 0.00003 }],
|
|
635
|
+
["gpt-4o", { input: 0.000005, output: 0.000015 }],
|
|
636
|
+
["gpt-4o-mini", { input: 0.00000015, output: 0.0000006 }],
|
|
637
|
+
["gpt-3.5-turbo", { input: 0.0000005, output: 0.0000015 }],
|
|
638
|
+
// Anthropic
|
|
639
|
+
["claude-3-opus", { input: 0.000015, output: 0.000075 }],
|
|
640
|
+
["claude-3-sonnet", { input: 0.000003, output: 0.000015 }],
|
|
641
|
+
["claude-3-haiku", { input: 0.00000025, output: 0.00000125 }],
|
|
642
|
+
["claude-3.5-sonnet", { input: 0.000003, output: 0.000015 }],
|
|
643
|
+
["claude-sonnet", { input: 0.000003, output: 0.000015 }],
|
|
644
|
+
// Default fallback
|
|
645
|
+
["default", { input: 0.000001, output: 0.000003 }],
|
|
646
|
+
]);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
exports.LLMObsTier2Summarizer = LLMObsTier2Summarizer;
|
|
650
|
+
//# sourceMappingURL=tier2-summarizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tier2-summarizer.js","sourceRoot":"","sources":["../../src/llmobs/tier2-summarizer.ts"],"names":[],"mappings":"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"}
|