@ai-sdk/workflow 1.0.0-beta.23 → 1.0.0-beta.26

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-sdk/workflow",
3
- "version": "1.0.0-beta.23",
3
+ "version": "1.0.0-beta.26",
4
4
  "description": "WorkflowAgent for building AI agents with AI SDK",
5
5
  "license": "Apache-2.0",
6
6
  "main": "./dist/index.js",
@@ -28,8 +28,8 @@
28
28
  "dependencies": {
29
29
  "ajv": "^8.18.0",
30
30
  "@ai-sdk/provider": "4.0.0-beta.12",
31
- "@ai-sdk/provider-utils": "5.0.0-beta.24",
32
- "ai": "7.0.0-beta.108"
31
+ "@ai-sdk/provider-utils": "5.0.0-beta.26",
32
+ "ai": "7.0.0-beta.111"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@types/node": "20.17.24",
@@ -54,7 +54,7 @@ export interface DoStreamStepOptions {
54
54
  providerOptions?: ProviderOptions;
55
55
  toolChoice?: ToolChoice<ToolSet>;
56
56
  includeRawChunks?: boolean;
57
- experimental_telemetry?: TelemetryOptions;
57
+ telemetry?: TelemetryOptions;
58
58
  repairToolCall?: ToolCallRepairFunction<ToolSet>;
59
59
  responseFormat?: LanguageModelV4CallOptions['responseFormat'];
60
60
  }
package/src/index.ts CHANGED
@@ -26,8 +26,8 @@ export {
26
26
  type ToolCallRepairFunction,
27
27
  type WorkflowAgentOnStartCallback,
28
28
  type WorkflowAgentOnStepStartCallback,
29
- type WorkflowAgentOnToolCallStartCallback,
30
- type WorkflowAgentOnToolCallFinishCallback,
29
+ type WorkflowAgentOnToolExecutionStartCallback,
30
+ type WorkflowAgentOnToolExecutionEndCallback,
31
31
  } from './workflow-agent.js';
32
32
 
33
33
  export {
@@ -63,7 +63,7 @@ export async function* streamTextIterator({
63
63
  generationSettings,
64
64
  toolChoice,
65
65
  experimental_context,
66
- experimental_telemetry,
66
+ telemetry,
67
67
  includeRawChunks = false,
68
68
  repairToolCall,
69
69
  responseFormat,
@@ -80,7 +80,7 @@ export async function* streamTextIterator({
80
80
  generationSettings?: GenerationSettings;
81
81
  toolChoice?: ToolChoice<ToolSet>;
82
82
  experimental_context?: unknown;
83
- experimental_telemetry?: TelemetryOptions;
83
+ telemetry?: TelemetryOptions;
84
84
  includeRawChunks?: boolean;
85
85
  repairToolCall?: ToolCallRepairFunction<ToolSet>;
86
86
  responseFormat?: LanguageModelV4CallOptions['responseFormat'];
@@ -261,7 +261,7 @@ export async function* streamTextIterator({
261
261
  ...currentGenerationSettings,
262
262
  toolChoice: currentToolChoice,
263
263
  includeRawChunks,
264
- experimental_telemetry,
264
+ telemetry,
265
265
  repairToolCall,
266
266
  responseFormat,
267
267
  },
@@ -334,10 +334,10 @@ export async function agentOnStepStartE2e() {
334
334
  }
335
335
 
336
336
  // ============================================================================
337
- // GAP tests — experimental_onToolCallStart
337
+ // GAP tests — experimental_onToolExecutionStart
338
338
  // ============================================================================
339
339
 
340
- export async function agentOnToolCallStartE2e() {
340
+ export async function agentonToolExecutionStartE2e() {
341
341
  'use workflow';
342
342
  const calls: string[] = [];
343
343
  const agent = new WorkflowAgent({
@@ -356,14 +356,14 @@ export async function agentOnToolCallStartE2e() {
356
356
  execute: echoStep,
357
357
  },
358
358
  },
359
- experimental_onToolCallStart: async () => {
359
+ experimental_onToolExecutionStart: async () => {
360
360
  calls.push('constructor');
361
361
  },
362
362
  } as any);
363
363
  await agent.stream({
364
364
  messages: [{ role: 'user', content: 'test' }],
365
365
  writable: getWritable(),
366
- experimental_onToolCallStart: async () => {
366
+ experimental_onToolExecutionStart: async () => {
367
367
  calls.push('method');
368
368
  },
369
369
  } as any);
@@ -371,10 +371,10 @@ export async function agentOnToolCallStartE2e() {
371
371
  }
372
372
 
373
373
  // ============================================================================
374
- // GAP tests — experimental_onToolCallFinish
374
+ // GAP tests — experimental_onToolExecutionEnd
375
375
  // ============================================================================
376
376
 
377
- export async function agentOnToolCallFinishE2e() {
377
+ export async function agentonToolExecutionEndE2e() {
378
378
  'use workflow';
379
379
  const calls: string[] = [];
380
380
  let capturedEvent: any = null;
@@ -394,14 +394,14 @@ export async function agentOnToolCallFinishE2e() {
394
394
  execute: addNumbers,
395
395
  },
396
396
  },
397
- experimental_onToolCallFinish: async () => {
397
+ experimental_onToolExecutionEnd: async () => {
398
398
  calls.push('constructor');
399
399
  },
400
400
  } as any);
401
401
  await agent.stream({
402
402
  messages: [{ role: 'user', content: 'test' }],
403
403
  writable: getWritable(),
404
- experimental_onToolCallFinish: async (event: any) => {
404
+ experimental_onToolExecutionEnd: async (event: any) => {
405
405
  calls.push('method');
406
406
  capturedEvent = {
407
407
  toolName: event?.toolCall?.toolName,
@@ -7,10 +7,11 @@ import type {
7
7
  SharedV4ProviderOptions,
8
8
  } from '@ai-sdk/provider';
9
9
  import {
10
- type Experimental_LanguageModelStreamPart as ModelCallStreamPart,
11
10
  type FinishReason,
11
+ LanguageModel,
12
12
  type LanguageModelResponseMetadata,
13
13
  type LanguageModelUsage,
14
+ type Experimental_LanguageModelStreamPart as ModelCallStreamPart,
14
15
  type ModelMessage,
15
16
  Output,
16
17
  type StepResult,
@@ -21,7 +22,6 @@ import {
21
22
  type ToolChoice,
22
23
  type ToolSet,
23
24
  type UIMessage,
24
- LanguageModel,
25
25
  experimental_filterActiveTools as filterActiveTools,
26
26
  } from 'ai';
27
27
  import {
@@ -31,7 +31,6 @@ import {
31
31
  standardizePrompt,
32
32
  } from 'ai/internal';
33
33
  import { streamTextIterator } from './stream-text-iterator.js';
34
- import type { CompatibleLanguageModel } from './types.js';
35
34
 
36
35
  // Re-export for consumers
37
36
  export type { CompatibleLanguageModel } from './types.js';
@@ -340,6 +339,10 @@ export interface PrepareCallOptions<
340
339
  tools: TTools;
341
340
  instructions?: string | SystemModelMessage | Array<SystemModelMessage>;
342
341
  toolChoice?: ToolChoice<TTools>;
342
+ telemetry?: TelemetryOptions;
343
+ /**
344
+ * @deprecated Use `telemetry` instead. This alias will be removed in a future major release.
345
+ */
343
346
  experimental_telemetry?: TelemetryOptions;
344
347
  experimental_context?: unknown;
345
348
  messages: ModelMessage[];
@@ -406,7 +409,14 @@ export interface WorkflowAgentOptions<
406
409
  toolChoice?: ToolChoice<TTools>;
407
410
 
408
411
  /**
409
- * Optional telemetry configuration (experimental).
412
+ * Optional telemetry configuration.
413
+ */
414
+ telemetry?: TelemetryOptions;
415
+
416
+ /**
417
+ * Optional telemetry configuration.
418
+ *
419
+ * @deprecated Use `telemetry` instead. This alias will be removed in a future major release.
410
420
  */
411
421
  experimental_telemetry?: TelemetryOptions;
412
422
 
@@ -491,12 +501,12 @@ export interface WorkflowAgentOptions<
491
501
  /**
492
502
  * Callback called before a tool's execute function runs.
493
503
  */
494
- experimental_onToolCallStart?: WorkflowAgentOnToolCallStartCallback;
504
+ experimental_onToolExecutionStart?: WorkflowAgentOnToolExecutionStartCallback;
495
505
 
496
506
  /**
497
507
  * Callback called after a tool execution completes.
498
508
  */
499
- experimental_onToolCallFinish?: WorkflowAgentOnToolCallFinishCallback;
509
+ experimental_onToolExecutionEnd?: WorkflowAgentOnToolExecutionEndCallback;
500
510
 
501
511
  /**
502
512
  * Prepare the parameters for the stream call.
@@ -596,7 +606,7 @@ export type WorkflowAgentOnStepStartCallback<TTools extends ToolSet = ToolSet> =
596
606
  /**
597
607
  * Callback that is called before a tool's execute function runs.
598
608
  */
599
- export type WorkflowAgentOnToolCallStartCallback = (event: {
609
+ export type WorkflowAgentOnToolExecutionStartCallback = (event: {
600
610
  /** The tool call being executed */
601
611
  readonly toolCall: ToolCall;
602
612
  /** The current step number (0-based) */
@@ -608,7 +618,7 @@ export type WorkflowAgentOnToolCallStartCallback = (event: {
608
618
  * Uses a discriminated union pattern: check `success` to determine
609
619
  * whether `output` or `error` is available.
610
620
  */
611
- export type WorkflowAgentOnToolCallFinishCallback = (
621
+ export type WorkflowAgentOnToolExecutionEndCallback = (
612
622
  event:
613
623
  | {
614
624
  /** The tool call that was executed */
@@ -728,7 +738,14 @@ export type WorkflowAgentStreamOptions<
728
738
  activeTools?: Array<keyof NoInfer<TTools>>;
729
739
 
730
740
  /**
731
- * Optional telemetry configuration (experimental).
741
+ * Optional telemetry configuration.
742
+ */
743
+ telemetry?: TelemetryOptions;
744
+
745
+ /**
746
+ * Optional telemetry configuration.
747
+ *
748
+ * @deprecated Use `telemetry` instead. This alias will be removed in a future major release.
732
749
  */
733
750
  experimental_telemetry?: TelemetryOptions;
734
751
 
@@ -827,12 +844,12 @@ export type WorkflowAgentStreamOptions<
827
844
  /**
828
845
  * Callback called before a tool's execute function runs.
829
846
  */
830
- experimental_onToolCallStart?: WorkflowAgentOnToolCallStartCallback;
847
+ experimental_onToolExecutionStart?: WorkflowAgentOnToolExecutionStartCallback;
831
848
 
832
849
  /**
833
850
  * Callback called after a tool execution completes.
834
851
  */
835
- experimental_onToolCallFinish?: WorkflowAgentOnToolCallFinishCallback;
852
+ experimental_onToolExecutionEnd?: WorkflowAgentOnToolExecutionEndCallback;
836
853
 
837
854
  /**
838
855
  * Callback function called before each step in the agent loop.
@@ -1013,8 +1030,8 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1013
1030
  private constructorOnFinish?: WorkflowAgentOnFinishCallback<ToolSet>;
1014
1031
  private constructorOnStart?: WorkflowAgentOnStartCallback;
1015
1032
  private constructorOnStepStart?: WorkflowAgentOnStepStartCallback;
1016
- private constructorOnToolCallStart?: WorkflowAgentOnToolCallStartCallback;
1017
- private constructorOnToolCallFinish?: WorkflowAgentOnToolCallFinishCallback;
1033
+ private constructorOnToolExecutionStart?: WorkflowAgentOnToolExecutionStartCallback;
1034
+ private constructorOnToolExecutionEnd?: WorkflowAgentOnToolExecutionEndCallback;
1018
1035
  private prepareCall?: PrepareCallCallback<TBaseTools>;
1019
1036
 
1020
1037
  constructor(options: WorkflowAgentOptions<TBaseTools>) {
@@ -1024,7 +1041,7 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1024
1041
  // `instructions` takes precedence over deprecated `system`
1025
1042
  this.instructions = options.instructions ?? options.system;
1026
1043
  this.toolChoice = options.toolChoice;
1027
- this.telemetry = options.experimental_telemetry;
1044
+ this.telemetry = options.telemetry ?? options.experimental_telemetry;
1028
1045
  this.experimentalContext = options.experimental_context;
1029
1046
  this.stopWhen = options.stopWhen;
1030
1047
  this.activeTools = options.activeTools;
@@ -1036,8 +1053,10 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1036
1053
  this.constructorOnFinish = options.onFinish;
1037
1054
  this.constructorOnStart = options.experimental_onStart;
1038
1055
  this.constructorOnStepStart = options.experimental_onStepStart;
1039
- this.constructorOnToolCallStart = options.experimental_onToolCallStart;
1040
- this.constructorOnToolCallFinish = options.experimental_onToolCallFinish;
1056
+ this.constructorOnToolExecutionStart =
1057
+ options.experimental_onToolExecutionStart;
1058
+ this.constructorOnToolExecutionEnd =
1059
+ options.experimental_onToolExecutionEnd;
1041
1060
  this.prepareCall = options.prepareCall;
1042
1061
 
1043
1062
  // Extract generation settings
@@ -1079,7 +1098,7 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1079
1098
  options.experimental_context ?? this.experimentalContext;
1080
1099
  let effectiveToolChoiceFromPrepare = options.toolChoice ?? this.toolChoice;
1081
1100
  let effectiveTelemetryFromPrepare =
1082
- options.experimental_telemetry ?? this.telemetry;
1101
+ options.telemetry ?? options.experimental_telemetry ?? this.telemetry;
1083
1102
 
1084
1103
  // Resolve messages for prepareCall: use messages directly, or convert prompt
1085
1104
  const resolvedMessagesForPrepareCall: ModelMessage[] =
@@ -1095,6 +1114,7 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1095
1114
  tools: this.tools,
1096
1115
  instructions: effectiveInstructions,
1097
1116
  toolChoice: effectiveToolChoiceFromPrepare as ToolChoice<TBaseTools>,
1117
+ telemetry: effectiveTelemetryFromPrepare,
1098
1118
  experimental_telemetry: effectiveTelemetryFromPrepare,
1099
1119
  experimental_context: effectiveExperimentalContext,
1100
1120
  messages: resolvedMessagesForPrepareCall,
@@ -1113,7 +1133,9 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1113
1133
  if (prepared.toolChoice !== undefined)
1114
1134
  effectiveToolChoiceFromPrepare =
1115
1135
  prepared.toolChoice as ToolChoice<TBaseTools>;
1116
- if (prepared.experimental_telemetry !== undefined)
1136
+ if (prepared.telemetry !== undefined)
1137
+ effectiveTelemetryFromPrepare = prepared.telemetry;
1138
+ else if (prepared.experimental_telemetry !== undefined)
1117
1139
  effectiveTelemetryFromPrepare = prepared.experimental_telemetry;
1118
1140
  if (prepared.maxOutputTokens !== undefined)
1119
1141
  effectiveGenerationSettings.maxOutputTokens = prepared.maxOutputTokens;
@@ -1276,9 +1298,7 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1276
1298
 
1277
1299
  const effectiveAbortSignal = mergeAbortSignals(
1278
1300
  options.abortSignal ?? effectiveGenerationSettings.abortSignal,
1279
- options.timeout != null
1280
- ? AbortSignal.timeout(options.timeout)
1281
- : undefined,
1301
+ options.timeout,
1282
1302
  );
1283
1303
 
1284
1304
  // Merge generation settings: constructor defaults < prepareCall < stream options
@@ -1335,13 +1355,13 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1335
1355
  this.constructorOnStepStart,
1336
1356
  options.experimental_onStepStart,
1337
1357
  );
1338
- const mergedOnToolCallStart = mergeCallbacks(
1339
- this.constructorOnToolCallStart,
1340
- options.experimental_onToolCallStart,
1358
+ const mergedOnToolExecutionStart = mergeCallbacks(
1359
+ this.constructorOnToolExecutionStart,
1360
+ options.experimental_onToolExecutionStart,
1341
1361
  );
1342
- const mergedOnToolCallFinish = mergeCallbacks(
1343
- this.constructorOnToolCallFinish,
1344
- options.experimental_onToolCallFinish,
1362
+ const mergedOnToolExecutionEnd = mergeCallbacks(
1363
+ this.constructorOnToolExecutionEnd,
1364
+ options.experimental_onToolExecutionEnd,
1345
1365
  );
1346
1366
 
1347
1367
  // Determine effective tool choice
@@ -1377,7 +1397,7 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1377
1397
  });
1378
1398
  }
1379
1399
 
1380
- // Helper to wrap executeTool with onToolCallStart/onToolCallFinish callbacks
1400
+ // Helper to wrap executeTool with onToolExecutionStart/onToolExecutionEnd callbacks
1381
1401
  const executeToolWithCallbacks = async (
1382
1402
  toolCall: { toolCallId: string; toolName: string; input: unknown },
1383
1403
  tools: ToolSet,
@@ -1392,8 +1412,8 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1392
1412
  input: toolCall.input,
1393
1413
  };
1394
1414
 
1395
- if (mergedOnToolCallStart) {
1396
- await mergedOnToolCallStart({
1415
+ if (mergedOnToolExecutionStart) {
1416
+ await mergedOnToolExecutionStart({
1397
1417
  toolCall: toolCallEvent,
1398
1418
  stepNumber: currentStepNumber,
1399
1419
  });
@@ -1405,8 +1425,8 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1405
1425
  result = await executeTool(toolCall, tools, messages, context);
1406
1426
  } catch (err) {
1407
1427
  const durationMs = Date.now() - startTime;
1408
- if (mergedOnToolCallFinish) {
1409
- await mergedOnToolCallFinish({
1428
+ if (mergedOnToolExecutionEnd) {
1429
+ await mergedOnToolExecutionEnd({
1410
1430
  toolCall: toolCallEvent,
1411
1431
  stepNumber: currentStepNumber,
1412
1432
  durationMs,
@@ -1418,14 +1438,14 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1418
1438
  }
1419
1439
 
1420
1440
  const durationMs = Date.now() - startTime;
1421
- if (mergedOnToolCallFinish) {
1441
+ if (mergedOnToolExecutionEnd) {
1422
1442
  const isError =
1423
1443
  result.output &&
1424
1444
  'type' in result.output &&
1425
1445
  (result.output.type === 'error-text' ||
1426
1446
  result.output.type === 'error-json');
1427
1447
  if (isError) {
1428
- await mergedOnToolCallFinish({
1448
+ await mergedOnToolExecutionEnd({
1429
1449
  toolCall: toolCallEvent,
1430
1450
  stepNumber: currentStepNumber,
1431
1451
  durationMs,
@@ -1433,7 +1453,7 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1433
1453
  error: 'value' in result.output ? result.output.value : undefined,
1434
1454
  });
1435
1455
  } else {
1436
- await mergedOnToolCallFinish({
1456
+ await mergedOnToolExecutionEnd({
1437
1457
  toolCall: toolCallEvent,
1438
1458
  stepNumber: currentStepNumber,
1439
1459
  durationMs,
@@ -1478,7 +1498,7 @@ export class WorkflowAgent<TBaseTools extends ToolSet = ToolSet> {
1478
1498
  generationSettings: mergedGenerationSettings,
1479
1499
  toolChoice: effectiveToolChoice as ToolChoice<ToolSet>,
1480
1500
  experimental_context: experimentalContext,
1481
- experimental_telemetry: effectiveTelemetry,
1501
+ telemetry: effectiveTelemetry,
1482
1502
  includeRawChunks: options.includeRawChunks ?? false,
1483
1503
  repairToolCall: (options.experimental_repairToolCall ??
1484
1504
  this.experimentalRepairToolCall) as