@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.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 effectiveFinishReason = shouldOverrideFinishReason ? createFinishReason("tool-calls", (_j = choice.finish_reason) != null ? _j : void 0) : mapOpenRouterFinishReason(choice.finish_reason);
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: response.pipeThrough(
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: response.pipeThrough(
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.3.3";
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}`