@openrouter/ai-sdk-provider 2.3.3 → 2.4.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/dist/index.d.mts +18 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +56 -22
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +56 -22
- package/dist/index.mjs.map +1 -1
- package/dist/internal/index.js +49 -17
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/index.mjs +49 -17
- package/dist/internal/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -2417,6 +2417,31 @@ function createFinishReason(unified, raw) {
|
|
|
2417
2417
|
return { unified, raw };
|
|
2418
2418
|
}
|
|
2419
2419
|
|
|
2420
|
+
// src/utils/with-stream-error-handling.ts
|
|
2421
|
+
function withStreamErrorHandling(source, onError) {
|
|
2422
|
+
const reader = source.getReader();
|
|
2423
|
+
return new ReadableStream({
|
|
2424
|
+
async pull(controller) {
|
|
2425
|
+
try {
|
|
2426
|
+
const { done, value } = await reader.read();
|
|
2427
|
+
if (done) {
|
|
2428
|
+
controller.close();
|
|
2429
|
+
} else {
|
|
2430
|
+
controller.enqueue(value);
|
|
2431
|
+
}
|
|
2432
|
+
} catch (err) {
|
|
2433
|
+
onError(err);
|
|
2434
|
+
reader.cancel().catch(() => {
|
|
2435
|
+
});
|
|
2436
|
+
controller.close();
|
|
2437
|
+
}
|
|
2438
|
+
},
|
|
2439
|
+
cancel(reason) {
|
|
2440
|
+
reader.cancel(reason);
|
|
2441
|
+
}
|
|
2442
|
+
});
|
|
2443
|
+
}
|
|
2444
|
+
|
|
2420
2445
|
// src/utils/reasoning-details-duplicate-tracker.ts
|
|
2421
2446
|
var _seenKeys;
|
|
2422
2447
|
var ReasoningDetailsDuplicateTracker = class {
|
|
@@ -2804,6 +2829,7 @@ function convertToOpenRouterChatMessages(prompt) {
|
|
|
2804
2829
|
role: "tool",
|
|
2805
2830
|
tool_call_id: toolResponse.toolCallId,
|
|
2806
2831
|
content: content2,
|
|
2832
|
+
name: toolResponse.toolName,
|
|
2807
2833
|
cache_control: (_h = getCacheControl(providerOptions)) != null ? _h : getCacheControl(toolResponse.providerOptions)
|
|
2808
2834
|
});
|
|
2809
2835
|
}
|
|
@@ -3380,17 +3406,6 @@ var OpenRouterChatLanguageModel = class {
|
|
|
3380
3406
|
break;
|
|
3381
3407
|
}
|
|
3382
3408
|
case "reasoning.encrypted" /* Encrypted */: {
|
|
3383
|
-
if (detail.data) {
|
|
3384
|
-
return {
|
|
3385
|
-
type: "reasoning",
|
|
3386
|
-
text: "[REDACTED]",
|
|
3387
|
-
providerMetadata: {
|
|
3388
|
-
openrouter: {
|
|
3389
|
-
reasoning_details: [detail]
|
|
3390
|
-
}
|
|
3391
|
-
}
|
|
3392
|
-
};
|
|
3393
|
-
}
|
|
3394
3409
|
break;
|
|
3395
3410
|
}
|
|
3396
3411
|
default: {
|
|
@@ -3466,7 +3481,8 @@ var OpenRouterChatLanguageModel = class {
|
|
|
3466
3481
|
(d) => d.type === "reasoning.encrypted" /* Encrypted */ && d.data
|
|
3467
3482
|
);
|
|
3468
3483
|
const shouldOverrideFinishReason = hasToolCalls && hasEncryptedReasoning && choice.finish_reason === "stop";
|
|
3469
|
-
const
|
|
3484
|
+
const mappedFinishReason = shouldOverrideFinishReason ? createFinishReason("tool-calls", (_j = choice.finish_reason) != null ? _j : void 0) : mapOpenRouterFinishReason(choice.finish_reason);
|
|
3485
|
+
const effectiveFinishReason = hasToolCalls && mappedFinishReason.unified === "other" ? createFinishReason("tool-calls", mappedFinishReason.raw) : mappedFinishReason;
|
|
3470
3486
|
return {
|
|
3471
3487
|
content,
|
|
3472
3488
|
finishReason: effectiveFinishReason,
|
|
@@ -3530,6 +3546,10 @@ var OpenRouterChatLanguageModel = class {
|
|
|
3530
3546
|
abortSignal: options.abortSignal,
|
|
3531
3547
|
fetch: this.config.fetch
|
|
3532
3548
|
});
|
|
3549
|
+
let streamError;
|
|
3550
|
+
const safeResponse = withStreamErrorHandling(response, (err) => {
|
|
3551
|
+
streamError = err;
|
|
3552
|
+
});
|
|
3533
3553
|
const toolCalls = [];
|
|
3534
3554
|
let finishReason = createFinishReason("other");
|
|
3535
3555
|
const usage = {
|
|
@@ -3558,7 +3578,7 @@ var OpenRouterChatLanguageModel = class {
|
|
|
3558
3578
|
let openrouterResponseId;
|
|
3559
3579
|
let provider;
|
|
3560
3580
|
return {
|
|
3561
|
-
stream:
|
|
3581
|
+
stream: safeResponse.pipeThrough(
|
|
3562
3582
|
new TransformStream({
|
|
3563
3583
|
transform(chunk, controller) {
|
|
3564
3584
|
var _a17, _b17, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
|
|
@@ -3674,9 +3694,6 @@ var OpenRouterChatLanguageModel = class {
|
|
|
3674
3694
|
break;
|
|
3675
3695
|
}
|
|
3676
3696
|
case "reasoning.encrypted" /* Encrypted */: {
|
|
3677
|
-
if (detail.data) {
|
|
3678
|
-
emitReasoningChunk("[REDACTED]", reasoningMetadata);
|
|
3679
|
-
}
|
|
3680
3697
|
break;
|
|
3681
3698
|
}
|
|
3682
3699
|
case "reasoning.summary" /* Summary */: {
|
|
@@ -3880,12 +3897,19 @@ var OpenRouterChatLanguageModel = class {
|
|
|
3880
3897
|
flush(controller) {
|
|
3881
3898
|
var _a17;
|
|
3882
3899
|
const hasToolCalls = toolCalls.length > 0;
|
|
3900
|
+
if (streamError != null) {
|
|
3901
|
+
finishReason = createFinishReason("error");
|
|
3902
|
+
controller.enqueue({ type: "error", error: streamError });
|
|
3903
|
+
}
|
|
3883
3904
|
const hasEncryptedReasoning = accumulatedReasoningDetails.some(
|
|
3884
3905
|
(d) => d.type === "reasoning.encrypted" /* Encrypted */ && d.data
|
|
3885
3906
|
);
|
|
3886
3907
|
if (hasToolCalls && hasEncryptedReasoning && finishReason.unified === "stop") {
|
|
3887
3908
|
finishReason = createFinishReason("tool-calls", finishReason.raw);
|
|
3888
3909
|
}
|
|
3910
|
+
if (hasToolCalls && finishReason.unified === "other") {
|
|
3911
|
+
finishReason = createFinishReason("tool-calls", finishReason.raw);
|
|
3912
|
+
}
|
|
3889
3913
|
if (finishReason.unified === "tool-calls") {
|
|
3890
3914
|
for (const toolCall of toolCalls) {
|
|
3891
3915
|
if (toolCall && !toolCall.sent) {
|
|
@@ -4271,6 +4295,10 @@ var OpenRouterCompletionLanguageModel = class {
|
|
|
4271
4295
|
abortSignal: options.abortSignal,
|
|
4272
4296
|
fetch: this.config.fetch
|
|
4273
4297
|
});
|
|
4298
|
+
let streamError;
|
|
4299
|
+
const safeResponse = withStreamErrorHandling(response, (err) => {
|
|
4300
|
+
streamError = err;
|
|
4301
|
+
});
|
|
4274
4302
|
let finishReason = createFinishReason("other");
|
|
4275
4303
|
const usage = {
|
|
4276
4304
|
inputTokens: {
|
|
@@ -4290,7 +4318,7 @@ var OpenRouterCompletionLanguageModel = class {
|
|
|
4290
4318
|
let provider;
|
|
4291
4319
|
let rawUsage;
|
|
4292
4320
|
return {
|
|
4293
|
-
stream:
|
|
4321
|
+
stream: safeResponse.pipeThrough(
|
|
4294
4322
|
new TransformStream({
|
|
4295
4323
|
transform(chunk, controller) {
|
|
4296
4324
|
var _a16, _b16, _c, _d, _e;
|
|
@@ -4354,6 +4382,10 @@ var OpenRouterCompletionLanguageModel = class {
|
|
|
4354
4382
|
}
|
|
4355
4383
|
},
|
|
4356
4384
|
flush(controller) {
|
|
4385
|
+
if (streamError != null) {
|
|
4386
|
+
finishReason = createFinishReason("error");
|
|
4387
|
+
controller.enqueue({ type: "error", error: streamError });
|
|
4388
|
+
}
|
|
4357
4389
|
usage.raw = rawUsage;
|
|
4358
4390
|
const openrouterMetadata = {
|
|
4359
4391
|
usage: openrouterUsage
|
|
@@ -4467,17 +4499,19 @@ var OpenRouter = class {
|
|
|
4467
4499
|
this.apiKey = options.apiKey;
|
|
4468
4500
|
this.headers = options.headers;
|
|
4469
4501
|
this.api_keys = options.api_keys;
|
|
4502
|
+
this.appName = options.appName;
|
|
4503
|
+
this.appUrl = options.appUrl;
|
|
4470
4504
|
}
|
|
4471
4505
|
get baseConfig() {
|
|
4472
4506
|
return {
|
|
4473
4507
|
baseURL: this.baseURL,
|
|
4474
|
-
headers: () => __spreadValues(__spreadValues({
|
|
4508
|
+
headers: () => __spreadValues(__spreadValues(__spreadValues(__spreadValues({
|
|
4475
4509
|
Authorization: `Bearer ${loadApiKey({
|
|
4476
4510
|
apiKey: this.apiKey,
|
|
4477
4511
|
environmentVariableName: "OPENROUTER_API_KEY",
|
|
4478
4512
|
description: "OpenRouter"
|
|
4479
4513
|
})}`
|
|
4480
|
-
}, this.headers), this.api_keys && Object.keys(this.api_keys).length > 0 && {
|
|
4514
|
+
}, this.appName && { "X-OpenRouter-Title": this.appName }), this.appUrl && { "HTTP-Referer": this.appUrl }), this.headers), this.api_keys && Object.keys(this.api_keys).length > 0 && {
|
|
4481
4515
|
"X-Provider-API-Keys": JSON.stringify(this.api_keys)
|
|
4482
4516
|
})
|
|
4483
4517
|
};
|
|
@@ -4714,7 +4748,7 @@ function withUserAgentSuffix2(headers, ...userAgentSuffixParts) {
|
|
|
4714
4748
|
}
|
|
4715
4749
|
|
|
4716
4750
|
// src/version.ts
|
|
4717
|
-
var VERSION2 = false ? "0.0.0-test" : "2.
|
|
4751
|
+
var VERSION2 = false ? "0.0.0-test" : "2.4.1";
|
|
4718
4752
|
|
|
4719
4753
|
// src/provider.ts
|
|
4720
4754
|
function createOpenRouter(options = {}) {
|
|
@@ -4722,13 +4756,13 @@ function createOpenRouter(options = {}) {
|
|
|
4722
4756
|
const baseURL = (_b16 = withoutTrailingSlash((_a16 = options.baseURL) != null ? _a16 : options.baseUrl)) != null ? _b16 : "https://openrouter.ai/api/v1";
|
|
4723
4757
|
const compatibility = (_c = options.compatibility) != null ? _c : "compatible";
|
|
4724
4758
|
const getHeaders = () => withUserAgentSuffix2(
|
|
4725
|
-
__spreadValues(__spreadValues({
|
|
4759
|
+
__spreadValues(__spreadValues(__spreadValues(__spreadValues({
|
|
4726
4760
|
Authorization: `Bearer ${loadApiKey({
|
|
4727
4761
|
apiKey: options.apiKey,
|
|
4728
4762
|
environmentVariableName: "OPENROUTER_API_KEY",
|
|
4729
4763
|
description: "OpenRouter"
|
|
4730
4764
|
})}`
|
|
4731
|
-
}, options.headers), options.api_keys && Object.keys(options.api_keys).length > 0 && {
|
|
4765
|
+
}, options.appName && { "X-OpenRouter-Title": options.appName }), options.appUrl && { "HTTP-Referer": options.appUrl }), options.headers), options.api_keys && Object.keys(options.api_keys).length > 0 && {
|
|
4732
4766
|
"X-Provider-API-Keys": JSON.stringify(options.api_keys)
|
|
4733
4767
|
}),
|
|
4734
4768
|
`ai-sdk/openrouter/${VERSION2}`
|