@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.
@@ -2416,6 +2416,31 @@ function createFinishReason(unified, raw) {
2416
2416
  return { unified, raw };
2417
2417
  }
2418
2418
 
2419
+ // src/utils/with-stream-error-handling.ts
2420
+ function withStreamErrorHandling(source, onError) {
2421
+ const reader = source.getReader();
2422
+ return new ReadableStream({
2423
+ async pull(controller) {
2424
+ try {
2425
+ const { done, value } = await reader.read();
2426
+ if (done) {
2427
+ controller.close();
2428
+ } else {
2429
+ controller.enqueue(value);
2430
+ }
2431
+ } catch (err) {
2432
+ onError(err);
2433
+ reader.cancel().catch(() => {
2434
+ });
2435
+ controller.close();
2436
+ }
2437
+ },
2438
+ cancel(reason) {
2439
+ reader.cancel(reason);
2440
+ }
2441
+ });
2442
+ }
2443
+
2419
2444
  // src/utils/reasoning-details-duplicate-tracker.ts
2420
2445
  var _seenKeys;
2421
2446
  var ReasoningDetailsDuplicateTracker = class {
@@ -2803,6 +2828,7 @@ function convertToOpenRouterChatMessages(prompt) {
2803
2828
  role: "tool",
2804
2829
  tool_call_id: toolResponse.toolCallId,
2805
2830
  content: content2,
2831
+ name: toolResponse.toolName,
2806
2832
  cache_control: (_h = getCacheControl(providerOptions)) != null ? _h : getCacheControl(toolResponse.providerOptions)
2807
2833
  });
2808
2834
  }
@@ -3379,17 +3405,6 @@ var OpenRouterChatLanguageModel = class {
3379
3405
  break;
3380
3406
  }
3381
3407
  case "reasoning.encrypted" /* Encrypted */: {
3382
- if (detail.data) {
3383
- return {
3384
- type: "reasoning",
3385
- text: "[REDACTED]",
3386
- providerMetadata: {
3387
- openrouter: {
3388
- reasoning_details: [detail]
3389
- }
3390
- }
3391
- };
3392
- }
3393
3408
  break;
3394
3409
  }
3395
3410
  default: {
@@ -3465,7 +3480,8 @@ var OpenRouterChatLanguageModel = class {
3465
3480
  (d) => d.type === "reasoning.encrypted" /* Encrypted */ && d.data
3466
3481
  );
3467
3482
  const shouldOverrideFinishReason = hasToolCalls && hasEncryptedReasoning && choice.finish_reason === "stop";
3468
- const effectiveFinishReason = shouldOverrideFinishReason ? createFinishReason("tool-calls", (_j = choice.finish_reason) != null ? _j : void 0) : mapOpenRouterFinishReason(choice.finish_reason);
3483
+ const mappedFinishReason = shouldOverrideFinishReason ? createFinishReason("tool-calls", (_j = choice.finish_reason) != null ? _j : void 0) : mapOpenRouterFinishReason(choice.finish_reason);
3484
+ const effectiveFinishReason = hasToolCalls && mappedFinishReason.unified === "other" ? createFinishReason("tool-calls", mappedFinishReason.raw) : mappedFinishReason;
3469
3485
  return {
3470
3486
  content,
3471
3487
  finishReason: effectiveFinishReason,
@@ -3529,6 +3545,10 @@ var OpenRouterChatLanguageModel = class {
3529
3545
  abortSignal: options.abortSignal,
3530
3546
  fetch: this.config.fetch
3531
3547
  });
3548
+ let streamError;
3549
+ const safeResponse = withStreamErrorHandling(response, (err) => {
3550
+ streamError = err;
3551
+ });
3532
3552
  const toolCalls = [];
3533
3553
  let finishReason = createFinishReason("other");
3534
3554
  const usage = {
@@ -3557,7 +3577,7 @@ var OpenRouterChatLanguageModel = class {
3557
3577
  let openrouterResponseId;
3558
3578
  let provider;
3559
3579
  return {
3560
- stream: response.pipeThrough(
3580
+ stream: safeResponse.pipeThrough(
3561
3581
  new TransformStream({
3562
3582
  transform(chunk, controller) {
3563
3583
  var _a17, _b17, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
@@ -3673,9 +3693,6 @@ var OpenRouterChatLanguageModel = class {
3673
3693
  break;
3674
3694
  }
3675
3695
  case "reasoning.encrypted" /* Encrypted */: {
3676
- if (detail.data) {
3677
- emitReasoningChunk("[REDACTED]", reasoningMetadata);
3678
- }
3679
3696
  break;
3680
3697
  }
3681
3698
  case "reasoning.summary" /* Summary */: {
@@ -3879,12 +3896,19 @@ var OpenRouterChatLanguageModel = class {
3879
3896
  flush(controller) {
3880
3897
  var _a17;
3881
3898
  const hasToolCalls = toolCalls.length > 0;
3899
+ if (streamError != null) {
3900
+ finishReason = createFinishReason("error");
3901
+ controller.enqueue({ type: "error", error: streamError });
3902
+ }
3882
3903
  const hasEncryptedReasoning = accumulatedReasoningDetails.some(
3883
3904
  (d) => d.type === "reasoning.encrypted" /* Encrypted */ && d.data
3884
3905
  );
3885
3906
  if (hasToolCalls && hasEncryptedReasoning && finishReason.unified === "stop") {
3886
3907
  finishReason = createFinishReason("tool-calls", finishReason.raw);
3887
3908
  }
3909
+ if (hasToolCalls && finishReason.unified === "other") {
3910
+ finishReason = createFinishReason("tool-calls", finishReason.raw);
3911
+ }
3888
3912
  if (finishReason.unified === "tool-calls") {
3889
3913
  for (const toolCall of toolCalls) {
3890
3914
  if (toolCall && !toolCall.sent) {
@@ -4270,6 +4294,10 @@ var OpenRouterCompletionLanguageModel = class {
4270
4294
  abortSignal: options.abortSignal,
4271
4295
  fetch: this.config.fetch
4272
4296
  });
4297
+ let streamError;
4298
+ const safeResponse = withStreamErrorHandling(response, (err) => {
4299
+ streamError = err;
4300
+ });
4273
4301
  let finishReason = createFinishReason("other");
4274
4302
  const usage = {
4275
4303
  inputTokens: {
@@ -4289,7 +4317,7 @@ var OpenRouterCompletionLanguageModel = class {
4289
4317
  let provider;
4290
4318
  let rawUsage;
4291
4319
  return {
4292
- stream: response.pipeThrough(
4320
+ stream: safeResponse.pipeThrough(
4293
4321
  new TransformStream({
4294
4322
  transform(chunk, controller) {
4295
4323
  var _a16, _b16, _c, _d, _e;
@@ -4353,6 +4381,10 @@ var OpenRouterCompletionLanguageModel = class {
4353
4381
  }
4354
4382
  },
4355
4383
  flush(controller) {
4384
+ if (streamError != null) {
4385
+ finishReason = createFinishReason("error");
4386
+ controller.enqueue({ type: "error", error: streamError });
4387
+ }
4356
4388
  usage.raw = rawUsage;
4357
4389
  const openrouterMetadata = {
4358
4390
  usage: openrouterUsage