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 +10 -0
- package/dist/bin/ai.js +208 -186
- package/dist/bin/ai.js.map +1 -1
- package/dist/bin/ai.min.js +35 -48
- package/dist/index.d.mts +19 -4
- package/dist/index.d.ts +19 -4
- package/dist/index.js +63 -35
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +63 -35
- package/dist/index.mjs.map +1 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
197
|
-
import_v4.z.
|
198
|
-
|
199
|
-
|
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
|
-
|
202
|
-
type:
|
203
|
-
id:
|
204
|
-
delta:
|
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
|
-
|
207
|
-
type:
|
208
|
-
id:
|
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
|
-
|
211
|
-
type:
|
212
|
-
errorText:
|
238
|
+
import_v43.z.strictObject({
|
239
|
+
type: import_v43.z.literal("error"),
|
240
|
+
errorText: import_v43.z.string()
|
213
241
|
}),
|
214
|
-
|
215
|
-
type:
|
216
|
-
toolCallId:
|
217
|
-
toolName:
|
218
|
-
providerExecuted:
|
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
|
-
|
221
|
-
type:
|
222
|
-
toolCallId:
|
223
|
-
inputTextDelta:
|
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
|
-
|
226
|
-
type:
|
227
|
-
toolCallId:
|
228
|
-
toolName:
|
229
|
-
input:
|
230
|
-
providerExecuted:
|
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
|
-
|
233
|
-
type:
|
234
|
-
toolCallId:
|
235
|
-
output:
|
236
|
-
providerExecuted:
|
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
|
-
|
239
|
-
type:
|
240
|
-
toolCallId:
|
241
|
-
errorText:
|
242
|
-
providerExecuted:
|
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
|
-
|
245
|
-
type:
|
246
|
-
text:
|
247
|
-
providerMetadata:
|
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
|
-
|
250
|
-
type:
|
251
|
-
id:
|
252
|
-
providerMetadata:
|
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
|
-
|
255
|
-
type:
|
256
|
-
id:
|
257
|
-
delta:
|
258
|
-
providerMetadata:
|
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
|
-
|
261
|
-
type:
|
262
|
-
id:
|
263
|
-
providerMetadata:
|
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
|
-
|
266
|
-
type:
|
294
|
+
import_v43.z.strictObject({
|
295
|
+
type: import_v43.z.literal("reasoning-part-finish")
|
267
296
|
}),
|
268
|
-
|
269
|
-
type:
|
270
|
-
sourceId:
|
271
|
-
url:
|
272
|
-
title:
|
273
|
-
providerMetadata:
|
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
|
-
|
277
|
-
type:
|
278
|
-
sourceId:
|
279
|
-
mediaType:
|
280
|
-
title:
|
281
|
-
filename:
|
282
|
-
providerMetadata:
|
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
|
-
|
286
|
-
type:
|
287
|
-
url:
|
288
|
-
mediaType:
|
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
|
-
|
291
|
-
type:
|
292
|
-
id:
|
293
|
-
data:
|
294
|
-
transient:
|
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
|
-
|
297
|
-
type:
|
324
|
+
import_v43.z.strictObject({
|
325
|
+
type: import_v43.z.literal("start-step")
|
298
326
|
}),
|
299
|
-
|
300
|
-
type:
|
327
|
+
import_v43.z.strictObject({
|
328
|
+
type: import_v43.z.literal("finish-step")
|
301
329
|
}),
|
302
|
-
|
303
|
-
type:
|
304
|
-
messageId:
|
305
|
-
messageMetadata:
|
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
|
-
|
308
|
-
type:
|
309
|
-
messageMetadata:
|
335
|
+
import_v43.z.strictObject({
|
336
|
+
type: import_v43.z.literal("finish"),
|
337
|
+
messageMetadata: import_v43.z.unknown().optional()
|
310
338
|
}),
|
311
|
-
|
312
|
-
type:
|
313
|
-
messageMetadata:
|
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]
|
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 = (
|
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 = (
|
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
|
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 =
|
1638
|
-
|
1639
|
-
|
1640
|
-
|
1641
|
-
|
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
|
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 = (
|
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 = (
|
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({
|
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({
|
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
|
4461
|
-
|
4462
|
-
|
4463
|
-
-
|
4464
|
-
-
|
4465
|
-
-
|
4466
|
-
-
|
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 (
|
4475
|
-
-
|
4476
|
-
-
|
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
|
-
|
4479
|
-
|
4480
|
-
|
4481
|
-
|
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
|
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,
|