@sentry/warden 0.8.0 → 0.9.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/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +10 -1
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output/formatters.d.ts.map +1 -1
- package/dist/cli/output/formatters.js +3 -8
- package/dist/cli/output/formatters.js.map +1 -1
- package/dist/output/github-checks.d.ts.map +1 -1
- package/dist/output/github-checks.js +1 -2
- package/dist/output/github-checks.js.map +1 -1
- package/dist/sdk/analyze.d.ts.map +1 -1
- package/dist/sdk/analyze.js +92 -10
- package/dist/sdk/analyze.js.map +1 -1
- package/dist/sdk/extract.d.ts +1 -1
- package/dist/sdk/extract.d.ts.map +1 -1
- package/dist/sdk/extract.js +48 -31
- package/dist/sdk/extract.js.map +1 -1
- package/dist/sdk/haiku.d.ts +20 -0
- package/dist/sdk/haiku.d.ts.map +1 -1
- package/dist/sdk/haiku.js +159 -77
- package/dist/sdk/haiku.js.map +1 -1
- package/dist/sdk/pricing.d.ts +5 -0
- package/dist/sdk/pricing.d.ts.map +1 -1
- package/dist/sdk/pricing.js +11 -2
- package/dist/sdk/pricing.js.map +1 -1
- package/dist/sdk/usage.d.ts +5 -0
- package/dist/sdk/usage.d.ts.map +1 -1
- package/dist/sdk/usage.js +11 -3
- package/dist/sdk/usage.js.map +1 -1
- package/dist/triggers/matcher.d.ts +2 -2
- package/dist/triggers/matcher.d.ts.map +1 -1
- package/dist/triggers/matcher.js +10 -8
- package/dist/triggers/matcher.js.map +1 -1
- package/package.json +1 -1
- package/plugins/warden/skills/warden/references/config-schema.md +4 -2
- package/plugins/warden/skills/warden/references/configuration.md +2 -2
package/dist/sdk/extract.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import Anthropic from '@anthropic-ai/sdk';
|
|
2
2
|
import { customAlphabet } from 'nanoid';
|
|
3
3
|
import { FindingSchema } from '../types/index.js';
|
|
4
|
+
import { Sentry } from '../sentry.js';
|
|
5
|
+
import { HAIKU_MODEL, setGenAiResponseAttrs } from './haiku.js';
|
|
4
6
|
import { apiUsageToStats } from './pricing.js';
|
|
5
7
|
/** Pattern to match the start of findings JSON (allows whitespace after brace) */
|
|
6
8
|
export const FINDINGS_JSON_START = /\{\s*"findings"/;
|
|
@@ -101,6 +103,8 @@ export function extractFindingsJson(rawText) {
|
|
|
101
103
|
}
|
|
102
104
|
/** Max characters to send to LLM fallback (roughly ~8k tokens) */
|
|
103
105
|
const LLM_FALLBACK_MAX_CHARS = 32000;
|
|
106
|
+
/** Max tokens for LLM fallback responses */
|
|
107
|
+
const LLM_FALLBACK_MAX_TOKENS = 4096;
|
|
104
108
|
/** Timeout for LLM fallback API calls in milliseconds */
|
|
105
109
|
const LLM_FALLBACK_TIMEOUT_MS = 30000;
|
|
106
110
|
/**
|
|
@@ -130,7 +134,7 @@ export function truncateForLLMFallback(rawText, maxChars) {
|
|
|
130
134
|
}
|
|
131
135
|
/**
|
|
132
136
|
* Extract findings from malformed output using LLM as a fallback.
|
|
133
|
-
* Uses
|
|
137
|
+
* Uses Haiku for lightweight, fast extraction.
|
|
134
138
|
*/
|
|
135
139
|
export async function extractFindingsWithLLM(rawText, apiKey) {
|
|
136
140
|
if (!apiKey) {
|
|
@@ -150,45 +154,58 @@ export async function extractFindingsWithLLM(rawText, apiKey) {
|
|
|
150
154
|
}
|
|
151
155
|
// Truncate input while preserving JSON boundaries
|
|
152
156
|
const truncatedText = truncateForLLMFallback(rawText, LLM_FALLBACK_MAX_CHARS);
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
157
|
+
return Sentry.startSpan({
|
|
158
|
+
op: 'gen_ai.chat',
|
|
159
|
+
name: `chat ${HAIKU_MODEL}`,
|
|
160
|
+
attributes: {
|
|
161
|
+
'gen_ai.operation.name': 'chat',
|
|
162
|
+
'gen_ai.provider.name': 'anthropic',
|
|
163
|
+
'gen_ai.request.model': HAIKU_MODEL,
|
|
164
|
+
'gen_ai.request.max_tokens': LLM_FALLBACK_MAX_TOKENS,
|
|
165
|
+
},
|
|
166
|
+
}, async (span) => {
|
|
167
|
+
try {
|
|
168
|
+
const client = new Anthropic({ apiKey, timeout: LLM_FALLBACK_TIMEOUT_MS });
|
|
169
|
+
const userContent = `Extract the findings JSON from this model output.
|
|
162
170
|
Return ONLY valid JSON in format: {"findings": [...]}
|
|
163
171
|
If no findings exist, return: {"findings": []}
|
|
164
172
|
|
|
165
173
|
Model output:
|
|
166
|
-
${truncatedText}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
174
|
+
${truncatedText}`;
|
|
175
|
+
const messages = [
|
|
176
|
+
{ role: 'user', content: userContent },
|
|
177
|
+
];
|
|
178
|
+
span.setAttribute('gen_ai.request.messages', JSON.stringify(messages));
|
|
179
|
+
const response = await client.messages.create({
|
|
180
|
+
model: HAIKU_MODEL,
|
|
181
|
+
max_tokens: LLM_FALLBACK_MAX_TOKENS,
|
|
182
|
+
messages,
|
|
183
|
+
});
|
|
184
|
+
const usage = apiUsageToStats(HAIKU_MODEL, response.usage);
|
|
185
|
+
const content = response.content[0];
|
|
186
|
+
if (!content || content.type !== 'text') {
|
|
187
|
+
setGenAiResponseAttrs(span, response.usage, response.stop_reason);
|
|
188
|
+
return {
|
|
189
|
+
success: false,
|
|
190
|
+
error: 'llm_unexpected_response',
|
|
191
|
+
preview: rawText.slice(0, 200),
|
|
192
|
+
usage,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
setGenAiResponseAttrs(span, response.usage, response.stop_reason, content.text);
|
|
196
|
+
// Parse the LLM response as JSON
|
|
197
|
+
const result = extractFindingsJson(content.text);
|
|
198
|
+
return { ...result, usage };
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
173
202
|
return {
|
|
174
203
|
success: false,
|
|
175
|
-
error:
|
|
204
|
+
error: `llm_extraction_failed: ${errorMessage}`,
|
|
176
205
|
preview: rawText.slice(0, 200),
|
|
177
|
-
usage,
|
|
178
206
|
};
|
|
179
207
|
}
|
|
180
|
-
|
|
181
|
-
const result = extractFindingsJson(content.text);
|
|
182
|
-
return { ...result, usage };
|
|
183
|
-
}
|
|
184
|
-
catch (error) {
|
|
185
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
186
|
-
return {
|
|
187
|
-
success: false,
|
|
188
|
-
error: `llm_extraction_failed: ${errorMessage}`,
|
|
189
|
-
preview: rawText.slice(0, 200),
|
|
190
|
-
};
|
|
191
|
-
}
|
|
208
|
+
});
|
|
192
209
|
}
|
|
193
210
|
/** Unambiguous uppercase alphanumeric alphabet (no O/0, I/1). */
|
|
194
211
|
const SHORT_ID_ALPHABET = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789';
|
package/dist/sdk/extract.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/sdk/extract.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/sdk/extract.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/haiku.d.ts
CHANGED
|
@@ -1,6 +1,25 @@
|
|
|
1
1
|
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import type { Span } from '@sentry/node';
|
|
2
3
|
import type { z } from 'zod';
|
|
3
4
|
import type { UsageStats } from '../types/index.js';
|
|
5
|
+
export declare const HAIKU_MODEL = "claude-haiku-4-5";
|
|
6
|
+
/**
|
|
7
|
+
* Anthropic Messages API usage shape accepted by setGenAiResponseAttrs.
|
|
8
|
+
*/
|
|
9
|
+
interface ApiResponseUsage {
|
|
10
|
+
input_tokens: number;
|
|
11
|
+
output_tokens: number;
|
|
12
|
+
cache_read_input_tokens?: number | null;
|
|
13
|
+
cache_creation_input_tokens?: number | null;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Set standard gen_ai response attributes on a Sentry span.
|
|
17
|
+
*
|
|
18
|
+
* Follows the same token accounting as analyze.ts: gen_ai.usage.input_tokens
|
|
19
|
+
* is the total (non-cached + cache_read + cache_creation), with cache fields
|
|
20
|
+
* as subsets.
|
|
21
|
+
*/
|
|
22
|
+
export declare function setGenAiResponseAttrs(span: Span, usage: ApiResponseUsage, stopReason?: string | null, responseText?: string): void;
|
|
4
23
|
/**
|
|
5
24
|
* Extract the first JSON object or array from LLM text.
|
|
6
25
|
* Handles markdown code fences and prose before/after JSON.
|
|
@@ -52,4 +71,5 @@ export interface CallHaikuWithToolsOptions<T> {
|
|
|
52
71
|
* Accumulates usage across all iterations.
|
|
53
72
|
*/
|
|
54
73
|
export declare function callHaikuWithTools<T>(options: CallHaikuWithToolsOptions<T>): Promise<HaikuResult<T>>;
|
|
74
|
+
export {};
|
|
55
75
|
//# sourceMappingURL=haiku.d.ts.map
|
package/dist/sdk/haiku.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"haiku.d.ts","sourceRoot":"","sources":["../../src/sdk/haiku.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"haiku.d.ts","sourceRoot":"","sources":["../../src/sdk/haiku.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAKpD,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAI9C;;GAEG;AACH,UAAU,gBAAgB;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,gBAAgB,EACvB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,EAC1B,YAAY,CAAC,EAAE,MAAM,GACpB,IAAI,CAeN;AAUD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CA6CvD;AAED;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,IACrB;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,GAC7C;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAA;CAAE,CAAC;AAEzD;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAaD;;;GAGG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAkExF;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB,CAAC,CAAC;IAC1C,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;IACxB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAoJ1G"}
|
package/dist/sdk/haiku.js
CHANGED
|
@@ -1,9 +1,33 @@
|
|
|
1
1
|
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import { Sentry } from '../sentry.js';
|
|
2
3
|
import { apiUsageToStats } from './pricing.js';
|
|
3
4
|
import { aggregateUsage, emptyUsage } from './usage.js';
|
|
4
|
-
const HAIKU_MODEL = 'claude-haiku-4-5';
|
|
5
|
+
export const HAIKU_MODEL = 'claude-haiku-4-5';
|
|
5
6
|
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
6
7
|
const DEFAULT_MAX_TOKENS = 4096;
|
|
8
|
+
/**
|
|
9
|
+
* Set standard gen_ai response attributes on a Sentry span.
|
|
10
|
+
*
|
|
11
|
+
* Follows the same token accounting as analyze.ts: gen_ai.usage.input_tokens
|
|
12
|
+
* is the total (non-cached + cache_read + cache_creation), with cache fields
|
|
13
|
+
* as subsets.
|
|
14
|
+
*/
|
|
15
|
+
export function setGenAiResponseAttrs(span, usage, stopReason, responseText) {
|
|
16
|
+
const cacheRead = usage.cache_read_input_tokens ?? 0;
|
|
17
|
+
const cacheWrite = usage.cache_creation_input_tokens ?? 0;
|
|
18
|
+
const totalInput = usage.input_tokens + cacheRead + cacheWrite;
|
|
19
|
+
span.setAttribute('gen_ai.usage.input_tokens', totalInput);
|
|
20
|
+
span.setAttribute('gen_ai.usage.output_tokens', usage.output_tokens);
|
|
21
|
+
span.setAttribute('gen_ai.usage.input_tokens.cached', cacheRead);
|
|
22
|
+
span.setAttribute('gen_ai.usage.input_tokens.cache_write', cacheWrite);
|
|
23
|
+
span.setAttribute('gen_ai.usage.total_tokens', totalInput + usage.output_tokens);
|
|
24
|
+
if (stopReason) {
|
|
25
|
+
span.setAttribute('gen_ai.response.finish_reasons', [stopReason]);
|
|
26
|
+
}
|
|
27
|
+
if (responseText !== undefined) {
|
|
28
|
+
span.setAttribute('gen_ai.response.text', JSON.stringify([responseText]));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
7
31
|
/**
|
|
8
32
|
* Strip markdown code fences from text.
|
|
9
33
|
*/
|
|
@@ -77,44 +101,58 @@ function inferPrefill(schema) {
|
|
|
77
101
|
*/
|
|
78
102
|
export async function callHaiku(options) {
|
|
79
103
|
const { apiKey, prompt, schema, maxTokens = DEFAULT_MAX_TOKENS, timeout = DEFAULT_TIMEOUT_MS } = options;
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const content = response.content[0];
|
|
96
|
-
if (!content || content.type !== 'text') {
|
|
97
|
-
return { success: false, error: 'Empty response from model', usage };
|
|
98
|
-
}
|
|
99
|
-
let fullText = content.text;
|
|
104
|
+
return Sentry.startSpan({
|
|
105
|
+
op: 'gen_ai.chat',
|
|
106
|
+
name: `chat ${HAIKU_MODEL}`,
|
|
107
|
+
attributes: {
|
|
108
|
+
'gen_ai.operation.name': 'chat',
|
|
109
|
+
'gen_ai.provider.name': 'anthropic',
|
|
110
|
+
'gen_ai.request.model': HAIKU_MODEL,
|
|
111
|
+
'gen_ai.request.max_tokens': maxTokens,
|
|
112
|
+
},
|
|
113
|
+
}, async (span) => {
|
|
114
|
+
const client = new Anthropic({ apiKey, timeout });
|
|
115
|
+
const prefill = inferPrefill(schema);
|
|
116
|
+
const messages = [
|
|
117
|
+
{ role: 'user', content: prompt },
|
|
118
|
+
];
|
|
100
119
|
if (prefill) {
|
|
101
|
-
|
|
120
|
+
messages.push({ role: 'assistant', content: prefill });
|
|
102
121
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
122
|
+
span.setAttribute('gen_ai.request.messages', JSON.stringify(messages));
|
|
123
|
+
try {
|
|
124
|
+
const response = await client.messages.create({
|
|
125
|
+
model: HAIKU_MODEL,
|
|
126
|
+
max_tokens: maxTokens,
|
|
127
|
+
messages,
|
|
128
|
+
});
|
|
129
|
+
const usage = apiUsageToStats(HAIKU_MODEL, response.usage);
|
|
130
|
+
const content = response.content[0];
|
|
131
|
+
if (!content || content.type !== 'text') {
|
|
132
|
+
setGenAiResponseAttrs(span, response.usage, response.stop_reason);
|
|
133
|
+
return { success: false, error: 'Empty response from model', usage };
|
|
134
|
+
}
|
|
135
|
+
let fullText = content.text;
|
|
136
|
+
if (prefill) {
|
|
137
|
+
fullText = prefill + fullText;
|
|
138
|
+
}
|
|
139
|
+
setGenAiResponseAttrs(span, response.usage, response.stop_reason, fullText);
|
|
140
|
+
const jsonStr = extractJson(fullText);
|
|
141
|
+
if (!jsonStr) {
|
|
142
|
+
return { success: false, error: 'No JSON found in response', usage };
|
|
143
|
+
}
|
|
144
|
+
const parsed = JSON.parse(jsonStr);
|
|
145
|
+
const validated = schema.safeParse(parsed);
|
|
146
|
+
if (!validated.success) {
|
|
147
|
+
return { success: false, error: `Validation failed: ${validated.error.message}`, usage };
|
|
148
|
+
}
|
|
149
|
+
return { success: true, data: validated.data, usage };
|
|
106
150
|
}
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
return { success: false, error: `Validation failed: ${validated.error.message}`, usage };
|
|
151
|
+
catch (error) {
|
|
152
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
153
|
+
return { success: false, error: message, usage: emptyUsage() };
|
|
111
154
|
}
|
|
112
|
-
|
|
113
|
-
}
|
|
114
|
-
catch (error) {
|
|
115
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
116
|
-
return { success: false, error: message, usage: emptyUsage() };
|
|
117
|
-
}
|
|
155
|
+
});
|
|
118
156
|
}
|
|
119
157
|
/**
|
|
120
158
|
* Multi-turn Haiku call with tool use loop.
|
|
@@ -123,55 +161,98 @@ export async function callHaiku(options) {
|
|
|
123
161
|
*/
|
|
124
162
|
export async function callHaikuWithTools(options) {
|
|
125
163
|
const { apiKey, prompt, schema, tools, executeTool, maxTokens = DEFAULT_MAX_TOKENS, maxIterations = 5, timeout = DEFAULT_TIMEOUT_MS, } = options;
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
164
|
+
return Sentry.startSpan({
|
|
165
|
+
op: 'gen_ai.chat',
|
|
166
|
+
name: `chat ${HAIKU_MODEL}`,
|
|
167
|
+
attributes: {
|
|
168
|
+
'gen_ai.operation.name': 'chat',
|
|
169
|
+
'gen_ai.provider.name': 'anthropic',
|
|
170
|
+
'gen_ai.request.model': HAIKU_MODEL,
|
|
171
|
+
'gen_ai.request.max_tokens': maxTokens,
|
|
172
|
+
},
|
|
173
|
+
}, async (span) => {
|
|
174
|
+
const client = new Anthropic({ apiKey, timeout });
|
|
175
|
+
// No prefill for tool-use loops: prefill biases the model to output JSON
|
|
176
|
+
// immediately instead of calling tools to gather information first.
|
|
177
|
+
const messages = [
|
|
178
|
+
{ role: 'user', content: prompt },
|
|
179
|
+
];
|
|
180
|
+
span.setAttribute('gen_ai.request.messages', JSON.stringify(messages));
|
|
181
|
+
const usages = [];
|
|
182
|
+
// Accumulate raw API usage across iterations so setGenAiResponseAttrs
|
|
183
|
+
// can compute totals consistently (input_tokens + cache subsets).
|
|
184
|
+
const cumulativeUsage = {
|
|
185
|
+
input_tokens: 0,
|
|
186
|
+
output_tokens: 0,
|
|
187
|
+
cache_read_input_tokens: 0,
|
|
188
|
+
cache_creation_input_tokens: 0,
|
|
189
|
+
};
|
|
190
|
+
function setFinalSpanAttrs(stopReason, responseText) {
|
|
191
|
+
setGenAiResponseAttrs(span, cumulativeUsage, stopReason, responseText);
|
|
142
192
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
return { success: false, error: message, usage: usages.length > 0 ? aggregateUsage(usages) : emptyUsage() };
|
|
193
|
+
function currentUsage() {
|
|
194
|
+
return usages.length > 0 ? aggregateUsage(usages) : emptyUsage();
|
|
146
195
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
196
|
+
for (let iteration = 0; iteration < maxIterations; iteration++) {
|
|
197
|
+
let response;
|
|
198
|
+
try {
|
|
199
|
+
response = await client.messages.create({
|
|
200
|
+
model: HAIKU_MODEL,
|
|
201
|
+
max_tokens: maxTokens,
|
|
202
|
+
messages,
|
|
203
|
+
tools,
|
|
204
|
+
});
|
|
153
205
|
}
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
206
|
+
catch (error) {
|
|
207
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
208
|
+
return { success: false, error: message, usage: currentUsage() };
|
|
209
|
+
}
|
|
210
|
+
usages.push(apiUsageToStats(HAIKU_MODEL, response.usage));
|
|
211
|
+
cumulativeUsage.input_tokens += response.usage.input_tokens;
|
|
212
|
+
cumulativeUsage.output_tokens += response.usage.output_tokens;
|
|
213
|
+
cumulativeUsage.cache_read_input_tokens += response.usage.cache_read_input_tokens ?? 0;
|
|
214
|
+
cumulativeUsage.cache_creation_input_tokens += response.usage.cache_creation_input_tokens ?? 0;
|
|
215
|
+
// Handle tool use
|
|
216
|
+
if (response.stop_reason === 'tool_use') {
|
|
217
|
+
const toolUseBlocks = response.content.filter((b) => b.type === 'tool_use');
|
|
218
|
+
if (toolUseBlocks.length === 0) {
|
|
219
|
+
return { success: false, error: 'Tool use indicated but no tool calls found', usage: aggregateUsage(usages) };
|
|
159
220
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
221
|
+
const toolResults = [];
|
|
222
|
+
for (const block of toolUseBlocks) {
|
|
223
|
+
await Sentry.startSpan({
|
|
224
|
+
op: 'gen_ai.execute_tool',
|
|
225
|
+
name: `execute_tool ${block.name}`,
|
|
226
|
+
attributes: {
|
|
227
|
+
'gen_ai.operation.name': 'execute_tool',
|
|
228
|
+
'gen_ai.tool.name': block.name,
|
|
229
|
+
},
|
|
230
|
+
}, async () => {
|
|
231
|
+
try {
|
|
232
|
+
const result = await executeTool(block.name, block.input);
|
|
233
|
+
toolResults.push({ type: 'tool_result', tool_use_id: block.id, content: result });
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
const errMsg = error instanceof Error ? error.message : String(error);
|
|
237
|
+
toolResults.push({ type: 'tool_result', tool_use_id: block.id, content: errMsg, is_error: true });
|
|
238
|
+
}
|
|
239
|
+
});
|
|
163
240
|
}
|
|
241
|
+
messages.push({ role: 'assistant', content: response.content });
|
|
242
|
+
messages.push({ role: 'user', content: toolResults });
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
// Final response - extract text and set span attributes
|
|
246
|
+
if (response.stop_reason !== 'end_turn' && response.stop_reason !== 'max_tokens') {
|
|
247
|
+
setFinalSpanAttrs(response.stop_reason);
|
|
248
|
+
return { success: false, error: `Unexpected stop reason: ${response.stop_reason}`, usage: aggregateUsage(usages) };
|
|
164
249
|
}
|
|
165
|
-
messages.push({ role: 'assistant', content: response.content });
|
|
166
|
-
messages.push({ role: 'user', content: toolResults });
|
|
167
|
-
continue;
|
|
168
|
-
}
|
|
169
|
-
// Final response - extract JSON verdict
|
|
170
|
-
if (response.stop_reason === 'end_turn' || response.stop_reason === 'max_tokens') {
|
|
171
250
|
const textBlock = response.content.find((b) => b.type === 'text');
|
|
172
251
|
if (!textBlock) {
|
|
252
|
+
setFinalSpanAttrs(response.stop_reason);
|
|
173
253
|
return { success: false, error: 'No text in final response', usage: aggregateUsage(usages) };
|
|
174
254
|
}
|
|
255
|
+
setFinalSpanAttrs(response.stop_reason, textBlock.text);
|
|
175
256
|
const jsonStr = extractJson(textBlock.text);
|
|
176
257
|
if (!jsonStr) {
|
|
177
258
|
return { success: false, error: 'No JSON found in response', usage: aggregateUsage(usages) };
|
|
@@ -183,8 +264,9 @@ export async function callHaikuWithTools(options) {
|
|
|
183
264
|
}
|
|
184
265
|
return { success: true, data: validated.data, usage: aggregateUsage(usages) };
|
|
185
266
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
267
|
+
// Max iterations exceeded - still record usage on span
|
|
268
|
+
setFinalSpanAttrs();
|
|
269
|
+
return { success: false, error: 'Max tool iterations exceeded', usage: aggregateUsage(usages) };
|
|
270
|
+
});
|
|
189
271
|
}
|
|
190
272
|
//# sourceMappingURL=haiku.js.map
|
package/dist/sdk/haiku.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"haiku.js","sourceRoot":"","sources":["../../src/sdk/haiku.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"haiku.js","sourceRoot":"","sources":["../../src/sdk/haiku.ts"],"names":[],"mappings":"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"}
|
package/dist/sdk/pricing.d.ts
CHANGED
|
@@ -11,6 +11,11 @@ interface ApiUsage {
|
|
|
11
11
|
/**
|
|
12
12
|
* Convert Anthropic API usage to our UsageStats format.
|
|
13
13
|
* Calculates cost from token counts using model pricing.
|
|
14
|
+
*
|
|
15
|
+
* The Anthropic API reports `input_tokens` as only the non-cached portion.
|
|
16
|
+
* We normalize so that `inputTokens` is the *total* input tokens
|
|
17
|
+
* (non-cached + cache_read + cache_creation), with the cache fields
|
|
18
|
+
* being subsets of that total.
|
|
14
19
|
*/
|
|
15
20
|
export declare function apiUsageToStats(model: string, usage: ApiUsage): UsageStats;
|
|
16
21
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/sdk/pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA+BpD;;GAEG;AACH,UAAU,QAAQ;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED
|
|
1
|
+
{"version":3,"file":"pricing.d.ts","sourceRoot":"","sources":["../../src/sdk/pricing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA+BpD;;GAEG;AACH,UAAU,QAAQ;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,2BAA2B,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7C;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,UAAU,CA6B1E"}
|
package/dist/sdk/pricing.js
CHANGED
|
@@ -15,17 +15,26 @@ const MODEL_PRICING = Object.fromEntries(Object.entries(rawPricing).map(([id, p]
|
|
|
15
15
|
/**
|
|
16
16
|
* Convert Anthropic API usage to our UsageStats format.
|
|
17
17
|
* Calculates cost from token counts using model pricing.
|
|
18
|
+
*
|
|
19
|
+
* The Anthropic API reports `input_tokens` as only the non-cached portion.
|
|
20
|
+
* We normalize so that `inputTokens` is the *total* input tokens
|
|
21
|
+
* (non-cached + cache_read + cache_creation), with the cache fields
|
|
22
|
+
* being subsets of that total.
|
|
18
23
|
*/
|
|
19
24
|
export function apiUsageToStats(model, usage) {
|
|
20
25
|
const pricing = MODEL_PRICING[model];
|
|
21
|
-
const inputTokens = usage.input_tokens;
|
|
22
26
|
const outputTokens = usage.output_tokens;
|
|
23
27
|
const cacheReadInputTokens = usage.cache_read_input_tokens ?? 0;
|
|
24
28
|
const cacheCreationInputTokens = usage.cache_creation_input_tokens ?? 0;
|
|
29
|
+
// inputTokens is the total: raw API input_tokens + cache subsets.
|
|
30
|
+
const inputTokens = usage.input_tokens + cacheReadInputTokens + cacheCreationInputTokens;
|
|
31
|
+
// Cost: deduct cache subsets from total to get the non-cached portion,
|
|
32
|
+
// then charge each category at its respective rate.
|
|
25
33
|
let costUSD = 0;
|
|
26
34
|
if (pricing) {
|
|
35
|
+
const freshInputTokens = inputTokens - cacheReadInputTokens - cacheCreationInputTokens;
|
|
27
36
|
costUSD =
|
|
28
|
-
|
|
37
|
+
freshInputTokens * pricing.inputPerToken +
|
|
29
38
|
outputTokens * pricing.outputPerToken +
|
|
30
39
|
cacheReadInputTokens * pricing.cacheReadPerToken +
|
|
31
40
|
cacheCreationInputTokens * pricing.cacheCreationPerToken;
|
package/dist/sdk/pricing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/sdk/pricing.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,sBAAsB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAcpE;;;GAGG;AACH,MAAM,aAAa,GAAiC,MAAM,CAAC,WAAW,CACpE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IAC1C,EAAE;IACF;QACE,aAAa,EAAE,CAAC,CAAC,YAAY,GAAG,SAAS;QACzC,cAAc,EAAE,CAAC,CAAC,aAAa,GAAG,SAAS;QAC3C,iBAAiB,EAAE,CAAC,CAAC,gBAAgB,GAAG,SAAS;QACjD,qBAAqB,EAAE,CAAC,CAAC,iBAAiB,GAAG,SAAS;KACvD;CACF,CAAC,CACH,CAAC;AAYF
|
|
1
|
+
{"version":3,"file":"pricing.js","sourceRoot":"","sources":["../../src/sdk/pricing.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,sBAAsB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAcpE;;;GAGG;AACH,MAAM,aAAa,GAAiC,MAAM,CAAC,WAAW,CACpE,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;IAC1C,EAAE;IACF;QACE,aAAa,EAAE,CAAC,CAAC,YAAY,GAAG,SAAS;QACzC,cAAc,EAAE,CAAC,CAAC,aAAa,GAAG,SAAS;QAC3C,iBAAiB,EAAE,CAAC,CAAC,gBAAgB,GAAG,SAAS;QACjD,qBAAqB,EAAE,CAAC,CAAC,iBAAiB,GAAG,SAAS;KACvD;CACF,CAAC,CACH,CAAC;AAYF;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,KAAe;IAC5D,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAErC,MAAM,YAAY,GAAG,KAAK,CAAC,aAAa,CAAC;IACzC,MAAM,oBAAoB,GAAG,KAAK,CAAC,uBAAuB,IAAI,CAAC,CAAC;IAChE,MAAM,wBAAwB,GAAG,KAAK,CAAC,2BAA2B,IAAI,CAAC,CAAC;IAExE,kEAAkE;IAClE,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,GAAG,oBAAoB,GAAG,wBAAwB,CAAC;IAEzF,uEAAuE;IACvE,oDAAoD;IACpD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,gBAAgB,GAAG,WAAW,GAAG,oBAAoB,GAAG,wBAAwB,CAAC;QACvF,OAAO;YACL,gBAAgB,GAAG,OAAO,CAAC,aAAa;gBACxC,YAAY,GAAG,OAAO,CAAC,cAAc;gBACrC,oBAAoB,GAAG,OAAO,CAAC,iBAAiB;gBAChD,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAC7D,CAAC;IAED,OAAO;QACL,WAAW;QACX,YAAY;QACZ,oBAAoB;QACpB,wBAAwB;QACxB,OAAO;KACR,CAAC;AACJ,CAAC"}
|
package/dist/sdk/usage.d.ts
CHANGED
|
@@ -3,6 +3,11 @@ import type { UsageStats, AuxiliaryUsageMap } from '../types/index.js';
|
|
|
3
3
|
import type { AuxiliaryUsageEntry } from './types.js';
|
|
4
4
|
/**
|
|
5
5
|
* Extract usage stats from an SDK result message.
|
|
6
|
+
*
|
|
7
|
+
* The Anthropic API reports `input_tokens` as only the non-cached portion.
|
|
8
|
+
* We normalize so that `inputTokens` is the *total* input tokens
|
|
9
|
+
* (non-cached + cache_read + cache_creation), with the cache fields
|
|
10
|
+
* being subsets of that total.
|
|
6
11
|
*/
|
|
7
12
|
export declare function extractUsage(result: SDKResultMessage): UsageStats;
|
|
8
13
|
/**
|
package/dist/sdk/usage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/sdk/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/sdk/usage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,gBAAgB,GAAG,UAAU,CAWjE;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,UAAU,CAQvC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAW/D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,mBAAmB,EAAE,GAC7B,iBAAiB,GAAG,SAAS,CAoB/B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,CAAC,EAAE,iBAAiB,GAAG,SAAS,EAChC,CAAC,EAAE,iBAAiB,GAAG,SAAS,GAC/B,iBAAiB,GAAG,SAAS,CAa/B;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEpD"}
|
package/dist/sdk/usage.js
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Extract usage stats from an SDK result message.
|
|
3
|
+
*
|
|
4
|
+
* The Anthropic API reports `input_tokens` as only the non-cached portion.
|
|
5
|
+
* We normalize so that `inputTokens` is the *total* input tokens
|
|
6
|
+
* (non-cached + cache_read + cache_creation), with the cache fields
|
|
7
|
+
* being subsets of that total.
|
|
3
8
|
*/
|
|
4
9
|
export function extractUsage(result) {
|
|
10
|
+
const rawInput = result.usage['input_tokens'];
|
|
11
|
+
const cacheRead = result.usage['cache_read_input_tokens'] ?? 0;
|
|
12
|
+
const cacheCreation = result.usage['cache_creation_input_tokens'] ?? 0;
|
|
5
13
|
return {
|
|
6
|
-
inputTokens:
|
|
14
|
+
inputTokens: rawInput + cacheRead + cacheCreation,
|
|
7
15
|
outputTokens: result.usage['output_tokens'],
|
|
8
|
-
cacheReadInputTokens:
|
|
9
|
-
cacheCreationInputTokens:
|
|
16
|
+
cacheReadInputTokens: cacheRead,
|
|
17
|
+
cacheCreationInputTokens: cacheCreation,
|
|
10
18
|
costUSD: result.total_cost_usd,
|
|
11
19
|
};
|
|
12
20
|
}
|