ai-sdk-anthropic 0.0.3 → 1.0.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/index.js +364 -4
- package/package.json +8 -2
package/dist/index.js
CHANGED
|
@@ -3,12 +3,356 @@ import {
|
|
|
3
3
|
createAnthropic as createAnthropicBase,
|
|
4
4
|
VERSION
|
|
5
5
|
} from "@ai-sdk/anthropic";
|
|
6
|
+
|
|
7
|
+
// node_modules/@ai-sdk/provider/dist/index.mjs
|
|
8
|
+
var marker = "vercel.ai.error";
|
|
9
|
+
var symbol = Symbol.for(marker);
|
|
10
|
+
var _a;
|
|
11
|
+
var _b;
|
|
12
|
+
var AISDKError = class _AISDKError extends (_b = Error, _a = symbol, _b) {
|
|
13
|
+
/**
|
|
14
|
+
* Creates an AI SDK Error.
|
|
15
|
+
*
|
|
16
|
+
* @param {Object} params - The parameters for creating the error.
|
|
17
|
+
* @param {string} params.name - The name of the error.
|
|
18
|
+
* @param {string} params.message - The error message.
|
|
19
|
+
* @param {unknown} [params.cause] - The underlying cause of the error.
|
|
20
|
+
*/
|
|
21
|
+
constructor({
|
|
22
|
+
name: name14,
|
|
23
|
+
message,
|
|
24
|
+
cause
|
|
25
|
+
}) {
|
|
26
|
+
super(message);
|
|
27
|
+
this[_a] = true;
|
|
28
|
+
this.name = name14;
|
|
29
|
+
this.cause = cause;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Checks if the given error is an AI SDK Error.
|
|
33
|
+
* @param {unknown} error - The error to check.
|
|
34
|
+
* @returns {boolean} True if the error is an AI SDK Error, false otherwise.
|
|
35
|
+
*/
|
|
36
|
+
static isInstance(error) {
|
|
37
|
+
return _AISDKError.hasMarker(error, marker);
|
|
38
|
+
}
|
|
39
|
+
static hasMarker(error, marker15) {
|
|
40
|
+
const markerSymbol = Symbol.for(marker15);
|
|
41
|
+
return error != null && typeof error === "object" && markerSymbol in error && typeof error[markerSymbol] === "boolean" && error[markerSymbol] === true;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
var name = "AI_APICallError";
|
|
45
|
+
var marker2 = `vercel.ai.error.${name}`;
|
|
46
|
+
var symbol2 = Symbol.for(marker2);
|
|
47
|
+
var _a2;
|
|
48
|
+
var _b2;
|
|
49
|
+
var APICallError = class extends (_b2 = AISDKError, _a2 = symbol2, _b2) {
|
|
50
|
+
constructor({
|
|
51
|
+
message,
|
|
52
|
+
url,
|
|
53
|
+
requestBodyValues,
|
|
54
|
+
statusCode,
|
|
55
|
+
responseHeaders,
|
|
56
|
+
responseBody,
|
|
57
|
+
cause,
|
|
58
|
+
isRetryable = statusCode != null && (statusCode === 408 || // request timeout
|
|
59
|
+
statusCode === 409 || // conflict
|
|
60
|
+
statusCode === 429 || // too many requests
|
|
61
|
+
statusCode >= 500),
|
|
62
|
+
// server error
|
|
63
|
+
data
|
|
64
|
+
}) {
|
|
65
|
+
super({ name, message, cause });
|
|
66
|
+
this[_a2] = true;
|
|
67
|
+
this.url = url;
|
|
68
|
+
this.requestBodyValues = requestBodyValues;
|
|
69
|
+
this.statusCode = statusCode;
|
|
70
|
+
this.responseHeaders = responseHeaders;
|
|
71
|
+
this.responseBody = responseBody;
|
|
72
|
+
this.isRetryable = isRetryable;
|
|
73
|
+
this.data = data;
|
|
74
|
+
}
|
|
75
|
+
static isInstance(error) {
|
|
76
|
+
return AISDKError.hasMarker(error, marker2);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
var name2 = "AI_EmptyResponseBodyError";
|
|
80
|
+
var marker3 = `vercel.ai.error.${name2}`;
|
|
81
|
+
var symbol3 = Symbol.for(marker3);
|
|
82
|
+
var _a3;
|
|
83
|
+
var _b3;
|
|
84
|
+
var EmptyResponseBodyError = class extends (_b3 = AISDKError, _a3 = symbol3, _b3) {
|
|
85
|
+
// used in isInstance
|
|
86
|
+
constructor({ message = "Empty response body" } = {}) {
|
|
87
|
+
super({ name: name2, message });
|
|
88
|
+
this[_a3] = true;
|
|
89
|
+
}
|
|
90
|
+
static isInstance(error) {
|
|
91
|
+
return AISDKError.hasMarker(error, marker3);
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
function getErrorMessage(error) {
|
|
95
|
+
if (error == null) {
|
|
96
|
+
return "unknown error";
|
|
97
|
+
}
|
|
98
|
+
if (typeof error === "string") {
|
|
99
|
+
return error;
|
|
100
|
+
}
|
|
101
|
+
if (error instanceof Error) {
|
|
102
|
+
return error.message;
|
|
103
|
+
}
|
|
104
|
+
return JSON.stringify(error);
|
|
105
|
+
}
|
|
106
|
+
var name3 = "AI_InvalidArgumentError";
|
|
107
|
+
var marker4 = `vercel.ai.error.${name3}`;
|
|
108
|
+
var symbol4 = Symbol.for(marker4);
|
|
109
|
+
var _a4;
|
|
110
|
+
var _b4;
|
|
111
|
+
var InvalidArgumentError = class extends (_b4 = AISDKError, _a4 = symbol4, _b4) {
|
|
112
|
+
constructor({
|
|
113
|
+
message,
|
|
114
|
+
cause,
|
|
115
|
+
argument
|
|
116
|
+
}) {
|
|
117
|
+
super({ name: name3, message, cause });
|
|
118
|
+
this[_a4] = true;
|
|
119
|
+
this.argument = argument;
|
|
120
|
+
}
|
|
121
|
+
static isInstance(error) {
|
|
122
|
+
return AISDKError.hasMarker(error, marker4);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
var name4 = "AI_InvalidPromptError";
|
|
126
|
+
var marker5 = `vercel.ai.error.${name4}`;
|
|
127
|
+
var symbol5 = Symbol.for(marker5);
|
|
128
|
+
var _a5;
|
|
129
|
+
var _b5;
|
|
130
|
+
var InvalidPromptError = class extends (_b5 = AISDKError, _a5 = symbol5, _b5) {
|
|
131
|
+
constructor({
|
|
132
|
+
prompt,
|
|
133
|
+
message,
|
|
134
|
+
cause
|
|
135
|
+
}) {
|
|
136
|
+
super({ name: name4, message: `Invalid prompt: ${message}`, cause });
|
|
137
|
+
this[_a5] = true;
|
|
138
|
+
this.prompt = prompt;
|
|
139
|
+
}
|
|
140
|
+
static isInstance(error) {
|
|
141
|
+
return AISDKError.hasMarker(error, marker5);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
var name5 = "AI_InvalidResponseDataError";
|
|
145
|
+
var marker6 = `vercel.ai.error.${name5}`;
|
|
146
|
+
var symbol6 = Symbol.for(marker6);
|
|
147
|
+
var _a6;
|
|
148
|
+
var _b6;
|
|
149
|
+
var InvalidResponseDataError = class extends (_b6 = AISDKError, _a6 = symbol6, _b6) {
|
|
150
|
+
constructor({
|
|
151
|
+
data,
|
|
152
|
+
message = `Invalid response data: ${JSON.stringify(data)}.`
|
|
153
|
+
}) {
|
|
154
|
+
super({ name: name5, message });
|
|
155
|
+
this[_a6] = true;
|
|
156
|
+
this.data = data;
|
|
157
|
+
}
|
|
158
|
+
static isInstance(error) {
|
|
159
|
+
return AISDKError.hasMarker(error, marker6);
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
var name6 = "AI_JSONParseError";
|
|
163
|
+
var marker7 = `vercel.ai.error.${name6}`;
|
|
164
|
+
var symbol7 = Symbol.for(marker7);
|
|
165
|
+
var _a7;
|
|
166
|
+
var _b7;
|
|
167
|
+
var JSONParseError = class extends (_b7 = AISDKError, _a7 = symbol7, _b7) {
|
|
168
|
+
constructor({ text, cause }) {
|
|
169
|
+
super({
|
|
170
|
+
name: name6,
|
|
171
|
+
message: `JSON parsing failed: Text: ${text}.
|
|
172
|
+
Error message: ${getErrorMessage(cause)}`,
|
|
173
|
+
cause
|
|
174
|
+
});
|
|
175
|
+
this[_a7] = true;
|
|
176
|
+
this.text = text;
|
|
177
|
+
}
|
|
178
|
+
static isInstance(error) {
|
|
179
|
+
return AISDKError.hasMarker(error, marker7);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
var name7 = "AI_LoadAPIKeyError";
|
|
183
|
+
var marker8 = `vercel.ai.error.${name7}`;
|
|
184
|
+
var symbol8 = Symbol.for(marker8);
|
|
185
|
+
var _a8;
|
|
186
|
+
var _b8;
|
|
187
|
+
var LoadAPIKeyError = class extends (_b8 = AISDKError, _a8 = symbol8, _b8) {
|
|
188
|
+
// used in isInstance
|
|
189
|
+
constructor({ message }) {
|
|
190
|
+
super({ name: name7, message });
|
|
191
|
+
this[_a8] = true;
|
|
192
|
+
}
|
|
193
|
+
static isInstance(error) {
|
|
194
|
+
return AISDKError.hasMarker(error, marker8);
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
var name8 = "AI_LoadSettingError";
|
|
198
|
+
var marker9 = `vercel.ai.error.${name8}`;
|
|
199
|
+
var symbol9 = Symbol.for(marker9);
|
|
200
|
+
var _a9;
|
|
201
|
+
var _b9;
|
|
202
|
+
var LoadSettingError = class extends (_b9 = AISDKError, _a9 = symbol9, _b9) {
|
|
203
|
+
// used in isInstance
|
|
204
|
+
constructor({ message }) {
|
|
205
|
+
super({ name: name8, message });
|
|
206
|
+
this[_a9] = true;
|
|
207
|
+
}
|
|
208
|
+
static isInstance(error) {
|
|
209
|
+
return AISDKError.hasMarker(error, marker9);
|
|
210
|
+
}
|
|
211
|
+
};
|
|
212
|
+
var name9 = "AI_NoContentGeneratedError";
|
|
213
|
+
var marker10 = `vercel.ai.error.${name9}`;
|
|
214
|
+
var symbol10 = Symbol.for(marker10);
|
|
215
|
+
var _a10;
|
|
216
|
+
var _b10;
|
|
217
|
+
var NoContentGeneratedError = class extends (_b10 = AISDKError, _a10 = symbol10, _b10) {
|
|
218
|
+
// used in isInstance
|
|
219
|
+
constructor({
|
|
220
|
+
message = "No content generated."
|
|
221
|
+
} = {}) {
|
|
222
|
+
super({ name: name9, message });
|
|
223
|
+
this[_a10] = true;
|
|
224
|
+
}
|
|
225
|
+
static isInstance(error) {
|
|
226
|
+
return AISDKError.hasMarker(error, marker10);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
var name10 = "AI_NoSuchModelError";
|
|
230
|
+
var marker11 = `vercel.ai.error.${name10}`;
|
|
231
|
+
var symbol11 = Symbol.for(marker11);
|
|
232
|
+
var _a11;
|
|
233
|
+
var _b11;
|
|
234
|
+
var NoSuchModelError = class extends (_b11 = AISDKError, _a11 = symbol11, _b11) {
|
|
235
|
+
constructor({
|
|
236
|
+
errorName = name10,
|
|
237
|
+
modelId,
|
|
238
|
+
modelType,
|
|
239
|
+
message = `No such ${modelType}: ${modelId}`
|
|
240
|
+
}) {
|
|
241
|
+
super({ name: errorName, message });
|
|
242
|
+
this[_a11] = true;
|
|
243
|
+
this.modelId = modelId;
|
|
244
|
+
this.modelType = modelType;
|
|
245
|
+
}
|
|
246
|
+
static isInstance(error) {
|
|
247
|
+
return AISDKError.hasMarker(error, marker11);
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
var name11 = "AI_TooManyEmbeddingValuesForCallError";
|
|
251
|
+
var marker12 = `vercel.ai.error.${name11}`;
|
|
252
|
+
var symbol12 = Symbol.for(marker12);
|
|
253
|
+
var _a12;
|
|
254
|
+
var _b12;
|
|
255
|
+
var TooManyEmbeddingValuesForCallError = class extends (_b12 = AISDKError, _a12 = symbol12, _b12) {
|
|
256
|
+
constructor(options) {
|
|
257
|
+
super({
|
|
258
|
+
name: name11,
|
|
259
|
+
message: `Too many values for a single embedding call. The ${options.provider} model "${options.modelId}" can only embed up to ${options.maxEmbeddingsPerCall} values per call, but ${options.values.length} values were provided.`
|
|
260
|
+
});
|
|
261
|
+
this[_a12] = true;
|
|
262
|
+
this.provider = options.provider;
|
|
263
|
+
this.modelId = options.modelId;
|
|
264
|
+
this.maxEmbeddingsPerCall = options.maxEmbeddingsPerCall;
|
|
265
|
+
this.values = options.values;
|
|
266
|
+
}
|
|
267
|
+
static isInstance(error) {
|
|
268
|
+
return AISDKError.hasMarker(error, marker12);
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
var name12 = "AI_TypeValidationError";
|
|
272
|
+
var marker13 = `vercel.ai.error.${name12}`;
|
|
273
|
+
var symbol13 = Symbol.for(marker13);
|
|
274
|
+
var _a13;
|
|
275
|
+
var _b13;
|
|
276
|
+
var TypeValidationError = class _TypeValidationError extends (_b13 = AISDKError, _a13 = symbol13, _b13) {
|
|
277
|
+
constructor({ value, cause }) {
|
|
278
|
+
super({
|
|
279
|
+
name: name12,
|
|
280
|
+
message: `Type validation failed: Value: ${JSON.stringify(value)}.
|
|
281
|
+
Error message: ${getErrorMessage(cause)}`,
|
|
282
|
+
cause
|
|
283
|
+
});
|
|
284
|
+
this[_a13] = true;
|
|
285
|
+
this.value = value;
|
|
286
|
+
}
|
|
287
|
+
static isInstance(error) {
|
|
288
|
+
return AISDKError.hasMarker(error, marker13);
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Wraps an error into a TypeValidationError.
|
|
292
|
+
* If the cause is already a TypeValidationError with the same value, it returns the cause.
|
|
293
|
+
* Otherwise, it creates a new TypeValidationError.
|
|
294
|
+
*
|
|
295
|
+
* @param {Object} params - The parameters for wrapping the error.
|
|
296
|
+
* @param {unknown} params.value - The value that failed validation.
|
|
297
|
+
* @param {unknown} params.cause - The original error or cause of the validation failure.
|
|
298
|
+
* @returns {TypeValidationError} A TypeValidationError instance.
|
|
299
|
+
*/
|
|
300
|
+
static wrap({
|
|
301
|
+
value,
|
|
302
|
+
cause
|
|
303
|
+
}) {
|
|
304
|
+
return _TypeValidationError.isInstance(cause) && cause.value === value ? cause : new _TypeValidationError({ value, cause });
|
|
305
|
+
}
|
|
306
|
+
};
|
|
307
|
+
var name13 = "AI_UnsupportedFunctionalityError";
|
|
308
|
+
var marker14 = `vercel.ai.error.${name13}`;
|
|
309
|
+
var symbol14 = Symbol.for(marker14);
|
|
310
|
+
var _a14;
|
|
311
|
+
var _b14;
|
|
312
|
+
var UnsupportedFunctionalityError = class extends (_b14 = AISDKError, _a14 = symbol14, _b14) {
|
|
313
|
+
constructor({
|
|
314
|
+
functionality,
|
|
315
|
+
message = `'${functionality}' functionality not supported.`
|
|
316
|
+
}) {
|
|
317
|
+
super({ name: name13, message });
|
|
318
|
+
this[_a14] = true;
|
|
319
|
+
this.functionality = functionality;
|
|
320
|
+
}
|
|
321
|
+
static isInstance(error) {
|
|
322
|
+
return AISDKError.hasMarker(error, marker14);
|
|
323
|
+
}
|
|
324
|
+
};
|
|
325
|
+
function isJSONValue(value) {
|
|
326
|
+
if (value === null || typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
327
|
+
return true;
|
|
328
|
+
}
|
|
329
|
+
if (Array.isArray(value)) {
|
|
330
|
+
return value.every(isJSONValue);
|
|
331
|
+
}
|
|
332
|
+
if (typeof value === "object") {
|
|
333
|
+
return Object.entries(value).every(
|
|
334
|
+
([key, val]) => typeof key === "string" && isJSONValue(val)
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
function isJSONObject(value) {
|
|
340
|
+
return value != null && typeof value === "object" && Object.entries(value).every(
|
|
341
|
+
([key, val]) => typeof key === "string" && isJSONValue(val)
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// src/index.ts
|
|
6
346
|
function isFinishPart(part) {
|
|
7
347
|
return part.type === "finish";
|
|
8
348
|
}
|
|
9
349
|
function getRawUsage(part) {
|
|
10
|
-
const
|
|
11
|
-
if (!
|
|
350
|
+
const providerMetadata = part.providerMetadata;
|
|
351
|
+
if (!providerMetadata) return void 0;
|
|
352
|
+
const anthropic2 = providerMetadata["anthropic"];
|
|
353
|
+
if (!isJSONObject(anthropic2)) return void 0;
|
|
354
|
+
const usage = anthropic2["usage"];
|
|
355
|
+
if (!isJSONObject(usage)) return void 0;
|
|
12
356
|
return usage;
|
|
13
357
|
}
|
|
14
358
|
function patchUsage(part) {
|
|
@@ -29,6 +373,22 @@ function patchUsage(part) {
|
|
|
29
373
|
}
|
|
30
374
|
return { ...part, usage };
|
|
31
375
|
}
|
|
376
|
+
function normalizeProviderOptions(options) {
|
|
377
|
+
const providerOptions = options.providerOptions;
|
|
378
|
+
if (!providerOptions || typeof providerOptions !== "object") return options;
|
|
379
|
+
if ("anthropic" in providerOptions) return options;
|
|
380
|
+
let candidate;
|
|
381
|
+
const keys = Object.keys(providerOptions);
|
|
382
|
+
if (keys.length === 1) candidate = providerOptions[keys[0]];
|
|
383
|
+
if (!isJSONObject(candidate)) return options;
|
|
384
|
+
return {
|
|
385
|
+
...options,
|
|
386
|
+
providerOptions: {
|
|
387
|
+
...providerOptions,
|
|
388
|
+
anthropic: candidate
|
|
389
|
+
}
|
|
390
|
+
};
|
|
391
|
+
}
|
|
32
392
|
var WrappedLanguageModelV2 = class {
|
|
33
393
|
constructor(inner) {
|
|
34
394
|
this.inner = inner;
|
|
@@ -46,10 +406,10 @@ var WrappedLanguageModelV2 = class {
|
|
|
46
406
|
return this.inner.supportedUrls;
|
|
47
407
|
}
|
|
48
408
|
doGenerate(options) {
|
|
49
|
-
return this.inner.doGenerate(options);
|
|
409
|
+
return this.inner.doGenerate(normalizeProviderOptions(options));
|
|
50
410
|
}
|
|
51
411
|
async doStream(options) {
|
|
52
|
-
const result = await this.inner.doStream(options);
|
|
412
|
+
const result = await this.inner.doStream(normalizeProviderOptions(options));
|
|
53
413
|
const patchedStream = result.stream.pipeThrough(
|
|
54
414
|
new TransformStream({
|
|
55
415
|
transform(part, controller) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai-sdk-anthropic",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -16,12 +16,18 @@
|
|
|
16
16
|
],
|
|
17
17
|
"scripts": {
|
|
18
18
|
"build": "tsup",
|
|
19
|
-
"dev": "tsup --watch"
|
|
19
|
+
"dev": "tsup --watch",
|
|
20
|
+
"lint": "eslint .",
|
|
21
|
+
"lint:fix": "eslint . --fix"
|
|
20
22
|
},
|
|
21
23
|
"dependencies": {
|
|
22
24
|
"@ai-sdk/anthropic": "^2.0.57"
|
|
23
25
|
},
|
|
24
26
|
"devDependencies": {
|
|
27
|
+
"@eslint/js": "^9.1.0",
|
|
28
|
+
"@typescript-eslint/eslint-plugin": "^8.17.0",
|
|
29
|
+
"@typescript-eslint/parser": "^8.17.0",
|
|
30
|
+
"eslint": "^9.1.0",
|
|
25
31
|
"tsup": "^8.0.2",
|
|
26
32
|
"typescript": "^5.8.3"
|
|
27
33
|
},
|