@openrouter/ai-sdk-provider 2.1.0 → 2.1.2

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
@@ -4,6 +4,9 @@ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
6
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
+ var __typeError = (msg) => {
8
+ throw TypeError(msg);
9
+ };
7
10
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
11
  var __spreadValues = (a, b) => {
9
12
  for (var prop in b || (b = {}))
@@ -29,6 +32,9 @@ var __objRest = (source, exclude) => {
29
32
  }
30
33
  return target;
31
34
  };
35
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
36
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
37
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
32
38
 
33
39
  // node_modules/.pnpm/@ai-sdk+provider@3.0.0/node_modules/@ai-sdk/provider/dist/index.mjs
34
40
  var marker = "vercel.ai.error";
@@ -2316,6 +2322,54 @@ function createFinishReason(unified, raw) {
2316
2322
  return { unified, raw };
2317
2323
  }
2318
2324
 
2325
+ // src/utils/reasoning-details-duplicate-tracker.ts
2326
+ var _seenKeys;
2327
+ var ReasoningDetailsDuplicateTracker = class {
2328
+ constructor() {
2329
+ __privateAdd(this, _seenKeys, /* @__PURE__ */ new Set());
2330
+ }
2331
+ /**
2332
+ * Attempts to track a detail.
2333
+ * Returns true if this is a NEW detail (not seen before and has valid key),
2334
+ * false if it was skipped (no valid key) or already seen (duplicate).
2335
+ */
2336
+ upsert(detail) {
2337
+ const key = this.getCanonicalKey(detail);
2338
+ if (key === null) {
2339
+ return false;
2340
+ }
2341
+ if (__privateGet(this, _seenKeys).has(key)) {
2342
+ return false;
2343
+ }
2344
+ __privateGet(this, _seenKeys).add(key);
2345
+ return true;
2346
+ }
2347
+ getCanonicalKey(detail) {
2348
+ switch (detail.type) {
2349
+ case "reasoning.summary" /* Summary */:
2350
+ return detail.summary;
2351
+ case "reasoning.encrypted" /* Encrypted */:
2352
+ if (detail.id) {
2353
+ return detail.id;
2354
+ }
2355
+ return detail.data;
2356
+ case "reasoning.text" /* Text */: {
2357
+ if (detail.text) {
2358
+ return detail.text;
2359
+ }
2360
+ if (detail.signature) {
2361
+ return detail.signature;
2362
+ }
2363
+ return null;
2364
+ }
2365
+ default: {
2366
+ return null;
2367
+ }
2368
+ }
2369
+ }
2370
+ };
2371
+ _seenKeys = new WeakMap();
2372
+
2319
2373
  // src/types/openrouter-chat-completions-input.ts
2320
2374
  var OPENROUTER_AUDIO_FORMATS = [
2321
2375
  "wav",
@@ -2447,6 +2501,7 @@ function getCacheControl(providerMetadata) {
2447
2501
  function convertToOpenRouterChatMessages(prompt) {
2448
2502
  var _a16, _b16, _c, _d, _e, _f, _g, _h;
2449
2503
  const messages = [];
2504
+ const reasoningDetailsTracker = new ReasoningDetailsDuplicateTracker();
2450
2505
  for (const { role, content, providerOptions } of prompt) {
2451
2506
  switch (role) {
2452
2507
  case "system": {
@@ -2589,7 +2644,17 @@ function convertToOpenRouterChatMessages(prompt) {
2589
2644
  const parsedProviderOptions = OpenRouterProviderOptionsSchema.safeParse(providerOptions);
2590
2645
  const messageReasoningDetails = parsedProviderOptions.success ? (_e = (_d = parsedProviderOptions.data) == null ? void 0 : _d.openrouter) == null ? void 0 : _e.reasoning_details : void 0;
2591
2646
  const messageAnnotations = parsedProviderOptions.success ? (_g = (_f = parsedProviderOptions.data) == null ? void 0 : _f.openrouter) == null ? void 0 : _g.annotations : void 0;
2592
- const finalReasoningDetails = messageReasoningDetails && Array.isArray(messageReasoningDetails) && messageReasoningDetails.length > 0 ? messageReasoningDetails : findFirstReasoningDetails(content);
2647
+ const candidateReasoningDetails = messageReasoningDetails && Array.isArray(messageReasoningDetails) && messageReasoningDetails.length > 0 ? messageReasoningDetails : findFirstReasoningDetails(content);
2648
+ let finalReasoningDetails;
2649
+ if (candidateReasoningDetails && candidateReasoningDetails.length > 0) {
2650
+ const uniqueDetails = [];
2651
+ for (const detail of candidateReasoningDetails) {
2652
+ if (reasoningDetailsTracker.upsert(detail)) {
2653
+ uniqueDetails.push(detail);
2654
+ }
2655
+ }
2656
+ finalReasoningDetails = uniqueDetails.length > 0 ? uniqueDetails : void 0;
2657
+ }
2593
2658
  messages.push({
2594
2659
  role: "assistant",
2595
2660
  content: text,
@@ -3414,7 +3479,16 @@ var OpenRouterChatLanguageModel = class {
3414
3479
  if (reasoningStarted && !textStarted) {
3415
3480
  controller.enqueue({
3416
3481
  type: "reasoning-end",
3417
- id: reasoningId || generateId()
3482
+ id: reasoningId || generateId(),
3483
+ // Include accumulated reasoning_details so the AI SDK can update
3484
+ // the reasoning part's providerMetadata with the correct signature.
3485
+ // The signature typically arrives in the last reasoning delta,
3486
+ // but reasoning-start only carries the first delta's metadata.
3487
+ providerMetadata: accumulatedReasoningDetails.length > 0 ? {
3488
+ openrouter: {
3489
+ reasoning_details: accumulatedReasoningDetails
3490
+ }
3491
+ } : void 0
3418
3492
  });
3419
3493
  reasoningStarted = false;
3420
3494
  }
@@ -3616,7 +3690,14 @@ var OpenRouterChatLanguageModel = class {
3616
3690
  if (reasoningStarted) {
3617
3691
  controller.enqueue({
3618
3692
  type: "reasoning-end",
3619
- id: reasoningId || generateId()
3693
+ id: reasoningId || generateId(),
3694
+ // Include accumulated reasoning_details so the AI SDK can update
3695
+ // the reasoning part's providerMetadata with the correct signature.
3696
+ providerMetadata: accumulatedReasoningDetails.length > 0 ? {
3697
+ openrouter: {
3698
+ reasoning_details: accumulatedReasoningDetails
3699
+ }
3700
+ } : void 0
3620
3701
  });
3621
3702
  }
3622
3703
  if (textStarted) {
@@ -4407,7 +4488,7 @@ function withUserAgentSuffix2(headers, ...userAgentSuffixParts) {
4407
4488
  }
4408
4489
 
4409
4490
  // src/version.ts
4410
- var VERSION2 = false ? "0.0.0-test" : "2.1.0";
4491
+ var VERSION2 = false ? "0.0.0-test" : "2.1.2";
4411
4492
 
4412
4493
  // src/provider.ts
4413
4494
  function createOpenRouter(options = {}) {