@ai-sdk/xai 5.0.6 → 5.0.8

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,22 @@
1
1
  # @ai-sdk/xai
2
2
 
3
+ ## 5.0.8
4
+
5
+ ### Patch Changes
6
+
7
+ - 5434a34: feat(xai): add missing video provider options
8
+ - 0a5dd0f: feat(xai): add missing Responses API provider options
9
+
10
+ ## 5.0.7
11
+
12
+ ### Patch Changes
13
+
14
+ - 771e74b: chore: enable dead code lint rules
15
+ - Updated dependencies [fe07867]
16
+ - Updated dependencies [a4b0940]
17
+ - Updated dependencies [771e74b]
18
+ - @ai-sdk/provider-utils@5.0.47
19
+
3
20
  ## 5.0.6
4
21
 
5
22
  ### Patch Changes
package/dist/index.d.ts CHANGED
@@ -46,14 +46,24 @@ declare const xaiLanguageModelResponsesOptions: z.ZodObject<{
46
46
  }>>;
47
47
  logprobs: z.ZodOptional<z.ZodBoolean>;
48
48
  topLogprobs: z.ZodOptional<z.ZodNumber>;
49
+ minP: z.ZodOptional<z.ZodNumber>;
50
+ maxTurns: z.ZodOptional<z.ZodNumber>;
51
+ parallelToolCalls: z.ZodOptional<z.ZodBoolean>;
52
+ promptCacheKey: z.ZodOptional<z.ZodString>;
53
+ safetyIdentifier: z.ZodOptional<z.ZodString>;
49
54
  serviceTier: z.ZodOptional<z.ZodEnum<{
50
55
  default: "default";
51
56
  priority: "priority";
52
57
  }>>;
53
58
  store: z.ZodOptional<z.ZodBoolean>;
54
59
  previousResponseId: z.ZodOptional<z.ZodString>;
60
+ user: z.ZodOptional<z.ZodString>;
55
61
  include: z.ZodOptional<z.ZodNullable<z.ZodArray<z.ZodEnum<{
56
62
  "file_search_call.results": "file_search_call.results";
63
+ "web_search_call.action.sources": "web_search_call.action.sources";
64
+ "code_interpreter_call.outputs": "code_interpreter_call.outputs";
65
+ "reasoning.encrypted_content": "reasoning.encrypted_content";
66
+ no_inline_citations: "no_inline_citations";
57
67
  }>>>>;
58
68
  }, z.core.$strip>;
59
69
  type XaiLanguageModelResponsesOptions = z.infer<typeof xaiLanguageModelResponsesOptions>;
@@ -83,10 +93,25 @@ declare const resolutionSchema: z.ZodEnum<{
83
93
  "1080p": "1080p";
84
94
  }>;
85
95
  type XaiVideoResolution = z.infer<typeof resolutionSchema>;
96
+ declare const keyframeSchema: z.ZodObject<{
97
+ imageUrl: z.ZodString;
98
+ timestampSeconds: z.ZodNumber;
99
+ }, z.core.$strip>;
100
+ declare const storageOptionsSchema: z.ZodObject<{
101
+ filename: z.ZodString;
102
+ expiresAfter: z.ZodOptional<z.ZodNumber>;
103
+ publicUrl: z.ZodOptional<z.ZodUnion<readonly [z.ZodBoolean, z.ZodObject<{
104
+ expiresAfter: z.ZodOptional<z.ZodNumber>;
105
+ }, z.core.$strip>]>>;
106
+ }, z.core.$strip>;
107
+ type XaiVideoKeyframe = z.infer<typeof keyframeSchema>;
108
+ type XaiVideoStorageOptions = z.infer<typeof storageOptionsSchema>;
86
109
  interface XaiVideoSharedOptions {
87
110
  pollIntervalMs?: number | null;
88
111
  pollTimeoutMs?: number | null;
89
112
  resolution?: XaiVideoResolution | null;
113
+ /** Store the generated video in the xAI Files API. */
114
+ storageOptions?: XaiVideoStorageOptions;
90
115
  }
91
116
  interface XaiVideoUserOptions {
92
117
  /**
@@ -126,6 +151,8 @@ interface XaiVideoGenerationOptions extends XaiVideoSharedOptions, XaiVideoUserO
126
151
  mode?: undefined;
127
152
  videoUrl?: undefined;
128
153
  referenceImageUrls?: undefined;
154
+ /** Mid-video image anchors (up to 4). */
155
+ keyframes?: XaiVideoKeyframe[];
129
156
  }
130
157
  interface XaiLegacyEditVideoOptions extends XaiVideoSharedOptions, XaiVideoUserOptions {
131
158
  /**
package/dist/index.js CHANGED
@@ -806,7 +806,9 @@ var xaiResponsesResponseSchema = z6.object({
806
806
  output: z6.array(outputItemSchema),
807
807
  usage: xaiResponsesUsageSchema.nullish(),
808
808
  status: z6.string(),
809
- service_tier: z6.string().nullish()
809
+ service_tier: z6.string().nullish(),
810
+ prompt_cache_key: z6.string().nullish(),
811
+ safety_identifier: z6.string().nullish()
810
812
  });
811
813
  var xaiResponsesChunkSchema = z6.union([
812
814
  z6.object({
@@ -1090,7 +1092,9 @@ var xaiResponsesChunkSchema = z6.union([
1090
1092
  response: z6.object({
1091
1093
  incomplete_details: z6.object({ reason: z6.string() }).nullish(),
1092
1094
  usage: xaiResponsesUsageSchema.nullish(),
1093
- service_tier: z6.string().nullish()
1095
+ service_tier: z6.string().nullish(),
1096
+ prompt_cache_key: z6.string().nullish(),
1097
+ safety_identifier: z6.string().nullish()
1094
1098
  })
1095
1099
  }),
1096
1100
  z6.object({
@@ -1133,9 +1137,23 @@ var xaiLanguageModelResponsesOptions = z7.object({
1133
1137
  * @see https://docs.x.ai/docs/guides/reasoning
1134
1138
  */
1135
1139
  reasoningEffort: z7.enum(["none", "low", "medium", "high", "xhigh"]).optional(),
1140
+ /**
1141
+ * @deprecated xAI ignores the requested summary level and always returns a
1142
+ * detailed reasoning summary.
1143
+ */
1136
1144
  reasoningSummary: z7.enum(["auto", "concise", "detailed"]).optional(),
1137
1145
  logprobs: z7.boolean().optional(),
1138
1146
  topLogprobs: z7.number().int().min(0).max(8).optional(),
1147
+ /** Min-p sampling threshold between 0 and 1. */
1148
+ minP: z7.number().min(0).max(1).optional(),
1149
+ /** Maximum number of agentic tool-calling turns. */
1150
+ maxTurns: z7.number().int().optional(),
1151
+ /** Whether the model may call tools in parallel. @default true */
1152
+ parallelToolCalls: z7.boolean().optional(),
1153
+ /** Cache key used to route requests with shared prompt prefixes. */
1154
+ promptCacheKey: z7.string().optional(),
1155
+ /** Stable identifier used to attribute policy violations to an end user. */
1156
+ safetyIdentifier: z7.string().optional(),
1139
1157
  serviceTier: z7.enum(["default", "priority"]).optional(),
1140
1158
  /**
1141
1159
  * Whether to store the input message(s) and model response for later retrieval.
@@ -1148,11 +1166,21 @@ var xaiLanguageModelResponsesOptions = z7.object({
1148
1166
  * The ID of the previous response from the model.
1149
1167
  */
1150
1168
  previousResponseId: z7.string().optional(),
1169
+ /** A unique identifier for the end user, used for abuse monitoring. */
1170
+ user: z7.string().optional(),
1151
1171
  /**
1152
1172
  * Specify additional output data to include in the model response.
1153
1173
  * Example values: 'file_search_call.results'.
1154
1174
  */
1155
- include: z7.array(z7.enum(["file_search_call.results"])).nullish()
1175
+ include: z7.array(
1176
+ z7.enum([
1177
+ "file_search_call.results",
1178
+ "web_search_call.action.sources",
1179
+ "code_interpreter_call.outputs",
1180
+ "reasoning.encrypted_content",
1181
+ "no_inline_citations"
1182
+ ])
1183
+ ).nullish()
1156
1184
  });
1157
1185
 
1158
1186
  // src/responses/xai-responses-prepare-tools.ts
@@ -1625,9 +1653,6 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
1625
1653
  providerOptions,
1626
1654
  schema: xaiLanguageModelResponsesOptions
1627
1655
  })) != null ? _a : {};
1628
- if (topK != null) {
1629
- warnings.push({ type: "unsupported", feature: "topK" });
1630
- }
1631
1656
  if (frequencyPenalty != null) {
1632
1657
  warnings.push({ type: "unsupported", feature: "frequencyPenalty" });
1633
1658
  }
@@ -1709,6 +1734,8 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
1709
1734
  max_output_tokens: maxOutputTokens,
1710
1735
  temperature,
1711
1736
  top_p: topP,
1737
+ top_k: topK,
1738
+ min_p: options.minP,
1712
1739
  seed,
1713
1740
  ...(responseFormat == null ? void 0 : responseFormat.type) === "json" && {
1714
1741
  text: {
@@ -1721,14 +1748,9 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
1721
1748
  } : { type: "json_object" }
1722
1749
  }
1723
1750
  },
1724
- ...(resolvedReasoningEffort != null || options.reasoningSummary != null) && {
1751
+ ...resolvedReasoningEffort != null && {
1725
1752
  reasoning: {
1726
- ...resolvedReasoningEffort != null && {
1727
- effort: resolvedReasoningEffort
1728
- },
1729
- ...options.reasoningSummary != null && {
1730
- summary: options.reasoningSummary
1731
- }
1753
+ effort: resolvedReasoningEffort
1732
1754
  }
1733
1755
  },
1734
1756
  ...options.store === false && {
@@ -1740,8 +1762,23 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
1740
1762
  ...options.previousResponseId != null && {
1741
1763
  previous_response_id: options.previousResponseId
1742
1764
  },
1765
+ ...options.maxTurns != null && {
1766
+ max_turns: options.maxTurns
1767
+ },
1768
+ ...options.parallelToolCalls != null && {
1769
+ parallel_tool_calls: options.parallelToolCalls
1770
+ },
1771
+ ...options.promptCacheKey != null && {
1772
+ prompt_cache_key: options.promptCacheKey
1773
+ },
1774
+ ...options.safetyIdentifier != null && {
1775
+ safety_identifier: options.safetyIdentifier
1776
+ },
1743
1777
  ...options.serviceTier != null && {
1744
1778
  service_tier: options.serviceTier
1779
+ },
1780
+ ...options.user != null && {
1781
+ user: options.user
1745
1782
  }
1746
1783
  };
1747
1784
  if (xaiTools2 && xaiTools2.length > 0) {
@@ -1964,7 +2001,7 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
1964
2001
  inputTokens: { total: 0, noCache: 0, cacheRead: 0, cacheWrite: 0 },
1965
2002
  outputTokens: { total: 0, text: 0, reasoning: 0 }
1966
2003
  },
1967
- ...(((_q = response.usage) == null ? void 0 : _q.cost_in_usd_ticks) != null || response.service_tier != null) && {
2004
+ ...(((_q = response.usage) == null ? void 0 : _q.cost_in_usd_ticks) != null || response.service_tier != null || response.prompt_cache_key != null || response.safety_identifier != null) && {
1968
2005
  providerMetadata: {
1969
2006
  xai: {
1970
2007
  ...((_r = response.usage) == null ? void 0 : _r.cost_in_usd_ticks) != null && {
@@ -1972,6 +2009,12 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
1972
2009
  },
1973
2010
  ...response.service_tier != null && {
1974
2011
  serviceTier: response.service_tier
2012
+ },
2013
+ ...response.prompt_cache_key != null && {
2014
+ promptCacheKey: response.prompt_cache_key
2015
+ },
2016
+ ...response.safety_identifier != null && {
2017
+ safetyIdentifier: response.safety_identifier
1975
2018
  }
1976
2019
  }
1977
2020
  }
@@ -2020,6 +2063,8 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
2020
2063
  let usage = void 0;
2021
2064
  let costInUsdTicks = void 0;
2022
2065
  let serviceTier = void 0;
2066
+ let promptCacheKey = void 0;
2067
+ let safetyIdentifier = void 0;
2023
2068
  let isFirstChunk = true;
2024
2069
  const contentBlocks = {};
2025
2070
  const seenToolCalls = /* @__PURE__ */ new Set();
@@ -2033,7 +2078,7 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
2033
2078
  controller.enqueue({ type: "stream-start", warnings });
2034
2079
  },
2035
2080
  transform(chunk, controller) {
2036
- var _a2, _b2, _c2, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q;
2081
+ var _a2, _b2, _c2, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s;
2037
2082
  if (options.includeRawChunks) {
2038
2083
  controller.enqueue({ type: "raw", rawValue: chunk.rawValue });
2039
2084
  }
@@ -2165,8 +2210,10 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
2165
2210
  costInUsdTicks = (_c2 = response2.usage.cost_in_usd_ticks) != null ? _c2 : void 0;
2166
2211
  }
2167
2212
  serviceTier = (_d = response2.service_tier) != null ? _d : void 0;
2213
+ promptCacheKey = (_e = response2.prompt_cache_key) != null ? _e : void 0;
2214
+ safetyIdentifier = (_f = response2.safety_identifier) != null ? _f : void 0;
2168
2215
  if (event.type === "response.incomplete") {
2169
- const reason = "incomplete_details" in response2 ? (_e = response2.incomplete_details) == null ? void 0 : _e.reason : void 0;
2216
+ const reason = "incomplete_details" in response2 ? (_g = response2.incomplete_details) == null ? void 0 : _g.reason : void 0;
2170
2217
  finishReason = {
2171
2218
  unified: reason ? mapXaiResponsesFinishReason(reason) : "other",
2172
2219
  raw: reason != null ? reason : "incomplete"
@@ -2180,7 +2227,7 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
2180
2227
  return;
2181
2228
  }
2182
2229
  if (event.type === "response.failed") {
2183
- const reason = (_f = event.response.incomplete_details) == null ? void 0 : _f.reason;
2230
+ const reason = (_h = event.response.incomplete_details) == null ? void 0 : _h.reason;
2184
2231
  finishReason = {
2185
2232
  unified: reason ? mapXaiResponsesFinishReason(reason) : "error",
2186
2233
  raw: reason != null ? reason : "error"
@@ -2323,13 +2370,13 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
2323
2370
  toolCallId: part.id,
2324
2371
  toolName,
2325
2372
  result: {
2326
- queries: (_g = part.queries) != null ? _g : [],
2327
- results: (_i = (_h = part.results) == null ? void 0 : _h.map((result) => ({
2373
+ queries: (_i = part.queries) != null ? _i : [],
2374
+ results: (_k = (_j = part.results) == null ? void 0 : _j.map((result) => ({
2328
2375
  fileId: result.file_id,
2329
2376
  filename: result.filename,
2330
2377
  score: result.score,
2331
2378
  text: result.text
2332
- }))) != null ? _i : null
2379
+ }))) != null ? _k : null
2333
2380
  }
2334
2381
  });
2335
2382
  }
@@ -2396,17 +2443,17 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
2396
2443
  "x_semantic_search",
2397
2444
  "x_thread_fetch"
2398
2445
  ];
2399
- let toolName = (_j = part.name) != null ? _j : "";
2400
- if (webSearchSubTools.includes((_k = part.name) != null ? _k : "") || part.type === "web_search_call") {
2446
+ let toolName = (_l = part.name) != null ? _l : "";
2447
+ if (webSearchSubTools.includes((_m = part.name) != null ? _m : "") || part.type === "web_search_call") {
2401
2448
  toolName = webSearchToolName != null ? webSearchToolName : "web_search";
2402
- } else if (xSearchSubTools.includes((_l = part.name) != null ? _l : "") || part.type === "x_search_call") {
2449
+ } else if (xSearchSubTools.includes((_n = part.name) != null ? _n : "") || part.type === "x_search_call") {
2403
2450
  toolName = xSearchToolName != null ? xSearchToolName : "x_search";
2404
2451
  } else if (part.name === "code_execution" || part.type === "code_interpreter_call" || part.type === "code_execution_call") {
2405
2452
  toolName = codeExecutionToolName != null ? codeExecutionToolName : "code_execution";
2406
2453
  } else if (part.type === "mcp_call") {
2407
- toolName = (_m = mcpToolName != null ? mcpToolName : part.name) != null ? _m : "mcp";
2454
+ toolName = (_o = mcpToolName != null ? mcpToolName : part.name) != null ? _o : "mcp";
2408
2455
  }
2409
- const toolInput = part.type === "custom_tool_call" ? (_n = part.input) != null ? _n : "" : part.type === "mcp_call" ? (_o = part.arguments) != null ? _o : "" : (_p = part.arguments) != null ? _p : "";
2456
+ const toolInput = part.type === "custom_tool_call" ? (_p = part.input) != null ? _p : "" : part.type === "mcp_call" ? (_q = part.arguments) != null ? _q : "" : (_r = part.arguments) != null ? _r : "";
2410
2457
  const shouldEmit = part.type === "custom_tool_call" ? event.type === "response.output_item.done" : !seenToolCalls.has(part.id);
2411
2458
  if (shouldEmit && !seenToolCalls.has(part.id)) {
2412
2459
  seenToolCalls.add(part.id);
@@ -2467,7 +2514,7 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
2467
2514
  sourceType: "url",
2468
2515
  id: self.config.generateId(),
2469
2516
  url: annotation.url,
2470
- title: (_q = annotation.title) != null ? _q : annotation.url
2517
+ title: (_s = annotation.title) != null ? _s : annotation.url
2471
2518
  });
2472
2519
  }
2473
2520
  }
@@ -2522,11 +2569,13 @@ var XaiResponsesLanguageModel = class _XaiResponsesLanguageModel {
2522
2569
  },
2523
2570
  outputTokens: { total: 0, text: 0, reasoning: 0 }
2524
2571
  },
2525
- ...(costInUsdTicks != null || serviceTier != null) && {
2572
+ ...(costInUsdTicks != null || serviceTier != null || promptCacheKey != null || safetyIdentifier != null) && {
2526
2573
  providerMetadata: {
2527
2574
  xai: {
2528
2575
  ...costInUsdTicks != null && { costInUsdTicks },
2529
- ...serviceTier != null && { serviceTier }
2576
+ ...serviceTier != null && { serviceTier },
2577
+ ...promptCacheKey != null && { promptCacheKey },
2578
+ ...safetyIdentifier != null && { safetyIdentifier }
2530
2579
  }
2531
2580
  }
2532
2581
  }
@@ -3670,7 +3719,7 @@ var xaiTools = {
3670
3719
  };
3671
3720
 
3672
3721
  // src/version.ts
3673
- var VERSION = true ? "5.0.6" : "0.0.0-test";
3722
+ var VERSION = true ? "5.0.8" : "0.0.0-test";
3674
3723
 
3675
3724
  // src/files/xai-files.ts
3676
3725
  import {
@@ -3947,6 +3996,20 @@ import { z as z18 } from "zod/v4";
3947
3996
  var nonEmptyStringSchema = z18.string().min(1);
3948
3997
  var resolutionSchema = z18.enum(["480p", "720p", "1080p"]);
3949
3998
  var modeSchema = z18.enum(["edit-video", "extend-video", "reference-to-video"]);
3999
+ var keyframeSchema = z18.object({
4000
+ imageUrl: nonEmptyStringSchema,
4001
+ timestampSeconds: z18.number().positive()
4002
+ });
4003
+ var storageOptionsSchema = z18.object({
4004
+ filename: nonEmptyStringSchema,
4005
+ expiresAfter: z18.number().int().positive().max(2592e3).optional(),
4006
+ publicUrl: z18.union([
4007
+ z18.boolean(),
4008
+ z18.object({
4009
+ expiresAfter: z18.number().int().min(3600).max(2592e3).optional()
4010
+ })
4011
+ ]).optional()
4012
+ });
3950
4013
  var baseFields = {
3951
4014
  pollIntervalMs: z18.number().positive().nullish(),
3952
4015
  pollTimeoutMs: z18.number().positive().nullish(),
@@ -3957,6 +4020,8 @@ var runtimeSchema = z18.looseObject({
3957
4020
  videoUrl: nonEmptyStringSchema.optional(),
3958
4021
  referenceImageUrls: z18.array(nonEmptyStringSchema).min(1).max(7).optional(),
3959
4022
  referenceVoiceIds: z18.array(nonEmptyStringSchema).max(3).optional(),
4023
+ keyframes: z18.array(keyframeSchema).max(4).optional(),
4024
+ storageOptions: storageOptionsSchema.optional(),
3960
4025
  user: z18.string().optional(),
3961
4026
  ...baseFields
3962
4027
  });
@@ -3989,6 +4054,7 @@ function resolveStartImage(options) {
3989
4054
  }
3990
4055
  var isVideoFile = (file) => file.mediaType != null && getTopLevelMediaType2(file.mediaType) === "video";
3991
4056
  var isImageReference = (file) => file.mediaType == null || getTopLevelMediaType2(file.mediaType) === "image";
4057
+ var isAudioReference = (file) => file.mediaType != null && getTopLevelMediaType2(file.mediaType) === "audio";
3992
4058
  function fileToXaiUrl(file) {
3993
4059
  if (file.type === "url") {
3994
4060
  return file.url;
@@ -4000,11 +4066,14 @@ function resolveReferences(options, xaiOptions, warnings) {
4000
4066
  if (options.inputReferences != null && options.inputReferences.length > 0) {
4001
4067
  const imageFiles = [];
4002
4068
  for (const reference of options.inputReferences) {
4069
+ if (isAudioReference(reference)) {
4070
+ continue;
4071
+ }
4003
4072
  if (!isImageReference(reference)) {
4004
4073
  warnings.push({
4005
4074
  type: "unsupported",
4006
4075
  feature: "inputReferences",
4007
- details: isVideoFile(reference) ? 'xAI reference-to-video accepts image references only. The video reference was ignored. Use providerOptions.xai.mode "extend-video" to continue from a video.' : "xAI reference-to-video accepts image references only. The non-image reference was ignored."
4076
+ details: 'xAI reference-to-video does not accept video references. The video reference was ignored. Use providerOptions.xai.mode "extend-video" to continue from a video.'
4008
4077
  });
4009
4078
  continue;
4010
4079
  }
@@ -4015,12 +4084,20 @@ function resolveReferences(options, xaiOptions, warnings) {
4015
4084
  if ((xaiOptions == null ? void 0 : xaiOptions.referenceImageUrls) != null && xaiOptions.referenceImageUrls.length > 0) {
4016
4085
  return xaiOptions.referenceImageUrls.map((url) => ({ url }));
4017
4086
  }
4018
- return void 0;
4087
+ }
4088
+ function resolveReferenceAudios(options) {
4089
+ var _a;
4090
+ const audioReferences = (_a = options.inputReferences) == null ? void 0 : _a.filter(isAudioReference);
4091
+ return audioReferences != null && audioReferences.length > 0 ? audioReferences.map((reference) => ({ url: fileToXaiUrl(reference) })) : void 0;
4019
4092
  }
4020
4093
  function hasImageInputReference(options) {
4021
4094
  var _a, _b;
4022
4095
  return (_b = (_a = options.inputReferences) == null ? void 0 : _a.some(isImageReference)) != null ? _b : false;
4023
4096
  }
4097
+ function hasAudioInputReference(options) {
4098
+ var _a, _b;
4099
+ return (_b = (_a = options.inputReferences) == null ? void 0 : _a.some(isAudioReference)) != null ? _b : false;
4100
+ }
4024
4101
  function resolveVideoMode(options, xaiOptions) {
4025
4102
  if ((xaiOptions == null ? void 0 : xaiOptions.mode) != null) {
4026
4103
  return xaiOptions.mode;
@@ -4028,12 +4105,10 @@ function resolveVideoMode(options, xaiOptions) {
4028
4105
  if ((xaiOptions == null ? void 0 : xaiOptions.videoUrl) != null) {
4029
4106
  return "edit-video";
4030
4107
  }
4031
- const hasFrameImages = options.frameImages != null && options.frameImages.length > 0;
4032
4108
  const hasLegacyReferenceUrls = (xaiOptions == null ? void 0 : xaiOptions.referenceImageUrls) != null && xaiOptions.referenceImageUrls.length > 0;
4033
- if (!hasFrameImages && (hasImageInputReference(options) || hasLegacyReferenceUrls)) {
4109
+ if (hasImageInputReference(options) || hasAudioInputReference(options) || hasLegacyReferenceUrls) {
4034
4110
  return "reference-to-video";
4035
4111
  }
4036
- return void 0;
4037
4112
  }
4038
4113
  var XaiVideoModel = class {
4039
4114
  constructor(modelId, config) {
@@ -4139,6 +4214,41 @@ var XaiVideoModel = class {
4139
4214
  });
4140
4215
  }
4141
4216
  }
4217
+ if (options.generateAudio != null && !isEdit && !isExtension) {
4218
+ body.generate_audio = options.generateAudio;
4219
+ } else if (options.generateAudio != null) {
4220
+ warnings.push({
4221
+ type: "unsupported",
4222
+ feature: "generateAudio",
4223
+ details: `xAI ${isEdit ? "video editing" : "video extension"} does not support generateAudio.`
4224
+ });
4225
+ }
4226
+ if ((xaiOptions == null ? void 0 : xaiOptions.storageOptions) != null) {
4227
+ const { filename, expiresAfter, publicUrl } = xaiOptions.storageOptions;
4228
+ body.storage_options = {
4229
+ filename,
4230
+ ...expiresAfter != null ? { expires_after: expiresAfter } : {},
4231
+ ...publicUrl != null ? {
4232
+ public_url: typeof publicUrl === "boolean" ? publicUrl : {
4233
+ ...publicUrl.expiresAfter != null ? { expires_after: publicUrl.expiresAfter } : {}
4234
+ }
4235
+ } : {}
4236
+ };
4237
+ }
4238
+ if ((xaiOptions == null ? void 0 : xaiOptions.keyframes) != null && xaiOptions.keyframes.length > 0) {
4239
+ if (this.modelId !== "grok-imagine-video-1.5" || isEdit || isExtension) {
4240
+ warnings.push({
4241
+ type: "unsupported",
4242
+ feature: "keyframes",
4243
+ details: this.modelId !== "grok-imagine-video-1.5" ? 'xAI only supports keyframes with "grok-imagine-video-1.5".' : `xAI ${isEdit ? "video editing" : "video extension"} does not support keyframes.`
4244
+ });
4245
+ } else {
4246
+ body.keyframes = xaiOptions.keyframes.map((keyframe) => ({
4247
+ image: { url: keyframe.imageUrl },
4248
+ timestamp_s: keyframe.timestampSeconds
4249
+ }));
4250
+ }
4251
+ }
4142
4252
  if (isEdit) {
4143
4253
  body.video = { url: xaiOptions.videoUrl };
4144
4254
  }
@@ -4160,17 +4270,22 @@ var XaiVideoModel = class {
4160
4270
  }
4161
4271
  const lastFrameImage = getLastFrameImage(options);
4162
4272
  if (lastFrameImage != null) {
4163
- warnings.push({
4164
- type: "unsupported",
4165
- feature: "frameImages",
4166
- details: isVideoFile(lastFrameImage) ? 'xAI does not accept a video as a start/frame image. The video last frame was ignored. Use providerOptions.xai.mode "extend-video" to continue from a video instead.' : `xAI video models do not support last_frame. Use providerOptions.xai.mode "extend-video" to continue from a video's last frame. The last frame image was ignored.`
4167
- });
4273
+ if (this.modelId !== "grok-imagine-video-1.5" || isEdit || isExtension || isVideoFile(lastFrameImage)) {
4274
+ warnings.push({
4275
+ type: "unsupported",
4276
+ feature: "frameImages",
4277
+ details: this.modelId !== "grok-imagine-video-1.5" ? 'xAI only supports last_frame with "grok-imagine-video-1.5". The last frame was ignored.' : "xAI only accepts an image last_frame for video generation. The last frame was ignored."
4278
+ });
4279
+ } else {
4280
+ body.last_frame = { url: fileToXaiUrl(lastFrameImage) };
4281
+ }
4168
4282
  }
4169
4283
  if (hasReferenceImages) {
4170
4284
  const referenceImages = resolveReferences(options, xaiOptions, warnings);
4285
+ const referenceAudios = resolveReferenceAudios(options);
4171
4286
  if (referenceImages != null) {
4172
4287
  body.reference_images = referenceImages;
4173
- } else {
4288
+ } else if (referenceAudios == null) {
4174
4289
  warnings.push({
4175
4290
  type: "unsupported",
4176
4291
  feature: "referenceImages",
@@ -4178,10 +4293,22 @@ var XaiVideoModel = class {
4178
4293
  });
4179
4294
  }
4180
4295
  const referenceVoiceIds = xaiOptions == null ? void 0 : xaiOptions.referenceVoiceIds;
4181
- if (referenceVoiceIds != null && referenceVoiceIds.length > 0) {
4182
- body.reference_audios = referenceVoiceIds.map((voiceId) => ({
4183
- voice_id: voiceId
4184
- }));
4296
+ const referenceVoices = referenceVoiceIds == null ? void 0 : referenceVoiceIds.map((voiceId) => ({
4297
+ voice_id: voiceId
4298
+ }));
4299
+ const referenceAudioInputs = [
4300
+ ...referenceAudios != null ? referenceAudios : [],
4301
+ ...referenceVoices != null ? referenceVoices : []
4302
+ ];
4303
+ if (referenceAudioInputs.length > 0) {
4304
+ if (referenceAudioInputs.length > 3) {
4305
+ warnings.push({
4306
+ type: "unsupported",
4307
+ feature: "inputReferences",
4308
+ details: "xAI reference-to-video supports at most 3 audio references. Only the first 3 were used."
4309
+ });
4310
+ }
4311
+ body.reference_audios = referenceAudioInputs.slice(0, 3);
4185
4312
  }
4186
4313
  if (body.resolution === "1080p") {
4187
4314
  warnings.push({
@@ -4203,7 +4330,7 @@ var XaiVideoModel = class {
4203
4330
  warnings.push({
4204
4331
  type: "unsupported",
4205
4332
  feature: "inputReferences",
4206
- details: hasImageInputReference(options) ? "xAI only supports inputReferences for reference-to-video generation. The reference images were ignored." : "xAI reference-to-video requires at least one image reference. The references were ignored."
4333
+ details: hasImageInputReference(options) || hasAudioInputReference(options) ? "xAI only supports inputReferences for reference-to-video generation. The references were ignored." : "xAI reference-to-video requires at least one image or audio reference. The references were ignored."
4207
4334
  });
4208
4335
  }
4209
4336
  if ((xaiOptions == null ? void 0 : xaiOptions.referenceVoiceIds) != null && xaiOptions.referenceVoiceIds.length > 0 && !hasReferenceImages) {
@@ -4226,6 +4353,8 @@ var XaiVideoModel = class {
4226
4353
  "videoUrl",
4227
4354
  "referenceImageUrls",
4228
4355
  "referenceVoiceIds",
4356
+ "keyframes",
4357
+ "storageOptions",
4229
4358
  "user"
4230
4359
  ].includes(key)) {
4231
4360
  body[key] = value;
@@ -4284,7 +4413,7 @@ var XaiVideoModel = class {
4284
4413
  };
4285
4414
  }
4286
4415
  async doStatus(options) {
4287
- var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
4416
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
4288
4417
  const currentDate = (_c = (_b = (_a = this.config._internal) == null ? void 0 : _a.currentDate) == null ? void 0 : _b.call(_a)) != null ? _c : /* @__PURE__ */ new Date();
4289
4418
  const { requestId } = options.operation;
4290
4419
  const baseURL = (_d = this.config.baseURL) != null ? _d : "https://api.x.ai/v1";
@@ -4321,7 +4450,8 @@ var XaiVideoModel = class {
4321
4450
  };
4322
4451
  }
4323
4452
  if (statusResponse.status === "done" || statusResponse.status == null && ((_h = statusResponse.video) == null ? void 0 : _h.url)) {
4324
- if (((_i = statusResponse.video) == null ? void 0 : _i.respect_moderation) === false) {
4453
+ const video = statusResponse.video;
4454
+ if ((video == null ? void 0 : video.respect_moderation) === false) {
4325
4455
  return {
4326
4456
  status: "error",
4327
4457
  error: "Video generation was blocked due to a content policy violation.",
@@ -4332,7 +4462,8 @@ var XaiVideoModel = class {
4332
4462
  }
4333
4463
  };
4334
4464
  }
4335
- if (!((_j = statusResponse.video) == null ? void 0 : _j.url)) {
4465
+ const videoUrl = (_k = (_j = video == null ? void 0 : video.url) != null ? _j : (_i = video == null ? void 0 : video.file_output) == null ? void 0 : _i.public_url) != null ? _k : void 0;
4466
+ if (!videoUrl) {
4336
4467
  return {
4337
4468
  status: "error",
4338
4469
  error: "Video generation completed but no video URL was returned.",
@@ -4345,13 +4476,7 @@ var XaiVideoModel = class {
4345
4476
  }
4346
4477
  return {
4347
4478
  status: "completed",
4348
- videos: [
4349
- {
4350
- type: "url",
4351
- url: statusResponse.video.url,
4352
- mediaType: "video/mp4"
4353
- }
4354
- ],
4479
+ videos: [{ type: "url", url: videoUrl, mediaType: "video/mp4" }],
4355
4480
  warnings: [],
4356
4481
  response: {
4357
4482
  timestamp: currentDate,
@@ -4361,10 +4486,29 @@ var XaiVideoModel = class {
4361
4486
  providerMetadata: {
4362
4487
  xai: {
4363
4488
  requestId,
4364
- videoUrl: statusResponse.video.url,
4365
- ...statusResponse.video.duration != null ? { duration: statusResponse.video.duration } : {},
4366
- ...((_k = statusResponse.usage) == null ? void 0 : _k.cost_in_usd_ticks) != null ? { costInUsdTicks: statusResponse.usage.cost_in_usd_ticks } : {},
4367
- ...statusResponse.progress != null ? { progress: statusResponse.progress } : {}
4489
+ videoUrl,
4490
+ ...(video == null ? void 0 : video.duration) != null ? { duration: video.duration } : {},
4491
+ ...((_l = statusResponse.usage) == null ? void 0 : _l.cost_in_usd_ticks) != null ? { costInUsdTicks: statusResponse.usage.cost_in_usd_ticks } : {},
4492
+ ...statusResponse.progress != null ? { progress: statusResponse.progress } : {},
4493
+ ...(video == null ? void 0 : video.file_output) != null ? {
4494
+ fileOutput: {
4495
+ fileId: video.file_output.file_id,
4496
+ filename: video.file_output.filename,
4497
+ ...video.file_output.expires_at != null ? {
4498
+ expiresAt: video.file_output.expires_at
4499
+ } : {},
4500
+ ...video.file_output.public_url != null ? {
4501
+ publicUrl: video.file_output.public_url
4502
+ } : {},
4503
+ ...video.file_output.public_url_error != null ? {
4504
+ publicUrlError: video.file_output.public_url_error
4505
+ } : {},
4506
+ ...video.file_output.public_url_expires_at != null ? {
4507
+ publicUrlExpiresAt: video.file_output.public_url_expires_at
4508
+ } : {}
4509
+ }
4510
+ } : {},
4511
+ ...(video == null ? void 0 : video.storage_error) != null ? { storageError: video.storage_error } : {}
4368
4512
  }
4369
4513
  }
4370
4514
  };
@@ -4385,9 +4529,18 @@ var xaiCreateVideoResponseSchema = z19.object({
4385
4529
  var xaiVideoStatusResponseSchema = z19.object({
4386
4530
  status: z19.string().nullish(),
4387
4531
  video: z19.object({
4388
- url: z19.string(),
4532
+ url: z19.string().nullish(),
4389
4533
  duration: z19.number().nullish(),
4390
- respect_moderation: z19.boolean().nullish()
4534
+ respect_moderation: z19.boolean().nullish(),
4535
+ file_output: z19.object({
4536
+ file_id: z19.string(),
4537
+ filename: z19.string(),
4538
+ expires_at: z19.number().nullish(),
4539
+ public_url: z19.string().nullish(),
4540
+ public_url_error: z19.string().nullish(),
4541
+ public_url_expires_at: z19.number().nullish()
4542
+ }).nullish(),
4543
+ storage_error: z19.string().nullish()
4391
4544
  }).nullish(),
4392
4545
  model: z19.string().nullish(),
4393
4546
  usage: z19.object({