@voltagent/core 0.1.69 → 0.1.70

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/dist/index.d.ts CHANGED
@@ -4659,10 +4659,6 @@ declare class Agent<TProvider extends {
4659
4659
  * Add step to history immediately and to conversation steps
4660
4660
  */
4661
4661
  private addStepToHistory;
4662
- /**
4663
- * Handle tool execution errors by creating appropriate events and steps
4664
- */
4665
- private handleToolError;
4666
4662
  /**
4667
4663
  * Update history entry
4668
4664
  */
@@ -4825,6 +4821,10 @@ type WorkflowStepFuncConfig<INPUT, DATA, RESULT, SUSPEND_DATA, RESUME_DATA = any
4825
4821
  interface WorkflowStepFunc<INPUT, DATA, RESULT, SUSPEND_DATA, RESUME_DATA = any> extends InternalBaseWorkflowStep<INPUT, DATA, RESULT, SUSPEND_DATA, RESUME_DATA> {
4826
4822
  type: "func";
4827
4823
  }
4824
+ interface WorkflowStepWorkflow<INPUT, DATA, RESULT, SUSPEND_DATA, RESUME_DATA = any> extends InternalBaseWorkflowStep<INPUT, DATA, RESULT, SUSPEND_DATA, RESUME_DATA> {
4825
+ type: "workflow";
4826
+ workflow: InternalWorkflow<INPUT, DATA, RESULT>;
4827
+ }
4828
4828
  type WorkflowStepTapConfig<INPUT, DATA, _RESULT, SUSPEND_DATA, RESUME_DATA = any> = InternalWorkflowStepConfig<{
4829
4829
  execute: InternalWorkflowFunc<INPUT, DATA, DangerouslyAllowAny, SUSPEND_DATA, RESUME_DATA>;
4830
4830
  inputSchema?: z.ZodTypeAny;
@@ -4860,7 +4860,21 @@ interface WorkflowStepParallelAll<INPUT, DATA, RESULT> extends InternalBaseWorkf
4860
4860
  type: "parallel-all";
4861
4861
  steps: ReadonlyArray<InternalAnyWorkflowStep<INPUT, DATA, RESULT>>;
4862
4862
  }
4863
- type WorkflowStep<INPUT, DATA, RESULT, SUSPEND_DATA = any> = WorkflowStepAgent<INPUT, DATA, RESULT> | WorkflowStepFunc<INPUT, DATA, RESULT, SUSPEND_DATA> | WorkflowStepConditionalWhen<INPUT, DATA, RESULT> | WorkflowStepParallelAll<INPUT, DATA, RESULT> | WorkflowStepTap<INPUT, DATA, RESULT, SUSPEND_DATA> | WorkflowStepParallelRace<INPUT, DATA, RESULT>;
4863
+ type WorkflowStep<INPUT, DATA, RESULT, SUSPEND_DATA = any> = WorkflowStepAgent<INPUT, DATA, RESULT> | WorkflowStepFunc<INPUT, DATA, RESULT, SUSPEND_DATA> | WorkflowStepConditionalWhen<INPUT, DATA, RESULT> | WorkflowStepParallelAll<INPUT, DATA, RESULT> | WorkflowStepTap<INPUT, DATA, RESULT, SUSPEND_DATA> | WorkflowStepParallelRace<INPUT, DATA, RESULT> | WorkflowStepWorkflow<INPUT, DATA, RESULT, SUSPEND_DATA>;
4864
+ /**
4865
+ * Internal type to allow overriding the run method for the workflow
4866
+ */
4867
+ interface InternalWorkflow<_INPUT, DATA, RESULT> extends Omit<Workflow<DangerouslyAllowAny, DangerouslyAllowAny>, "run"> {
4868
+ run: (input: InternalExtractWorkflowInputData<DATA>, options?: InternalWorkflowRunOptions) => Promise<{
4869
+ executionId: string;
4870
+ startAt: Date;
4871
+ endAt: Date;
4872
+ status: "completed";
4873
+ result: RESULT;
4874
+ }>;
4875
+ }
4876
+ interface InternalWorkflowRunOptions extends WorkflowRunOptions {
4877
+ }
4864
4878
 
4865
4879
  /**
4866
4880
  * Creates an async function step for the workflow
@@ -5367,6 +5381,22 @@ declare class WorkflowChain<INPUT_SCHEMA extends InternalBaseWorkflowInputSchema
5367
5381
  suspendSchema?: z.ZodTypeAny;
5368
5382
  resumeSchema?: z.ZodTypeAny;
5369
5383
  }): WorkflowChain<INPUT_SCHEMA, RESULT_SCHEMA, CURRENT_DATA, SUSPEND_SCHEMA, RESUME_SCHEMA>;
5384
+ /**
5385
+ * Add a workflow step to the workflow
5386
+ *
5387
+ * @example
5388
+ * ```ts
5389
+ * import { myWorkflow } from "./my-workflow";
5390
+ *
5391
+ * const workflow = createWorkflowChain(config)
5392
+ * .andThen(async (data) => {
5393
+ * const userInfo = await fetchUserInfo(data.userId);
5394
+ * return { userInfo };
5395
+ * })
5396
+ * .andWorkflow(myWorkflow)
5397
+ * ```
5398
+ */
5399
+ andWorkflow<NEW_DATA>(workflow: InternalWorkflow<INPUT_SCHEMA, CURRENT_DATA, NEW_DATA>): WorkflowChain<INPUT_SCHEMA, RESULT_SCHEMA, NEW_DATA>;
5370
5400
  /**
5371
5401
  * Add a parallel execution step that runs multiple steps simultaneously and waits for all to complete
5372
5402
  *
package/dist/index.js CHANGED
@@ -3366,6 +3366,28 @@ function andTap({
3366
3366
  }
3367
3367
  __name(andTap, "andTap");
3368
3368
 
3369
+ // src/workflow/steps/and-workflow.ts
3370
+ function andWorkflow(workflow) {
3371
+ return {
3372
+ type: "workflow",
3373
+ workflow,
3374
+ id: workflow.id,
3375
+ name: workflow.name,
3376
+ purpose: workflow.purpose,
3377
+ execute: async (context) => {
3378
+ const { result } = await workflow.run(context.data, {
3379
+ active: context.state.active,
3380
+ executionId: context.state.executionId,
3381
+ conversationId: context.state.conversationId,
3382
+ userId: context.state.userId,
3383
+ userContext: context.state.userContext
3384
+ });
3385
+ return result;
3386
+ }
3387
+ };
3388
+ }
3389
+ __name(andWorkflow, "andWorkflow");
3390
+
3369
3391
  // src/workflow/core.ts
3370
3392
  var import_zod = require("zod");
3371
3393
 
@@ -7643,6 +7665,27 @@ var WorkflowChain = class {
7643
7665
  this.steps.push(finalStep);
7644
7666
  return this;
7645
7667
  }
7668
+ /**
7669
+ * Add a workflow step to the workflow
7670
+ *
7671
+ * @example
7672
+ * ```ts
7673
+ * import { myWorkflow } from "./my-workflow";
7674
+ *
7675
+ * const workflow = createWorkflowChain(config)
7676
+ * .andThen(async (data) => {
7677
+ * const userInfo = await fetchUserInfo(data.userId);
7678
+ * return { userInfo };
7679
+ * })
7680
+ * .andWorkflow(myWorkflow)
7681
+ * ```
7682
+ */
7683
+ andWorkflow(workflow) {
7684
+ this.steps.push(
7685
+ andWorkflow(workflow)
7686
+ );
7687
+ return this;
7688
+ }
7646
7689
  /**
7647
7690
  * Add a parallel execution step that runs multiple steps simultaneously and waits for all to complete
7648
7691
  *
@@ -12248,10 +12291,15 @@ ${retrieverContext}`;
12248
12291
  toolName: tool2.name,
12249
12292
  agentId: this.id,
12250
12293
  modelName: this.getModelName(),
12251
- error: error instanceof Error ? error.message : error
12294
+ error
12252
12295
  }
12253
12296
  );
12254
- throw error;
12297
+ const result = {
12298
+ error: true,
12299
+ message: error instanceof Error ? error.message : String(error),
12300
+ stack: error instanceof Error ? error.stack : void 0
12301
+ };
12302
+ return result;
12255
12303
  }
12256
12304
  }
12257
12305
  };
@@ -12452,107 +12500,6 @@ ${retrieverContext}`;
12452
12500
  };
12453
12501
  context.conversationSteps.push(finalStep);
12454
12502
  }
12455
- /**
12456
- * Handle tool execution errors by creating appropriate events and steps
12457
- */
12458
- async handleToolError(error, operationContext, options) {
12459
- if (!error.toolError) {
12460
- return;
12461
- }
12462
- const { userId, conversationId, internalOptions } = options;
12463
- const { toolCallId, toolName } = error.toolError;
12464
- try {
12465
- const toolStartInfo = operationContext.userContext.get(`tool_${toolCallId}`) || { eventId: void 0, startTime: (/* @__PURE__ */ new Date()).toISOString() };
12466
- const toolErrorEvent = {
12467
- id: crypto.randomUUID(),
12468
- name: "tool:error",
12469
- type: "tool",
12470
- startTime: toolStartInfo.startTime,
12471
- endTime: (/* @__PURE__ */ new Date()).toISOString(),
12472
- status: "error",
12473
- level: "ERROR",
12474
- input: null,
12475
- output: null,
12476
- statusMessage: {
12477
- message: error.message,
12478
- code: error.code,
12479
- ...error.toolError && { toolError: error.toolError }
12480
- },
12481
- metadata: {
12482
- displayName: toolName,
12483
- id: toolName,
12484
- agentId: this.id
12485
- },
12486
- traceId: operationContext.historyEntry.id,
12487
- parentEventId: toolStartInfo.eventId
12488
- };
12489
- this.publishTimelineEvent(operationContext, toolErrorEvent);
12490
- const toolErrorStep = {
12491
- id: toolCallId,
12492
- type: "tool_result",
12493
- name: toolName,
12494
- result: {
12495
- error
12496
- },
12497
- content: JSON.stringify([
12498
- {
12499
- type: "tool-result",
12500
- toolCallId,
12501
- toolName,
12502
- result: {
12503
- error: {
12504
- message: error.message,
12505
- code: error.code
12506
- }
12507
- }
12508
- }
12509
- ]),
12510
- role: "assistant"
12511
- };
12512
- this.addStepToHistory(toolErrorStep, operationContext);
12513
- if (userId) {
12514
- const onStepFinish = this.memoryManager.createStepFinishHandler(
12515
- operationContext,
12516
- userId,
12517
- conversationId
12518
- );
12519
- await onStepFinish(toolErrorStep);
12520
- }
12521
- const tool2 = this.toolManager.getToolByName(toolName);
12522
- if (tool2 && internalOptions) {
12523
- await this.getMergedHooks(internalOptions).onToolEnd?.({
12524
- agent: this,
12525
- tool: tool2,
12526
- output: void 0,
12527
- error,
12528
- context: operationContext
12529
- });
12530
- }
12531
- const methodLogger = operationContext.logger || this.logger;
12532
- methodLogger.error(
12533
- buildAgentLogMessage(this.name, "toolCall" /* TOOL_CALL */, `Tool ${toolName} failed`),
12534
- {
12535
- event: LogEvents.TOOL_EXECUTION_FAILED,
12536
- toolName,
12537
- toolCallId,
12538
- error: {
12539
- message: error.message,
12540
- code: error.code
12541
- }
12542
- }
12543
- );
12544
- } catch (updateError) {
12545
- const methodLogger = operationContext.logger || this.logger;
12546
- methodLogger.error(
12547
- `Failed to update tool event to error status for ${toolName} (${toolCallId})`,
12548
- {
12549
- toolName,
12550
- toolCallId,
12551
- error: updateError
12552
- }
12553
- );
12554
- }
12555
- }
12556
12503
  /**
12557
12504
  * Update history entry
12558
12505
  */
@@ -12845,7 +12792,8 @@ ${retrieverContext}`;
12845
12792
  ...internalOptions,
12846
12793
  conversationId: finalConversationId,
12847
12794
  historyEntryId: operationContext.historyEntry.id,
12848
- operationContext
12795
+ operationContext,
12796
+ logger: methodLogger
12849
12797
  });
12850
12798
  const promptHelper = VoltOpsClient.createPromptHelperWithFallback(
12851
12799
  this.id,
@@ -13011,8 +12959,12 @@ ${retrieverContext}`;
13011
12959
  level: "ERROR",
13012
12960
  input: null,
13013
12961
  output: null,
13014
- statusMessage: step.result?.error || {
13015
- message: "Unknown tool error"
12962
+ statusMessage: {
12963
+ message: step.result?.message || "Unknown tool error",
12964
+ // Include stack trace if available (from tool wrapper)
12965
+ ...step.result?.stack && {
12966
+ stack: step.result.stack
12967
+ }
13016
12968
  },
13017
12969
  metadata: {
13018
12970
  displayName: toolName,
@@ -13160,13 +13112,6 @@ ${retrieverContext}`;
13160
13112
  return extendedResponse;
13161
13113
  } catch (error) {
13162
13114
  const voltagentError = error;
13163
- if (voltagentError.toolError) {
13164
- await this.handleToolError(voltagentError, operationContext, {
13165
- userId,
13166
- conversationId: finalConversationId,
13167
- internalOptions
13168
- });
13169
- }
13170
13115
  const agentErrorStartInfo = {
13171
13116
  startTime: operationContext.userContext.get("agent_start_time") || (/* @__PURE__ */ new Date()).toISOString(),
13172
13117
  eventId: operationContext.userContext.get("agent_start_event_id")
@@ -13372,7 +13317,8 @@ ${retrieverContext}`;
13372
13317
  historyEntryId: operationContext.historyEntry.id,
13373
13318
  operationContext,
13374
13319
  // Pass the internal forwarder to tools
13375
- internalStreamForwarder: internalStreamEventForwarder
13320
+ internalStreamForwarder: internalStreamEventForwarder,
13321
+ logger: methodLogger
13376
13322
  });
13377
13323
  const promptHelper = VoltOpsClient.createPromptHelperWithFallback(
13378
13324
  this.id,
@@ -13468,7 +13414,13 @@ ${retrieverContext}`;
13468
13414
  level: "ERROR",
13469
13415
  input: null,
13470
13416
  output: null,
13471
- statusMessage: chunk.result?.error || { message: "Unknown tool error" },
13417
+ statusMessage: {
13418
+ message: chunk.result?.message || "Unknown tool error",
13419
+ // Include stack trace if available (from tool wrapper)
13420
+ ...chunk.result?.stack && {
13421
+ stack: chunk.result.stack
13422
+ }
13423
+ },
13472
13424
  metadata: {
13473
13425
  displayName: toolName,
13474
13426
  id: toolName,
@@ -13671,13 +13623,6 @@ ${retrieverContext}`;
13671
13623
  }
13672
13624
  },
13673
13625
  onError: async (error) => {
13674
- if (error.toolError) {
13675
- await this.handleToolError(error, operationContext, {
13676
- userId,
13677
- conversationId: finalConversationId,
13678
- internalOptions
13679
- });
13680
- }
13681
13626
  const agentErrorStartInfo = {
13682
13627
  startTime: operationContext.userContext.get("agent_start_time") || (/* @__PURE__ */ new Date()).toISOString(),
13683
13628
  eventId: operationContext.userContext.get("agent_start_event_id")