@ai-sdk/xai 2.0.60 → 2.0.61

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @ai-sdk/xai
2
2
 
3
+ ## 2.0.61
4
+
5
+ ### Patch Changes
6
+
7
+ - c80d906: fix(provider/xai): handle inconsistent cached token reporting
8
+
3
9
  ## 2.0.60
4
10
 
5
11
  ### Patch Changes
package/dist/index.js CHANGED
@@ -42,6 +42,30 @@ var import_provider3 = require("@ai-sdk/provider");
42
42
  var import_provider_utils3 = require("@ai-sdk/provider-utils");
43
43
  var import_v43 = require("zod/v4");
44
44
 
45
+ // src/convert-xai-chat-usage.ts
46
+ function convertXaiChatUsage(usage) {
47
+ var _a, _b, _c, _d;
48
+ if (usage == null) {
49
+ return {
50
+ inputTokens: void 0,
51
+ outputTokens: void 0,
52
+ totalTokens: void 0,
53
+ reasoningTokens: void 0,
54
+ cachedInputTokens: void 0
55
+ };
56
+ }
57
+ const cacheReadTokens = (_b = (_a = usage.prompt_tokens_details) == null ? void 0 : _a.cached_tokens) != null ? _b : 0;
58
+ const reasoningTokens = (_d = (_c = usage.completion_tokens_details) == null ? void 0 : _c.reasoning_tokens) != null ? _d : 0;
59
+ const promptTokensIncludesCached = cacheReadTokens <= usage.prompt_tokens;
60
+ return {
61
+ inputTokens: promptTokensIncludesCached ? usage.prompt_tokens : usage.prompt_tokens + cacheReadTokens,
62
+ outputTokens: usage.completion_tokens + reasoningTokens,
63
+ totalTokens: usage.total_tokens,
64
+ reasoningTokens: reasoningTokens || void 0,
65
+ cachedInputTokens: cacheReadTokens || void 0
66
+ };
67
+ }
68
+
45
69
  // src/convert-to-xai-chat-messages.ts
46
70
  var import_provider = require("@ai-sdk/provider");
47
71
  var import_provider_utils = require("@ai-sdk/provider-utils");
@@ -468,7 +492,7 @@ var XaiChatLanguageModel = class {
468
492
  };
469
493
  }
470
494
  async doGenerate(options) {
471
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;
495
+ var _a;
472
496
  const { args: body, warnings } = await this.getArgs(options);
473
497
  const url = `${(_a = this.config.baseURL) != null ? _a : "https://api.x.ai/v1"}/chat/completions`;
474
498
  const {
@@ -548,13 +572,7 @@ var XaiChatLanguageModel = class {
548
572
  return {
549
573
  content,
550
574
  finishReason: mapXaiFinishReason(choice.finish_reason),
551
- usage: {
552
- inputTokens: (_b = response.usage) == null ? void 0 : _b.prompt_tokens,
553
- outputTokens: ((_d = (_c = response.usage) == null ? void 0 : _c.completion_tokens) != null ? _d : 0) + ((_g = (_f = (_e = response.usage) == null ? void 0 : _e.completion_tokens_details) == null ? void 0 : _f.reasoning_tokens) != null ? _g : 0),
554
- totalTokens: (_h = response.usage) == null ? void 0 : _h.total_tokens,
555
- reasoningTokens: (_k = (_j = (_i = response.usage) == null ? void 0 : _i.completion_tokens_details) == null ? void 0 : _j.reasoning_tokens) != null ? _k : void 0,
556
- cachedInputTokens: (_n = (_m = (_l = response.usage) == null ? void 0 : _l.prompt_tokens_details) == null ? void 0 : _m.cached_tokens) != null ? _n : void 0
557
- },
575
+ usage: convertXaiChatUsage(response.usage),
558
576
  request: { body },
559
577
  response: {
560
578
  ...getResponseMetadata(response),
@@ -638,7 +656,6 @@ var XaiChatLanguageModel = class {
638
656
  controller.enqueue({ type: "stream-start", warnings });
639
657
  },
640
658
  transform(chunk, controller) {
641
- var _a2, _b, _c, _d, _e, _f, _g;
642
659
  if (options.includeRawChunks) {
643
660
  controller.enqueue({ type: "raw", rawValue: chunk.rawValue });
644
661
  }
@@ -665,11 +682,12 @@ var XaiChatLanguageModel = class {
665
682
  }
666
683
  }
667
684
  if (value.usage != null) {
668
- usage.inputTokens = value.usage.prompt_tokens;
669
- usage.outputTokens = ((_a2 = value.usage.completion_tokens) != null ? _a2 : 0) + ((_c = (_b = value.usage.completion_tokens_details) == null ? void 0 : _b.reasoning_tokens) != null ? _c : 0);
670
- usage.totalTokens = value.usage.total_tokens;
671
- usage.reasoningTokens = (_e = (_d = value.usage.completion_tokens_details) == null ? void 0 : _d.reasoning_tokens) != null ? _e : void 0;
672
- usage.cachedInputTokens = (_g = (_f = value.usage.prompt_tokens_details) == null ? void 0 : _f.cached_tokens) != null ? _g : void 0;
685
+ const converted = convertXaiChatUsage(value.usage);
686
+ usage.inputTokens = converted.inputTokens;
687
+ usage.outputTokens = converted.outputTokens;
688
+ usage.totalTokens = converted.totalTokens;
689
+ usage.reasoningTokens = converted.reasoningTokens;
690
+ usage.cachedInputTokens = converted.cachedInputTokens;
673
691
  }
674
692
  const choice = value.choices[0];
675
693
  if ((choice == null ? void 0 : choice.finish_reason) != null) {
@@ -864,6 +882,28 @@ var xaiStreamErrorSchema = import_v43.z.object({
864
882
  // src/responses/xai-responses-language-model.ts
865
883
  var import_provider_utils8 = require("@ai-sdk/provider-utils");
866
884
 
885
+ // src/responses/convert-xai-responses-usage.ts
886
+ function convertXaiResponsesUsage(usage) {
887
+ var _a, _b, _c, _d;
888
+ if (usage == null) {
889
+ return {
890
+ inputTokens: 0,
891
+ outputTokens: 0,
892
+ totalTokens: 0
893
+ };
894
+ }
895
+ const cacheReadTokens = (_b = (_a = usage.input_tokens_details) == null ? void 0 : _a.cached_tokens) != null ? _b : 0;
896
+ const reasoningTokens = (_d = (_c = usage.output_tokens_details) == null ? void 0 : _c.reasoning_tokens) != null ? _d : 0;
897
+ const inputTokensIncludesCached = cacheReadTokens <= usage.input_tokens;
898
+ return {
899
+ inputTokens: inputTokensIncludesCached ? usage.input_tokens : usage.input_tokens + cacheReadTokens,
900
+ outputTokens: usage.output_tokens,
901
+ totalTokens: usage.total_tokens,
902
+ reasoningTokens: reasoningTokens || void 0,
903
+ cachedInputTokens: cacheReadTokens || void 0
904
+ };
905
+ }
906
+
867
907
  // src/responses/xai-responses-api.ts
868
908
  var import_v44 = require("zod/v4");
869
909
  var annotationSchema = import_v44.z.union([
@@ -1717,7 +1757,7 @@ var XaiResponsesLanguageModel = class {
1717
1757
  };
1718
1758
  }
1719
1759
  async doGenerate(options) {
1720
- var _a, _b, _c, _d, _e, _f, _g, _h, _i;
1760
+ var _a, _b, _c, _d, _e, _f, _g;
1721
1761
  const {
1722
1762
  args: body,
1723
1763
  warnings,
@@ -1840,17 +1880,7 @@ var XaiResponsesLanguageModel = class {
1840
1880
  return {
1841
1881
  content,
1842
1882
  finishReason: mapXaiResponsesFinishReason(response.status),
1843
- usage: response.usage ? {
1844
- inputTokens: response.usage.input_tokens,
1845
- outputTokens: response.usage.output_tokens,
1846
- totalTokens: response.usage.total_tokens,
1847
- reasoningTokens: (_h = response.usage.output_tokens_details) == null ? void 0 : _h.reasoning_tokens,
1848
- cachedInputTokens: (_i = response.usage.input_tokens_details) == null ? void 0 : _i.cached_tokens
1849
- } : {
1850
- inputTokens: 0,
1851
- outputTokens: 0,
1852
- totalTokens: 0
1853
- },
1883
+ usage: convertXaiResponsesUsage(response.usage),
1854
1884
  request: { body },
1855
1885
  response: {
1856
1886
  ...getResponseMetadata(response),
@@ -1903,7 +1933,7 @@ var XaiResponsesLanguageModel = class {
1903
1933
  controller.enqueue({ type: "stream-start", warnings });
1904
1934
  },
1905
1935
  transform(chunk, controller) {
1906
- var _a2, _b, _c, _d, _e, _f, _g, _h, _i, _j;
1936
+ var _a2, _b, _c, _d, _e, _f, _g, _h;
1907
1937
  if (options.includeRawChunks) {
1908
1938
  controller.enqueue({ type: "raw", rawValue: chunk.rawValue });
1909
1939
  }
@@ -2028,11 +2058,12 @@ var XaiResponsesLanguageModel = class {
2028
2058
  if (event.type === "response.done" || event.type === "response.completed") {
2029
2059
  const response2 = event.response;
2030
2060
  if (response2.usage) {
2031
- usage.inputTokens = response2.usage.input_tokens;
2032
- usage.cachedInputTokens = (_c = response2.usage.input_tokens_details) == null ? void 0 : _c.cached_tokens;
2033
- usage.outputTokens = response2.usage.output_tokens;
2034
- usage.totalTokens = response2.usage.total_tokens;
2035
- usage.reasoningTokens = (_d = response2.usage.output_tokens_details) == null ? void 0 : _d.reasoning_tokens;
2061
+ const converted = convertXaiResponsesUsage(response2.usage);
2062
+ usage.inputTokens = converted.inputTokens;
2063
+ usage.outputTokens = converted.outputTokens;
2064
+ usage.totalTokens = converted.totalTokens;
2065
+ usage.reasoningTokens = converted.reasoningTokens;
2066
+ usage.cachedInputTokens = converted.cachedInputTokens;
2036
2067
  }
2037
2068
  if (response2.status) {
2038
2069
  finishReason = mapXaiResponsesFinishReason(response2.status);
@@ -2096,15 +2127,15 @@ var XaiResponsesLanguageModel = class {
2096
2127
  "x_semantic_search",
2097
2128
  "x_thread_fetch"
2098
2129
  ];
2099
- let toolName = (_e = part.name) != null ? _e : "";
2100
- if (webSearchSubTools.includes((_f = part.name) != null ? _f : "") || part.type === "web_search_call") {
2130
+ let toolName = (_c = part.name) != null ? _c : "";
2131
+ if (webSearchSubTools.includes((_d = part.name) != null ? _d : "") || part.type === "web_search_call") {
2101
2132
  toolName = webSearchToolName != null ? webSearchToolName : "web_search";
2102
- } else if (xSearchSubTools.includes((_g = part.name) != null ? _g : "") || part.type === "x_search_call") {
2133
+ } else if (xSearchSubTools.includes((_e = part.name) != null ? _e : "") || part.type === "x_search_call") {
2103
2134
  toolName = xSearchToolName != null ? xSearchToolName : "x_search";
2104
2135
  } else if (part.name === "code_execution" || part.type === "code_interpreter_call" || part.type === "code_execution_call") {
2105
2136
  toolName = codeExecutionToolName != null ? codeExecutionToolName : "code_execution";
2106
2137
  }
2107
- const toolInput = part.type === "custom_tool_call" ? (_h = part.input) != null ? _h : "" : (_i = part.arguments) != null ? _i : "";
2138
+ const toolInput = part.type === "custom_tool_call" ? (_f = part.input) != null ? _f : "" : (_g = part.arguments) != null ? _g : "";
2108
2139
  const shouldEmit = part.type === "custom_tool_call" ? event.type === "response.output_item.done" : !seenToolCalls.has(part.id);
2109
2140
  if (shouldEmit && !seenToolCalls.has(part.id)) {
2110
2141
  seenToolCalls.add(part.id);
@@ -2157,7 +2188,7 @@ var XaiResponsesLanguageModel = class {
2157
2188
  sourceType: "url",
2158
2189
  id: self.config.generateId(),
2159
2190
  url: annotation.url,
2160
- title: (_j = annotation.title) != null ? _j : annotation.url
2191
+ title: (_h = annotation.title) != null ? _h : annotation.url
2161
2192
  });
2162
2193
  }
2163
2194
  }
@@ -2265,7 +2296,7 @@ var xaiTools = {
2265
2296
  };
2266
2297
 
2267
2298
  // src/version.ts
2268
- var VERSION = true ? "2.0.60" : "0.0.0-test";
2299
+ var VERSION = true ? "2.0.61" : "0.0.0-test";
2269
2300
 
2270
2301
  // src/xai-provider.ts
2271
2302
  var xaiErrorStructure = {