@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.
@@ -2382,6 +2382,31 @@ function createFinishReason(unified, raw) {
2382
2382
  return { unified, raw };
2383
2383
  }
2384
2384
 
2385
+ // src/utils/with-stream-error-handling.ts
2386
+ function withStreamErrorHandling(source, onError) {
2387
+ const reader = source.getReader();
2388
+ return new ReadableStream({
2389
+ async pull(controller) {
2390
+ try {
2391
+ const { done, value } = await reader.read();
2392
+ if (done) {
2393
+ controller.close();
2394
+ } else {
2395
+ controller.enqueue(value);
2396
+ }
2397
+ } catch (err) {
2398
+ onError(err);
2399
+ reader.cancel().catch(() => {
2400
+ });
2401
+ controller.close();
2402
+ }
2403
+ },
2404
+ cancel(reason) {
2405
+ reader.cancel(reason);
2406
+ }
2407
+ });
2408
+ }
2409
+
2385
2410
  // src/utils/reasoning-details-duplicate-tracker.ts
2386
2411
  var _seenKeys;
2387
2412
  var ReasoningDetailsDuplicateTracker = class {
@@ -2769,6 +2794,7 @@ function convertToOpenRouterChatMessages(prompt) {
2769
2794
  role: "tool",
2770
2795
  tool_call_id: toolResponse.toolCallId,
2771
2796
  content: content2,
2797
+ name: toolResponse.toolName,
2772
2798
  cache_control: (_h = getCacheControl(providerOptions)) != null ? _h : getCacheControl(toolResponse.providerOptions)
2773
2799
  });
2774
2800
  }
@@ -3345,17 +3371,6 @@ var OpenRouterChatLanguageModel = class {
3345
3371
  break;
3346
3372
  }
3347
3373
  case "reasoning.encrypted" /* Encrypted */: {
3348
- if (detail.data) {
3349
- return {
3350
- type: "reasoning",
3351
- text: "[REDACTED]",
3352
- providerMetadata: {
3353
- openrouter: {
3354
- reasoning_details: [detail]
3355
- }
3356
- }
3357
- };
3358
- }
3359
3374
  break;
3360
3375
  }
3361
3376
  default: {
@@ -3431,7 +3446,8 @@ var OpenRouterChatLanguageModel = class {
3431
3446
  (d) => d.type === "reasoning.encrypted" /* Encrypted */ && d.data
3432
3447
  );
3433
3448
  const shouldOverrideFinishReason = hasToolCalls && hasEncryptedReasoning && choice.finish_reason === "stop";
3434
- const effectiveFinishReason = shouldOverrideFinishReason ? createFinishReason("tool-calls", (_j = choice.finish_reason) != null ? _j : void 0) : mapOpenRouterFinishReason(choice.finish_reason);
3449
+ const mappedFinishReason = shouldOverrideFinishReason ? createFinishReason("tool-calls", (_j = choice.finish_reason) != null ? _j : void 0) : mapOpenRouterFinishReason(choice.finish_reason);
3450
+ const effectiveFinishReason = hasToolCalls && mappedFinishReason.unified === "other" ? createFinishReason("tool-calls", mappedFinishReason.raw) : mappedFinishReason;
3435
3451
  return {
3436
3452
  content,
3437
3453
  finishReason: effectiveFinishReason,
@@ -3495,6 +3511,10 @@ var OpenRouterChatLanguageModel = class {
3495
3511
  abortSignal: options.abortSignal,
3496
3512
  fetch: this.config.fetch
3497
3513
  });
3514
+ let streamError;
3515
+ const safeResponse = withStreamErrorHandling(response, (err) => {
3516
+ streamError = err;
3517
+ });
3498
3518
  const toolCalls = [];
3499
3519
  let finishReason = createFinishReason("other");
3500
3520
  const usage = {
@@ -3523,7 +3543,7 @@ var OpenRouterChatLanguageModel = class {
3523
3543
  let openrouterResponseId;
3524
3544
  let provider;
3525
3545
  return {
3526
- stream: response.pipeThrough(
3546
+ stream: safeResponse.pipeThrough(
3527
3547
  new TransformStream({
3528
3548
  transform(chunk, controller) {
3529
3549
  var _a17, _b17, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
@@ -3639,9 +3659,6 @@ var OpenRouterChatLanguageModel = class {
3639
3659
  break;
3640
3660
  }
3641
3661
  case "reasoning.encrypted" /* Encrypted */: {
3642
- if (detail.data) {
3643
- emitReasoningChunk("[REDACTED]", reasoningMetadata);
3644
- }
3645
3662
  break;
3646
3663
  }
3647
3664
  case "reasoning.summary" /* Summary */: {
@@ -3845,12 +3862,19 @@ var OpenRouterChatLanguageModel = class {
3845
3862
  flush(controller) {
3846
3863
  var _a17;
3847
3864
  const hasToolCalls = toolCalls.length > 0;
3865
+ if (streamError != null) {
3866
+ finishReason = createFinishReason("error");
3867
+ controller.enqueue({ type: "error", error: streamError });
3868
+ }
3848
3869
  const hasEncryptedReasoning = accumulatedReasoningDetails.some(
3849
3870
  (d) => d.type === "reasoning.encrypted" /* Encrypted */ && d.data
3850
3871
  );
3851
3872
  if (hasToolCalls && hasEncryptedReasoning && finishReason.unified === "stop") {
3852
3873
  finishReason = createFinishReason("tool-calls", finishReason.raw);
3853
3874
  }
3875
+ if (hasToolCalls && finishReason.unified === "other") {
3876
+ finishReason = createFinishReason("tool-calls", finishReason.raw);
3877
+ }
3854
3878
  if (finishReason.unified === "tool-calls") {
3855
3879
  for (const toolCall of toolCalls) {
3856
3880
  if (toolCall && !toolCall.sent) {
@@ -4236,6 +4260,10 @@ var OpenRouterCompletionLanguageModel = class {
4236
4260
  abortSignal: options.abortSignal,
4237
4261
  fetch: this.config.fetch
4238
4262
  });
4263
+ let streamError;
4264
+ const safeResponse = withStreamErrorHandling(response, (err) => {
4265
+ streamError = err;
4266
+ });
4239
4267
  let finishReason = createFinishReason("other");
4240
4268
  const usage = {
4241
4269
  inputTokens: {
@@ -4255,7 +4283,7 @@ var OpenRouterCompletionLanguageModel = class {
4255
4283
  let provider;
4256
4284
  let rawUsage;
4257
4285
  return {
4258
- stream: response.pipeThrough(
4286
+ stream: safeResponse.pipeThrough(
4259
4287
  new TransformStream({
4260
4288
  transform(chunk, controller) {
4261
4289
  var _a16, _b16, _c, _d, _e;
@@ -4319,6 +4347,10 @@ var OpenRouterCompletionLanguageModel = class {
4319
4347
  }
4320
4348
  },
4321
4349
  flush(controller) {
4350
+ if (streamError != null) {
4351
+ finishReason = createFinishReason("error");
4352
+ controller.enqueue({ type: "error", error: streamError });
4353
+ }
4322
4354
  usage.raw = rawUsage;
4323
4355
  const openrouterMetadata = {
4324
4356
  usage: openrouterUsage