@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.
@@ -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
  }
@@ -3465,7 +3491,8 @@ var OpenRouterChatLanguageModel = class {
3465
3491
  (d) => d.type === "reasoning.encrypted" /* Encrypted */ && d.data
3466
3492
  );
3467
3493
  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);
3494
+ const mappedFinishReason = shouldOverrideFinishReason ? createFinishReason("tool-calls", (_j = choice.finish_reason) != null ? _j : void 0) : mapOpenRouterFinishReason(choice.finish_reason);
3495
+ const effectiveFinishReason = hasToolCalls && mappedFinishReason.unified === "other" ? createFinishReason("tool-calls", mappedFinishReason.raw) : mappedFinishReason;
3469
3496
  return {
3470
3497
  content,
3471
3498
  finishReason: effectiveFinishReason,
@@ -3529,6 +3556,10 @@ var OpenRouterChatLanguageModel = class {
3529
3556
  abortSignal: options.abortSignal,
3530
3557
  fetch: this.config.fetch
3531
3558
  });
3559
+ let streamError;
3560
+ const safeResponse = withStreamErrorHandling(response, (err) => {
3561
+ streamError = err;
3562
+ });
3532
3563
  const toolCalls = [];
3533
3564
  let finishReason = createFinishReason("other");
3534
3565
  const usage = {
@@ -3557,7 +3588,7 @@ var OpenRouterChatLanguageModel = class {
3557
3588
  let openrouterResponseId;
3558
3589
  let provider;
3559
3590
  return {
3560
- stream: response.pipeThrough(
3591
+ stream: safeResponse.pipeThrough(
3561
3592
  new TransformStream({
3562
3593
  transform(chunk, controller) {
3563
3594
  var _a17, _b17, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
@@ -3879,12 +3910,19 @@ var OpenRouterChatLanguageModel = class {
3879
3910
  flush(controller) {
3880
3911
  var _a17;
3881
3912
  const hasToolCalls = toolCalls.length > 0;
3913
+ if (streamError != null) {
3914
+ finishReason = createFinishReason("error");
3915
+ controller.enqueue({ type: "error", error: streamError });
3916
+ }
3882
3917
  const hasEncryptedReasoning = accumulatedReasoningDetails.some(
3883
3918
  (d) => d.type === "reasoning.encrypted" /* Encrypted */ && d.data
3884
3919
  );
3885
3920
  if (hasToolCalls && hasEncryptedReasoning && finishReason.unified === "stop") {
3886
3921
  finishReason = createFinishReason("tool-calls", finishReason.raw);
3887
3922
  }
3923
+ if (hasToolCalls && finishReason.unified === "other") {
3924
+ finishReason = createFinishReason("tool-calls", finishReason.raw);
3925
+ }
3888
3926
  if (finishReason.unified === "tool-calls") {
3889
3927
  for (const toolCall of toolCalls) {
3890
3928
  if (toolCall && !toolCall.sent) {
@@ -4270,6 +4308,10 @@ var OpenRouterCompletionLanguageModel = class {
4270
4308
  abortSignal: options.abortSignal,
4271
4309
  fetch: this.config.fetch
4272
4310
  });
4311
+ let streamError;
4312
+ const safeResponse = withStreamErrorHandling(response, (err) => {
4313
+ streamError = err;
4314
+ });
4273
4315
  let finishReason = createFinishReason("other");
4274
4316
  const usage = {
4275
4317
  inputTokens: {
@@ -4289,7 +4331,7 @@ var OpenRouterCompletionLanguageModel = class {
4289
4331
  let provider;
4290
4332
  let rawUsage;
4291
4333
  return {
4292
- stream: response.pipeThrough(
4334
+ stream: safeResponse.pipeThrough(
4293
4335
  new TransformStream({
4294
4336
  transform(chunk, controller) {
4295
4337
  var _a16, _b16, _c, _d, _e;
@@ -4353,6 +4395,10 @@ var OpenRouterCompletionLanguageModel = class {
4353
4395
  }
4354
4396
  },
4355
4397
  flush(controller) {
4398
+ if (streamError != null) {
4399
+ finishReason = createFinishReason("error");
4400
+ controller.enqueue({ type: "error", error: streamError });
4401
+ }
4356
4402
  usage.raw = rawUsage;
4357
4403
  const openrouterMetadata = {
4358
4404
  usage: openrouterUsage