@openrouter/ai-sdk-provider 2.3.3 → 2.4.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.
@@ -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
  }
@@ -3431,7 +3457,8 @@ var OpenRouterChatLanguageModel = class {
3431
3457
  (d) => d.type === "reasoning.encrypted" /* Encrypted */ && d.data
3432
3458
  );
3433
3459
  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);
3460
+ const mappedFinishReason = shouldOverrideFinishReason ? createFinishReason("tool-calls", (_j = choice.finish_reason) != null ? _j : void 0) : mapOpenRouterFinishReason(choice.finish_reason);
3461
+ const effectiveFinishReason = hasToolCalls && mappedFinishReason.unified === "other" ? createFinishReason("tool-calls", mappedFinishReason.raw) : mappedFinishReason;
3435
3462
  return {
3436
3463
  content,
3437
3464
  finishReason: effectiveFinishReason,
@@ -3495,6 +3522,10 @@ var OpenRouterChatLanguageModel = class {
3495
3522
  abortSignal: options.abortSignal,
3496
3523
  fetch: this.config.fetch
3497
3524
  });
3525
+ let streamError;
3526
+ const safeResponse = withStreamErrorHandling(response, (err) => {
3527
+ streamError = err;
3528
+ });
3498
3529
  const toolCalls = [];
3499
3530
  let finishReason = createFinishReason("other");
3500
3531
  const usage = {
@@ -3523,7 +3554,7 @@ var OpenRouterChatLanguageModel = class {
3523
3554
  let openrouterResponseId;
3524
3555
  let provider;
3525
3556
  return {
3526
- stream: response.pipeThrough(
3557
+ stream: safeResponse.pipeThrough(
3527
3558
  new TransformStream({
3528
3559
  transform(chunk, controller) {
3529
3560
  var _a17, _b17, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
@@ -3845,12 +3876,19 @@ var OpenRouterChatLanguageModel = class {
3845
3876
  flush(controller) {
3846
3877
  var _a17;
3847
3878
  const hasToolCalls = toolCalls.length > 0;
3879
+ if (streamError != null) {
3880
+ finishReason = createFinishReason("error");
3881
+ controller.enqueue({ type: "error", error: streamError });
3882
+ }
3848
3883
  const hasEncryptedReasoning = accumulatedReasoningDetails.some(
3849
3884
  (d) => d.type === "reasoning.encrypted" /* Encrypted */ && d.data
3850
3885
  );
3851
3886
  if (hasToolCalls && hasEncryptedReasoning && finishReason.unified === "stop") {
3852
3887
  finishReason = createFinishReason("tool-calls", finishReason.raw);
3853
3888
  }
3889
+ if (hasToolCalls && finishReason.unified === "other") {
3890
+ finishReason = createFinishReason("tool-calls", finishReason.raw);
3891
+ }
3854
3892
  if (finishReason.unified === "tool-calls") {
3855
3893
  for (const toolCall of toolCalls) {
3856
3894
  if (toolCall && !toolCall.sent) {
@@ -4236,6 +4274,10 @@ var OpenRouterCompletionLanguageModel = class {
4236
4274
  abortSignal: options.abortSignal,
4237
4275
  fetch: this.config.fetch
4238
4276
  });
4277
+ let streamError;
4278
+ const safeResponse = withStreamErrorHandling(response, (err) => {
4279
+ streamError = err;
4280
+ });
4239
4281
  let finishReason = createFinishReason("other");
4240
4282
  const usage = {
4241
4283
  inputTokens: {
@@ -4255,7 +4297,7 @@ var OpenRouterCompletionLanguageModel = class {
4255
4297
  let provider;
4256
4298
  let rawUsage;
4257
4299
  return {
4258
- stream: response.pipeThrough(
4300
+ stream: safeResponse.pipeThrough(
4259
4301
  new TransformStream({
4260
4302
  transform(chunk, controller) {
4261
4303
  var _a16, _b16, _c, _d, _e;
@@ -4319,6 +4361,10 @@ var OpenRouterCompletionLanguageModel = class {
4319
4361
  }
4320
4362
  },
4321
4363
  flush(controller) {
4364
+ if (streamError != null) {
4365
+ finishReason = createFinishReason("error");
4366
+ controller.enqueue({ type: "error", error: streamError });
4367
+ }
4322
4368
  usage.raw = rawUsage;
4323
4369
  const openrouterMetadata = {
4324
4370
  usage: openrouterUsage