ai 5.0.0-beta.20 → 5.0.0-beta.21

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,15 @@
1
1
  # ai
2
2
 
3
+ ## 5.0.0-beta.21
4
+
5
+ ### Patch Changes
6
+
7
+ - 38ae5cc: feat (ai): export InferUIMessageChunk type
8
+ - faea29f: fix (provider/openai): multi-step reasoning with text
9
+ - 90ac328: fix (ui): tool part metadata support in ui messages
10
+ - 4a1e0c8: fix(ai-cli): fix bundling and improve authentication error handling
11
+ - 30ac566: fix (ui): text message metadata support in ui messages
12
+
3
13
  ## 5.0.0-beta.20
4
14
 
5
15
  ### Patch Changes
package/dist/bin/ai.js CHANGED
@@ -24,6 +24,7 @@ __export(ai_exports, {
24
24
  formatAttachedFiles: () => formatAttachedFiles,
25
25
  getMediaType: () => getMediaType,
26
26
  isStdinAvailable: () => isStdinAvailable,
27
+ main: () => main,
27
28
  parseArgs: () => parseArgs,
28
29
  readFileContent: () => readFileContent,
29
30
  resolveModel: () => resolveModel,
@@ -192,125 +193,152 @@ function getResponseUIMessageId({
192
193
  var import_provider_utils2 = require("@ai-sdk/provider-utils");
193
194
 
194
195
  // src/ui-message-stream/ui-message-chunks.ts
196
+ var import_v43 = require("zod/v4");
197
+
198
+ // src/types/provider-metadata.ts
199
+ var import_v42 = require("zod/v4");
200
+
201
+ // src/types/json-value.ts
195
202
  var import_v4 = require("zod/v4");
196
- var uiMessageChunkSchema = import_v4.z.union([
197
- import_v4.z.strictObject({
198
- type: import_v4.z.literal("text-start"),
199
- id: import_v4.z.string()
203
+ var jsonValueSchema = import_v4.z.lazy(
204
+ () => import_v4.z.union([
205
+ import_v4.z.null(),
206
+ import_v4.z.string(),
207
+ import_v4.z.number(),
208
+ import_v4.z.boolean(),
209
+ import_v4.z.record(import_v4.z.string(), jsonValueSchema),
210
+ import_v4.z.array(jsonValueSchema)
211
+ ])
212
+ );
213
+
214
+ // src/types/provider-metadata.ts
215
+ var providerMetadataSchema = import_v42.z.record(
216
+ import_v42.z.string(),
217
+ import_v42.z.record(import_v42.z.string(), jsonValueSchema)
218
+ );
219
+
220
+ // src/ui-message-stream/ui-message-chunks.ts
221
+ var uiMessageChunkSchema = import_v43.z.union([
222
+ import_v43.z.strictObject({
223
+ type: import_v43.z.literal("text-start"),
224
+ id: import_v43.z.string(),
225
+ providerMetadata: providerMetadataSchema.optional()
200
226
  }),
201
- import_v4.z.strictObject({
202
- type: import_v4.z.literal("text-delta"),
203
- id: import_v4.z.string(),
204
- delta: import_v4.z.string()
227
+ import_v43.z.strictObject({
228
+ type: import_v43.z.literal("text-delta"),
229
+ id: import_v43.z.string(),
230
+ delta: import_v43.z.string(),
231
+ providerMetadata: providerMetadataSchema.optional()
205
232
  }),
206
- import_v4.z.strictObject({
207
- type: import_v4.z.literal("text-end"),
208
- id: import_v4.z.string()
233
+ import_v43.z.strictObject({
234
+ type: import_v43.z.literal("text-end"),
235
+ id: import_v43.z.string(),
236
+ providerMetadata: providerMetadataSchema.optional()
209
237
  }),
210
- import_v4.z.strictObject({
211
- type: import_v4.z.literal("error"),
212
- errorText: import_v4.z.string()
238
+ import_v43.z.strictObject({
239
+ type: import_v43.z.literal("error"),
240
+ errorText: import_v43.z.string()
213
241
  }),
214
- import_v4.z.strictObject({
215
- type: import_v4.z.literal("tool-input-start"),
216
- toolCallId: import_v4.z.string(),
217
- toolName: import_v4.z.string(),
218
- providerExecuted: import_v4.z.boolean().optional()
242
+ import_v43.z.strictObject({
243
+ type: import_v43.z.literal("tool-input-start"),
244
+ toolCallId: import_v43.z.string(),
245
+ toolName: import_v43.z.string(),
246
+ providerExecuted: import_v43.z.boolean().optional()
219
247
  }),
220
- import_v4.z.strictObject({
221
- type: import_v4.z.literal("tool-input-delta"),
222
- toolCallId: import_v4.z.string(),
223
- inputTextDelta: import_v4.z.string()
248
+ import_v43.z.strictObject({
249
+ type: import_v43.z.literal("tool-input-delta"),
250
+ toolCallId: import_v43.z.string(),
251
+ inputTextDelta: import_v43.z.string()
224
252
  }),
225
- import_v4.z.strictObject({
226
- type: import_v4.z.literal("tool-input-available"),
227
- toolCallId: import_v4.z.string(),
228
- toolName: import_v4.z.string(),
229
- input: import_v4.z.unknown(),
230
- providerExecuted: import_v4.z.boolean().optional()
253
+ import_v43.z.strictObject({
254
+ type: import_v43.z.literal("tool-input-available"),
255
+ toolCallId: import_v43.z.string(),
256
+ toolName: import_v43.z.string(),
257
+ input: import_v43.z.unknown(),
258
+ providerExecuted: import_v43.z.boolean().optional(),
259
+ providerMetadata: providerMetadataSchema.optional()
231
260
  }),
232
- import_v4.z.strictObject({
233
- type: import_v4.z.literal("tool-output-available"),
234
- toolCallId: import_v4.z.string(),
235
- output: import_v4.z.unknown(),
236
- providerExecuted: import_v4.z.boolean().optional()
261
+ import_v43.z.strictObject({
262
+ type: import_v43.z.literal("tool-output-available"),
263
+ toolCallId: import_v43.z.string(),
264
+ output: import_v43.z.unknown(),
265
+ providerExecuted: import_v43.z.boolean().optional()
237
266
  }),
238
- import_v4.z.strictObject({
239
- type: import_v4.z.literal("tool-output-error"),
240
- toolCallId: import_v4.z.string(),
241
- errorText: import_v4.z.string(),
242
- providerExecuted: import_v4.z.boolean().optional()
267
+ import_v43.z.strictObject({
268
+ type: import_v43.z.literal("tool-output-error"),
269
+ toolCallId: import_v43.z.string(),
270
+ errorText: import_v43.z.string(),
271
+ providerExecuted: import_v43.z.boolean().optional()
243
272
  }),
244
- import_v4.z.strictObject({
245
- type: import_v4.z.literal("reasoning"),
246
- text: import_v4.z.string(),
247
- providerMetadata: import_v4.z.record(import_v4.z.string(), import_v4.z.any()).optional()
273
+ import_v43.z.strictObject({
274
+ type: import_v43.z.literal("reasoning"),
275
+ text: import_v43.z.string(),
276
+ providerMetadata: providerMetadataSchema.optional()
248
277
  }),
249
- import_v4.z.strictObject({
250
- type: import_v4.z.literal("reasoning-start"),
251
- id: import_v4.z.string(),
252
- providerMetadata: import_v4.z.record(import_v4.z.string(), import_v4.z.any()).optional()
278
+ import_v43.z.strictObject({
279
+ type: import_v43.z.literal("reasoning-start"),
280
+ id: import_v43.z.string(),
281
+ providerMetadata: providerMetadataSchema.optional()
253
282
  }),
254
- import_v4.z.strictObject({
255
- type: import_v4.z.literal("reasoning-delta"),
256
- id: import_v4.z.string(),
257
- delta: import_v4.z.string(),
258
- providerMetadata: import_v4.z.record(import_v4.z.string(), import_v4.z.any()).optional()
283
+ import_v43.z.strictObject({
284
+ type: import_v43.z.literal("reasoning-delta"),
285
+ id: import_v43.z.string(),
286
+ delta: import_v43.z.string(),
287
+ providerMetadata: providerMetadataSchema.optional()
259
288
  }),
260
- import_v4.z.strictObject({
261
- type: import_v4.z.literal("reasoning-end"),
262
- id: import_v4.z.string(),
263
- providerMetadata: import_v4.z.record(import_v4.z.string(), import_v4.z.any()).optional()
289
+ import_v43.z.strictObject({
290
+ type: import_v43.z.literal("reasoning-end"),
291
+ id: import_v43.z.string(),
292
+ providerMetadata: providerMetadataSchema.optional()
264
293
  }),
265
- import_v4.z.strictObject({
266
- type: import_v4.z.literal("reasoning-part-finish")
294
+ import_v43.z.strictObject({
295
+ type: import_v43.z.literal("reasoning-part-finish")
267
296
  }),
268
- import_v4.z.strictObject({
269
- type: import_v4.z.literal("source-url"),
270
- sourceId: import_v4.z.string(),
271
- url: import_v4.z.string(),
272
- title: import_v4.z.string().optional(),
273
- providerMetadata: import_v4.z.any().optional()
274
- // Use z.any() for generic metadata
297
+ import_v43.z.strictObject({
298
+ type: import_v43.z.literal("source-url"),
299
+ sourceId: import_v43.z.string(),
300
+ url: import_v43.z.string(),
301
+ title: import_v43.z.string().optional(),
302
+ providerMetadata: providerMetadataSchema.optional()
275
303
  }),
276
- import_v4.z.strictObject({
277
- type: import_v4.z.literal("source-document"),
278
- sourceId: import_v4.z.string(),
279
- mediaType: import_v4.z.string(),
280
- title: import_v4.z.string(),
281
- filename: import_v4.z.string().optional(),
282
- providerMetadata: import_v4.z.any().optional()
283
- // Use z.any() for generic metadata
304
+ import_v43.z.strictObject({
305
+ type: import_v43.z.literal("source-document"),
306
+ sourceId: import_v43.z.string(),
307
+ mediaType: import_v43.z.string(),
308
+ title: import_v43.z.string(),
309
+ filename: import_v43.z.string().optional(),
310
+ providerMetadata: providerMetadataSchema.optional()
284
311
  }),
285
- import_v4.z.strictObject({
286
- type: import_v4.z.literal("file"),
287
- url: import_v4.z.string(),
288
- mediaType: import_v4.z.string()
312
+ import_v43.z.strictObject({
313
+ type: import_v43.z.literal("file"),
314
+ url: import_v43.z.string(),
315
+ mediaType: import_v43.z.string(),
316
+ providerMetadata: providerMetadataSchema.optional()
289
317
  }),
290
- import_v4.z.strictObject({
291
- type: import_v4.z.string().startsWith("data-"),
292
- id: import_v4.z.string().optional(),
293
- data: import_v4.z.unknown(),
294
- transient: import_v4.z.boolean().optional()
318
+ import_v43.z.strictObject({
319
+ type: import_v43.z.string().startsWith("data-"),
320
+ id: import_v43.z.string().optional(),
321
+ data: import_v43.z.unknown(),
322
+ transient: import_v43.z.boolean().optional()
295
323
  }),
296
- import_v4.z.strictObject({
297
- type: import_v4.z.literal("start-step")
324
+ import_v43.z.strictObject({
325
+ type: import_v43.z.literal("start-step")
298
326
  }),
299
- import_v4.z.strictObject({
300
- type: import_v4.z.literal("finish-step")
327
+ import_v43.z.strictObject({
328
+ type: import_v43.z.literal("finish-step")
301
329
  }),
302
- import_v4.z.strictObject({
303
- type: import_v4.z.literal("start"),
304
- messageId: import_v4.z.string().optional(),
305
- messageMetadata: import_v4.z.unknown().optional()
330
+ import_v43.z.strictObject({
331
+ type: import_v43.z.literal("start"),
332
+ messageId: import_v43.z.string().optional(),
333
+ messageMetadata: import_v43.z.unknown().optional()
306
334
  }),
307
- import_v4.z.strictObject({
308
- type: import_v4.z.literal("finish"),
309
- messageMetadata: import_v4.z.unknown().optional()
335
+ import_v43.z.strictObject({
336
+ type: import_v43.z.literal("finish"),
337
+ messageMetadata: import_v43.z.unknown().optional()
310
338
  }),
311
- import_v4.z.strictObject({
312
- type: import_v4.z.literal("message-metadata"),
313
- messageMetadata: import_v4.z.unknown()
339
+ import_v43.z.strictObject({
340
+ type: import_v43.z.literal("message-metadata"),
341
+ messageMetadata: import_v43.z.unknown()
314
342
  })
315
343
  ]);
316
344
  function isDataUIMessageChunk(chunk) {
@@ -725,7 +753,7 @@ function processUIMessageStream({
725
753
  new TransformStream({
726
754
  async transform(part, controller) {
727
755
  await runUpdateMessageJob(async ({ state, write }) => {
728
- var _a9, _b;
756
+ var _a9, _b, _c, _d;
729
757
  function updateToolInvocationPart(options) {
730
758
  var _a10;
731
759
  const part2 = state.message.parts.find(
@@ -739,6 +767,9 @@ function processUIMessageStream({
739
767
  anyPart.output = anyOptions.output;
740
768
  anyPart.errorText = anyOptions.errorText;
741
769
  anyPart.providerExecuted = (_a10 = anyOptions.providerExecuted) != null ? _a10 : part2.providerExecuted;
770
+ if (anyOptions.providerMetadata != null && part2.state === "input-available") {
771
+ part2.callProviderMetadata = anyOptions.providerMetadata;
772
+ }
742
773
  } else {
743
774
  state.message.parts.push({
744
775
  type: `tool-${options.toolName}`,
@@ -747,7 +778,8 @@ function processUIMessageStream({
747
778
  input: anyOptions.input,
748
779
  output: anyOptions.output,
749
780
  errorText: anyOptions.errorText,
750
- providerExecuted: anyOptions.providerExecuted
781
+ providerExecuted: anyOptions.providerExecuted,
782
+ ...anyOptions.providerMetadata != null ? { callProviderMetadata: anyOptions.providerMetadata } : {}
751
783
  });
752
784
  }
753
785
  }
@@ -768,6 +800,7 @@ function processUIMessageStream({
768
800
  const textPart = {
769
801
  type: "text",
770
802
  text: "",
803
+ providerMetadata: part.providerMetadata,
771
804
  state: "streaming"
772
805
  };
773
806
  state.activeTextParts[part.id] = textPart;
@@ -776,13 +809,16 @@ function processUIMessageStream({
776
809
  break;
777
810
  }
778
811
  case "text-delta": {
779
- state.activeTextParts[part.id].text += part.delta;
812
+ const textPart = state.activeTextParts[part.id];
813
+ textPart.text += part.delta;
814
+ textPart.providerMetadata = (_a9 = part.providerMetadata) != null ? _a9 : textPart.providerMetadata;
780
815
  write();
781
816
  break;
782
817
  }
783
818
  case "text-end": {
784
819
  const textPart = state.activeTextParts[part.id];
785
820
  textPart.state = "done";
821
+ textPart.providerMetadata = (_b = part.providerMetadata) != null ? _b : textPart.providerMetadata;
786
822
  delete state.activeTextParts[part.id];
787
823
  write();
788
824
  break;
@@ -802,13 +838,13 @@ function processUIMessageStream({
802
838
  case "reasoning-delta": {
803
839
  const reasoningPart = state.activeReasoningParts[part.id];
804
840
  reasoningPart.text += part.delta;
805
- reasoningPart.providerMetadata = (_a9 = part.providerMetadata) != null ? _a9 : reasoningPart.providerMetadata;
841
+ reasoningPart.providerMetadata = (_c = part.providerMetadata) != null ? _c : reasoningPart.providerMetadata;
806
842
  write();
807
843
  break;
808
844
  }
809
845
  case "reasoning-end": {
810
846
  const reasoningPart = state.activeReasoningParts[part.id];
811
- reasoningPart.providerMetadata = (_b = part.providerMetadata) != null ? _b : reasoningPart.providerMetadata;
847
+ reasoningPart.providerMetadata = (_d = part.providerMetadata) != null ? _d : reasoningPart.providerMetadata;
812
848
  reasoningPart.state = "done";
813
849
  delete state.activeReasoningParts[part.id];
814
850
  write();
@@ -884,7 +920,8 @@ function processUIMessageStream({
884
920
  toolName: part.toolName,
885
921
  state: "input-available",
886
922
  input: part.input,
887
- providerExecuted: part.providerExecuted
923
+ providerExecuted: part.providerExecuted,
924
+ providerMetadata: part.providerMetadata
888
925
  });
889
926
  write();
890
927
  if (onToolCall && !part.providerExecuted) {
@@ -1615,7 +1652,7 @@ async function download({ url }) {
1615
1652
  // src/prompt/data-content.ts
1616
1653
  var import_provider6 = require("@ai-sdk/provider");
1617
1654
  var import_provider_utils5 = require("@ai-sdk/provider-utils");
1618
- var import_v42 = require("zod/v4");
1655
+ var import_v44 = require("zod/v4");
1619
1656
 
1620
1657
  // src/prompt/split-data-url.ts
1621
1658
  function splitDataUrl(dataUrl) {
@@ -1634,11 +1671,11 @@ function splitDataUrl(dataUrl) {
1634
1671
  }
1635
1672
 
1636
1673
  // src/prompt/data-content.ts
1637
- var dataContentSchema = import_v42.z.union([
1638
- import_v42.z.string(),
1639
- import_v42.z.instanceof(Uint8Array),
1640
- import_v42.z.instanceof(ArrayBuffer),
1641
- import_v42.z.custom(
1674
+ var dataContentSchema = import_v44.z.union([
1675
+ import_v44.z.string(),
1676
+ import_v44.z.instanceof(Uint8Array),
1677
+ import_v44.z.instanceof(ArrayBuffer),
1678
+ import_v44.z.custom(
1642
1679
  // Buffer might not be available in some environments such as CloudFlare:
1643
1680
  (value) => {
1644
1681
  var _a9, _b;
@@ -2186,28 +2223,6 @@ var import_v47 = require("zod/v4");
2186
2223
  // src/prompt/message.ts
2187
2224
  var import_v46 = require("zod/v4");
2188
2225
 
2189
- // src/types/provider-metadata.ts
2190
- var import_v44 = require("zod/v4");
2191
-
2192
- // src/types/json-value.ts
2193
- var import_v43 = require("zod/v4");
2194
- var jsonValueSchema = import_v43.z.lazy(
2195
- () => import_v43.z.union([
2196
- import_v43.z.null(),
2197
- import_v43.z.string(),
2198
- import_v43.z.number(),
2199
- import_v43.z.boolean(),
2200
- import_v43.z.record(import_v43.z.string(), jsonValueSchema),
2201
- import_v43.z.array(jsonValueSchema)
2202
- ])
2203
- );
2204
-
2205
- // src/types/provider-metadata.ts
2206
- var providerMetadataSchema = import_v44.z.record(
2207
- import_v44.z.string(),
2208
- import_v44.z.record(import_v44.z.string(), jsonValueSchema)
2209
- );
2210
-
2211
2226
  // src/prompt/content-part.ts
2212
2227
  var import_v45 = require("zod/v4");
2213
2228
  var textPartSchema = import_v45.z.object({
@@ -3038,7 +3053,11 @@ function toResponseMessages({
3038
3053
  ).filter((part) => part.type !== "text" || part.text.length > 0).map((part) => {
3039
3054
  switch (part.type) {
3040
3055
  case "text":
3041
- return part;
3056
+ return {
3057
+ type: "text",
3058
+ text: part.text,
3059
+ providerOptions: part.providerMetadata
3060
+ };
3042
3061
  case "reasoning":
3043
3062
  return {
3044
3063
  type: "reasoning",
@@ -3293,7 +3312,7 @@ var DefaultStreamTextResult = class {
3293
3312
  let activeReasoningContent = {};
3294
3313
  const eventProcessor = new TransformStream({
3295
3314
  async transform(chunk, controller) {
3296
- var _a9, _b;
3315
+ var _a9, _b, _c;
3297
3316
  controller.enqueue(chunk);
3298
3317
  const { part } = chunk;
3299
3318
  if (part.type === "text" || part.type === "reasoning" || part.type === "source" || part.type === "tool-call" || part.type === "tool-result" || part.type === "tool-input-start" || part.type === "tool-input-delta" || part.type === "raw") {
@@ -3323,7 +3342,7 @@ var DefaultStreamTextResult = class {
3323
3342
  return;
3324
3343
  }
3325
3344
  activeText.text += part.text;
3326
- activeText.providerMetadata = part.providerMetadata;
3345
+ activeText.providerMetadata = (_a9 = part.providerMetadata) != null ? _a9 : activeText.providerMetadata;
3327
3346
  }
3328
3347
  if (part.type === "text-end") {
3329
3348
  delete activeTextContent[part.id];
@@ -3349,7 +3368,7 @@ var DefaultStreamTextResult = class {
3349
3368
  return;
3350
3369
  }
3351
3370
  activeReasoning.text += part.text;
3352
- activeReasoning.providerMetadata = (_a9 = part.providerMetadata) != null ? _a9 : activeReasoning.providerMetadata;
3371
+ activeReasoning.providerMetadata = (_b = part.providerMetadata) != null ? _b : activeReasoning.providerMetadata;
3353
3372
  }
3354
3373
  if (part.type === "reasoning-end") {
3355
3374
  const activeReasoning = activeReasoningContent[part.id];
@@ -3363,7 +3382,7 @@ var DefaultStreamTextResult = class {
3363
3382
  });
3364
3383
  return;
3365
3384
  }
3366
- activeReasoning.providerMetadata = (_b = part.providerMetadata) != null ? _b : activeReasoning.providerMetadata;
3385
+ activeReasoning.providerMetadata = (_c = part.providerMetadata) != null ? _c : activeReasoning.providerMetadata;
3367
3386
  delete activeReasoningContent[part.id];
3368
3387
  }
3369
3388
  if (part.type === "file") {
@@ -4063,26 +4082,35 @@ var DefaultStreamTextResult = class {
4063
4082
  const partType = part.type;
4064
4083
  switch (partType) {
4065
4084
  case "text-start": {
4066
- controller.enqueue({ type: "text-start", id: part.id });
4085
+ controller.enqueue({
4086
+ type: "text-start",
4087
+ id: part.id,
4088
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4089
+ });
4067
4090
  break;
4068
4091
  }
4069
4092
  case "text": {
4070
4093
  controller.enqueue({
4071
4094
  type: "text-delta",
4072
4095
  id: part.id,
4073
- delta: part.text
4096
+ delta: part.text,
4097
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4074
4098
  });
4075
4099
  break;
4076
4100
  }
4077
4101
  case "text-end": {
4078
- controller.enqueue({ type: "text-end", id: part.id });
4102
+ controller.enqueue({
4103
+ type: "text-end",
4104
+ id: part.id,
4105
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4106
+ });
4079
4107
  break;
4080
4108
  }
4081
4109
  case "reasoning-start": {
4082
4110
  controller.enqueue({
4083
4111
  type: "reasoning-start",
4084
4112
  id: part.id,
4085
- providerMetadata: part.providerMetadata
4113
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4086
4114
  });
4087
4115
  break;
4088
4116
  }
@@ -4092,7 +4120,7 @@ var DefaultStreamTextResult = class {
4092
4120
  type: "reasoning-delta",
4093
4121
  id: part.id,
4094
4122
  delta: part.text,
4095
- providerMetadata: part.providerMetadata
4123
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4096
4124
  });
4097
4125
  }
4098
4126
  break;
@@ -4101,7 +4129,7 @@ var DefaultStreamTextResult = class {
4101
4129
  controller.enqueue({
4102
4130
  type: "reasoning-end",
4103
4131
  id: part.id,
4104
- providerMetadata: part.providerMetadata
4132
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4105
4133
  });
4106
4134
  break;
4107
4135
  }
@@ -4120,7 +4148,7 @@ var DefaultStreamTextResult = class {
4120
4148
  sourceId: part.id,
4121
4149
  url: part.url,
4122
4150
  title: part.title,
4123
- providerMetadata: part.providerMetadata
4151
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4124
4152
  });
4125
4153
  }
4126
4154
  if (sendSources && part.sourceType === "document") {
@@ -4130,7 +4158,7 @@ var DefaultStreamTextResult = class {
4130
4158
  mediaType: part.mediaType,
4131
4159
  title: part.title,
4132
4160
  filename: part.filename,
4133
- providerMetadata: part.providerMetadata
4161
+ ...part.providerMetadata != null ? { providerMetadata: part.providerMetadata } : {}
4134
4162
  });
4135
4163
  }
4136
4164
  break;
@@ -4158,7 +4186,8 @@ var DefaultStreamTextResult = class {
4158
4186
  toolCallId: part.toolCallId,
4159
4187
  toolName: part.toolName,
4160
4188
  input: part.input,
4161
- providerExecuted: part.providerExecuted
4189
+ providerExecuted: part.providerExecuted,
4190
+ providerMetadata: part.providerMetadata
4162
4191
  });
4163
4192
  break;
4164
4193
  }
@@ -4453,43 +4482,27 @@ function showHelp() {
4453
4482
 
4454
4483
  AI CLI - Stream text generation from various AI models
4455
4484
 
4456
- Arguments:
4457
- prompt The prompt to send to the AI model (optional if using stdin)
4458
-
4459
4485
  Options:
4460
- -m, --model <model> Model to use. Format: provider/model or just model name.
4461
- Examples: openai/gpt-4o, anthropic/claude-3-5-sonnet-20241022
4462
- (default: "openai/gpt-4")
4463
- -f, --file <file> Attach a file to the prompt (can be used multiple times)
4464
- -s, --system <message> System message to set context
4465
- -v, --verbose Show detailed information (model, usage, etc.)
4466
- -h, --help Display help for command
4467
- -V, --version Output the version number
4468
-
4469
- Environment Variables:
4470
- - AI_MODEL: Default model to use
4471
- - AI_SYSTEM: Default system message
4472
- - AI_VERBOSE: Set to 'true' to enable verbose output
4486
+ -m, --model <model> Model to use (default: "openai/gpt-4")
4487
+ Format: provider/model (e.g., anthropic/claude-3-5-sonnet)
4488
+ -f, --file <file> Attach file(s) to prompt
4489
+ -s, --system <message> System message
4490
+ -v, --verbose Show detailed output
4491
+ -h, --help Show help
4492
+ -V, --version Show version
4473
4493
 
4474
- Authentication (choose one):
4475
- - VERCEL_OIDC_TOKEN: Vercel OIDC token (for Vercel projects)
4476
- - AI_GATEWAY_API_KEY: AI Gateway API key
4494
+ Authentication (required):
4495
+ export AI_GATEWAY_API_KEY="your-key" # Get from Vercel Dashboard (AI tab)
4496
+ export VERCEL_OIDC_TOKEN="your-token" # For Vercel projects (or run: vercel env pull)
4477
4497
 
4478
- Setting Environment Variables:
4479
- # Option 1: Export in current session
4480
- export AI_GATEWAY_API_KEY="your-key-here"
4481
- export AI_MODEL="anthropic/claude-3-5-sonnet-20241022"
4482
-
4483
- # Option 2: Inline for single command
4484
- AI_GATEWAY_API_KEY="your-key" ai "Hello world"
4485
-
4486
- # Option 3: Add to shell profile (~/.bashrc, ~/.zshrc)
4487
- echo 'export AI_GATEWAY_API_KEY="your-key"' >> ~/.bashrc
4498
+ Environment Variables:
4499
+ AI_MODEL: Default model to use
4500
+ AI_SYSTEM: Default system message
4501
+ AI_VERBOSE: Set to 'true' for detailed output
4488
4502
 
4489
4503
  Examples:
4490
4504
  npx ai "Hello, world!"
4491
- npx ai "Write a poem" -m anthropic/claude-3-5-sonnet-20241022
4492
- npx ai "Explain quantum physics" -m groq/llama-3.1-8b-instant
4505
+ npx ai "Write a poem" -m anthropic/claude-3-5-sonnet
4493
4506
  npx ai "Explain this code" -f script.js -f README.md
4494
4507
  echo "What is life?" | npx ai
4495
4508
  cat file.txt | npx ai "Summarize this content"
@@ -4499,17 +4512,6 @@ Unix-style piping:
4499
4512
  echo "Hello world" | npx ai "Translate to French"
4500
4513
  cat README.md | npx ai "Summarize this"
4501
4514
  curl -s https://api.github.com/repos/vercel/ai | npx ai "What is this repository about?"
4502
-
4503
- Authentication Setup:
4504
- This CLI uses the Vercel AI Gateway. You need ONE of these for authentication:
4505
-
4506
- OIDC Token (for Vercel projects):
4507
- - Automatically available in Vercel deployments
4508
- - For local development: run 'vercel env pull' or use 'vercel dev'
4509
-
4510
- API Key (for any environment):
4511
- - Get your key from the AI Gateway dashboard
4512
- - Set: export AI_GATEWAY_API_KEY="your-key-here"
4513
4515
 
4514
4516
  The gateway supports OpenAI, Anthropic, Google, Groq, and more providers.`);
4515
4517
  }
@@ -4595,6 +4597,25 @@ ${prompt}` : stdinContent;
4595
4597
  }
4596
4598
  console.error("");
4597
4599
  }
4600
+ const hasApiKey = process.env.AI_GATEWAY_API_KEY || process.env.VERCEL_OIDC_TOKEN;
4601
+ if (!hasApiKey) {
4602
+ console.error(`Error: Authentication required.
4603
+
4604
+ Set up authentication with one of these options:
4605
+
4606
+ # Option 1: Export in current session
4607
+ export AI_GATEWAY_API_KEY="your-key-here"
4608
+ export VERCEL_OIDC_TOKEN="your-oidc-token"
4609
+ export AI_MODEL="anthropic/claude-3-5-sonnet"
4610
+
4611
+ # Option 2: Add to shell profile (~/.bashrc, ~/.zshrc)
4612
+ echo 'export AI_GATEWAY_API_KEY="your-key"' >> ~/.bashrc
4613
+ # Or run: vercel env pull
4614
+
4615
+ Get your API key from the Vercel Dashboard (AI tab > API keys).
4616
+ Use --help for more details and examples.`);
4617
+ process.exit(1);
4618
+ }
4598
4619
  const model = resolveModel(options.model);
4599
4620
  let messages;
4600
4621
  if (imageFiles.length > 0) {
@@ -4655,6 +4676,7 @@ main().catch((error) => {
4655
4676
  formatAttachedFiles,
4656
4677
  getMediaType,
4657
4678
  isStdinAvailable,
4679
+ main,
4658
4680
  parseArgs,
4659
4681
  readFileContent,
4660
4682
  resolveModel,