@upstash/workflow 0.2.22-rc → 0.3.0-rc

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.
@@ -1,23 +1,3 @@
1
- // src/constants.ts
2
- var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
3
- var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
4
- var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
5
- var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
6
- var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
7
- var WORKFLOW_INVOKE_COUNT_HEADER = "Upstash-Workflow-Invoke-Count";
8
- var WORKFLOW_LABEL_HEADER = "Upstash-Label";
9
- var WORKFLOW_PROTOCOL_VERSION = "1";
10
- var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
11
- var DEFAULT_CONTENT_TYPE = "application/json";
12
- var NO_CONCURRENCY = 1;
13
- var DEFAULT_RETRIES = 3;
14
- var VERSION = "v0.2.21";
15
- var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
16
- var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
17
- var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
18
- var TELEMETRY_HEADER_RUNTIME = "Upstash-Telemetry-Runtime";
19
- var TELEMETRY_HEADER_AGENT = "Upstash-Telemetry-Agent";
20
-
21
1
  // src/error.ts
22
2
  import { QstashError } from "@upstash/qstash";
23
3
  var WorkflowError = class extends QstashError {
@@ -59,6 +39,19 @@ var WorkflowNonRetryableError = class extends WorkflowAbort {
59
39
  if (message) this.message = message;
60
40
  }
61
41
  };
42
+ var WorkflowRetryAfterError = class extends WorkflowAbort {
43
+ retryAfter;
44
+ /**
45
+ * @param retryAfter time in seconds after which the workflow should be retried
46
+ * @param message error message to be displayed
47
+ */
48
+ constructor(message, retryAfter) {
49
+ super("retry", void 0, false);
50
+ this.name = "WorkflowRetryAfterError";
51
+ this.retryAfter = retryAfter;
52
+ if (message) this.message = message;
53
+ }
54
+ };
62
55
  var formatWorkflowError = (error) => {
63
56
  return error instanceof Error ? {
64
57
  error: error.name,
@@ -69,6 +62,46 @@ var formatWorkflowError = (error) => {
69
62
  message: `An error occured while executing workflow: '${typeof error === "string" ? error : JSON.stringify(error)}'`
70
63
  };
71
64
  };
65
+ function getConstructorName(obj) {
66
+ if (obj === null || obj === void 0) {
67
+ return null;
68
+ }
69
+ const ctor = obj.constructor;
70
+ if (!ctor || ctor.name === "Object") {
71
+ return null;
72
+ }
73
+ return ctor.name;
74
+ }
75
+ function getConstructorNames(obj) {
76
+ const proto = Object.getPrototypeOf(obj);
77
+ const name = getConstructorName(proto);
78
+ if (name === null) {
79
+ return [];
80
+ }
81
+ return [name, ...getConstructorNames(proto)];
82
+ }
83
+ function isInstanceOf(v, ctor) {
84
+ return getConstructorNames(v).includes(ctor.name);
85
+ }
86
+
87
+ // src/constants.ts
88
+ var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
89
+ var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
90
+ var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
91
+ var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
92
+ var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
93
+ var WORKFLOW_INVOKE_COUNT_HEADER = "Upstash-Workflow-Invoke-Count";
94
+ var WORKFLOW_LABEL_HEADER = "Upstash-Label";
95
+ var WORKFLOW_PROTOCOL_VERSION = "1";
96
+ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
97
+ var DEFAULT_CONTENT_TYPE = "application/json";
98
+ var NO_CONCURRENCY = 1;
99
+ var DEFAULT_RETRIES = 3;
100
+ var VERSION = "v0.3.0-rc";
101
+ var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
102
+ var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
103
+ var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
104
+ var TELEMETRY_HEADER_RUNTIME = "Upstash-Telemetry-Runtime";
72
105
 
73
106
  // src/types.ts
74
107
  var StepTypes = [
@@ -82,137 +115,6 @@ var StepTypes = [
82
115
  "Invoke"
83
116
  ];
84
117
 
85
- // src/agents/adapters.ts
86
- import { tool } from "ai";
87
-
88
- // src/agents/constants.ts
89
- var AGENT_NAME_HEADER = "upstash-agent-name";
90
- var MANAGER_AGENT_PROMPT = `You are an agent orchestrating other AI Agents.
91
-
92
- These other agents have tools available to them.
93
-
94
- Given a prompt, utilize these agents to address requests.
95
-
96
- Don't always call all the agents provided to you at the same time. You can call one and use it's response to call another.
97
-
98
- Avoid calling the same agent twice in one turn. Instead, prefer to call it once but provide everything
99
- you need from that agent.
100
- `;
101
-
102
- // src/agents/adapters.ts
103
- var fetchWithContextCall = async (context, agentCallParams, ...params) => {
104
- const [input, init] = params;
105
- try {
106
- const headers = init?.headers ? Object.fromEntries(new Headers(init.headers).entries()) : {};
107
- const body = init?.body ? JSON.parse(init.body) : void 0;
108
- const agentName = headers[AGENT_NAME_HEADER];
109
- const stepName = agentName ? `Call Agent ${agentName}` : "Call Agent";
110
- const responseInfo = await context.call(stepName, {
111
- url: input.toString(),
112
- method: init?.method,
113
- headers,
114
- body,
115
- timeout: agentCallParams?.timeout,
116
- retries: agentCallParams?.retries,
117
- retryDelay: agentCallParams?.retryDelay,
118
- flowControl: agentCallParams?.flowControl
119
- });
120
- const responseHeaders = new Headers(
121
- Object.entries(responseInfo.header).reduce(
122
- (acc, [key, values]) => {
123
- acc[key] = values.join(", ");
124
- return acc;
125
- },
126
- {}
127
- )
128
- );
129
- return new Response(JSON.stringify(responseInfo.body), {
130
- status: responseInfo.status,
131
- headers: responseHeaders
132
- });
133
- } catch (error) {
134
- if (error instanceof Error && error.name === "WorkflowAbort") {
135
- throw error;
136
- } else {
137
- console.error("Error in fetch implementation:", error);
138
- throw error;
139
- }
140
- }
141
- };
142
- var createWorkflowModel = ({
143
- context,
144
- provider,
145
- providerParams,
146
- agentCallParams
147
- }) => {
148
- return provider({
149
- fetch: (...params) => fetchWithContextCall(context, agentCallParams, ...params),
150
- ...providerParams
151
- });
152
- };
153
- var wrapTools = ({
154
- context,
155
- tools
156
- }) => {
157
- return Object.fromEntries(
158
- Object.entries(tools).map((toolInfo) => {
159
- const [toolName, tool3] = toolInfo;
160
- const executeAsStep = "executeAsStep" in tool3 ? tool3.executeAsStep : true;
161
- const aiSDKTool = convertToAISDKTool(tool3);
162
- const execute = aiSDKTool.execute;
163
- if (execute && executeAsStep) {
164
- const wrappedExecute = (...params) => {
165
- return context.run(`Run tool ${toolName}`, () => execute(...params));
166
- };
167
- aiSDKTool.execute = wrappedExecute;
168
- }
169
- return [toolName, aiSDKTool];
170
- })
171
- );
172
- };
173
- var convertToAISDKTool = (tool3) => {
174
- const isLangchainTool = "invoke" in tool3;
175
- return isLangchainTool ? convertLangchainTool(tool3) : tool3;
176
- };
177
- var convertLangchainTool = (langchainTool) => {
178
- return tool({
179
- description: langchainTool.description,
180
- parameters: langchainTool.schema,
181
- execute: async (...param) => langchainTool.invoke(...param)
182
- });
183
- };
184
- var WorkflowTool = class {
185
- /**
186
- * description of the tool
187
- */
188
- description;
189
- /**
190
- * schema of the tool
191
- */
192
- schema;
193
- /**
194
- * function to invoke the tool
195
- */
196
- invoke;
197
- /**
198
- * whether the invoke method of the tool is to be wrapped with `context.run`
199
- */
200
- executeAsStep;
201
- /**
202
- *
203
- * @param description description of the tool
204
- * @param schema schema of the tool
205
- * @param invoke function to invoke the tool
206
- * @param executeAsStep whether the invoke method of the tool is to be wrapped with `context.run`
207
- */
208
- constructor(params) {
209
- this.description = params.description;
210
- this.schema = params.schema;
211
- this.invoke = params.invoke;
212
- this.executeAsStep = params.executeAsStep ?? true;
213
- }
214
- };
215
-
216
118
  // src/serve/serve-many.ts
217
119
  var getWorkflowId = (url) => {
218
120
  const components = url.split("/");
@@ -342,7 +244,7 @@ var getSteps = async (requester, workflowRunId, messageId, debug) => {
342
244
  return { steps: filteredSteps, workflowRunEnded: false };
343
245
  }
344
246
  } catch (error) {
345
- if (error instanceof QstashError2 && error.status === 404) {
247
+ if (isInstanceOf(error, QstashError2) && error.status === 404) {
346
248
  await debug?.log("WARN", "ENDPOINT_START", {
347
249
  message: "Couldn't fetch workflow run steps. This can happen if the workflow run succesfully ends before some callback is executed.",
348
250
  error
@@ -719,9 +621,9 @@ var Ok = class {
719
621
  }
720
622
  safeUnwrap() {
721
623
  const value = this.value;
722
- return function* () {
624
+ return (function* () {
723
625
  return value;
724
- }();
626
+ })();
725
627
  }
726
628
  _unsafeUnwrap(_) {
727
629
  return this.value;
@@ -780,10 +682,10 @@ var Err = class {
780
682
  }
781
683
  safeUnwrap() {
782
684
  const error = this.error;
783
- return function* () {
685
+ return (function* () {
784
686
  yield err(error);
785
687
  throw new Error("Do not use this generator out of `safeTry`");
786
- }();
688
+ })();
787
689
  }
788
690
  _unsafeUnwrap(config) {
789
691
  throw createNeverThrowError("Called `_unsafeUnwrap` on an Err", this, config);
@@ -895,17 +797,17 @@ var triggerRouteFunction = async ({
895
797
  return ok("workflow-finished");
896
798
  } catch (error) {
897
799
  const error_ = error;
898
- if (error instanceof QstashError3 && error.status === 400) {
800
+ if (isInstanceOf(error, QstashError3) && error.status === 400) {
899
801
  await debug?.log("WARN", "RESPONSE_WORKFLOW", {
900
802
  message: `tried to append to a cancelled workflow. exiting without publishing.`,
901
803
  name: error.name,
902
804
  errorMessage: error.message
903
805
  });
904
806
  return ok("workflow-was-finished");
905
- } else if (!(error_ instanceof WorkflowAbort)) {
906
- return err(error_);
907
- } else if (error_ instanceof WorkflowNonRetryableError) {
807
+ } else if (isInstanceOf(error_, WorkflowNonRetryableError) || isInstanceOf(error_, WorkflowRetryAfterError)) {
908
808
  return ok(error_);
809
+ } else if (!isInstanceOf(error_, WorkflowAbort)) {
810
+ return err(error_);
909
811
  } else if (error_.cancelWorkflow) {
910
812
  await onCancel();
911
813
  return ok("workflow-finished");
@@ -1786,8 +1688,7 @@ var WorkflowHeaders = class {
1786
1688
  [WORKFLOW_URL_HEADER]: this.workflowConfig.workflowUrl,
1787
1689
  [WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody,WF_DetectTrigger" + (this.keepTriggerConfig ? ",WF_TriggerOnConfig" : ""),
1788
1690
  [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
1789
- ...this.workflowConfig.telemetry ? getTelemetryHeaders(this.workflowConfig.telemetry) : {},
1790
- ...this.workflowConfig.telemetry && this.stepInfo?.lazyStep instanceof LazyCallStep && this.stepInfo.lazyStep.headers[AGENT_NAME_HEADER] ? { [TELEMETRY_HEADER_AGENT]: "true" } : {}
1691
+ ...this.workflowConfig.telemetry ? getTelemetryHeaders(this.workflowConfig.telemetry) : {}
1791
1692
  };
1792
1693
  if (this.stepInfo?.lazyStep.stepType !== "Call") {
1793
1694
  this.headers.rawHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
@@ -2198,7 +2099,7 @@ var AutoExecutor = class _AutoExecutor {
2198
2099
  });
2199
2100
  throw new WorkflowAbort(parallelStep.stepName, resultStep);
2200
2101
  } catch (error) {
2201
- if (error instanceof WorkflowAbort || error instanceof QstashError5 && error.status === 400) {
2102
+ if (isInstanceOf(error, WorkflowAbort) || isInstanceOf(error, QstashError5) && error.status === 400) {
2202
2103
  throw error;
2203
2104
  }
2204
2105
  throw new WorkflowError(
@@ -2305,7 +2206,7 @@ var validateParallelSteps = (lazySteps, stepsFromRequest) => {
2305
2206
  validateStep(lazySteps[index], stepFromRequest);
2306
2207
  }
2307
2208
  } catch (error) {
2308
- if (error instanceof WorkflowError) {
2209
+ if (isInstanceOf(error, WorkflowError)) {
2309
2210
  const lazyStepNames = lazySteps.map((lazyStep) => lazyStep.stepName);
2310
2211
  const lazyStepTypes = lazySteps.map((lazyStep) => lazyStep.stepType);
2311
2212
  const requestStepNames = stepsFromRequest.map((step) => step.stepName);
@@ -2450,225 +2351,6 @@ var WorkflowApi = class extends BaseWorkflowApi {
2450
2351
  }
2451
2352
  };
2452
2353
 
2453
- // src/agents/index.ts
2454
- import { createOpenAI } from "@ai-sdk/openai";
2455
-
2456
- // src/agents/agent.ts
2457
- import { z } from "zod";
2458
- import { generateText, tool as tool2, ToolExecutionError } from "ai";
2459
-
2460
- // src/serve/utils.ts
2461
- var isDisabledWorkflowContext = (context) => {
2462
- return "disabled" in context;
2463
- };
2464
-
2465
- // src/agents/agent.ts
2466
- var Agent = class {
2467
- name;
2468
- tools;
2469
- maxSteps;
2470
- background;
2471
- model;
2472
- temparature;
2473
- context;
2474
- constructor({ tools, maxSteps, background, name, model, temparature = 0.1 }, context) {
2475
- this.name = name;
2476
- this.tools = tools ?? {};
2477
- this.maxSteps = maxSteps;
2478
- this.background = background;
2479
- this.model = model;
2480
- this.temparature = temparature;
2481
- this.context = context;
2482
- }
2483
- /**
2484
- * Trigger the agent by passing a prompt
2485
- *
2486
- * @param prompt task to assign to the agent
2487
- * @returns Response as `{ text: string }`
2488
- */
2489
- async call({ prompt }) {
2490
- try {
2491
- if (isDisabledWorkflowContext(this.context)) {
2492
- await this.context.sleep("abort", 0);
2493
- }
2494
- const result = await generateText({
2495
- model: this.model,
2496
- tools: this.tools,
2497
- maxSteps: this.maxSteps,
2498
- system: this.background,
2499
- prompt,
2500
- headers: {
2501
- [AGENT_NAME_HEADER]: this.name
2502
- },
2503
- temperature: this.temparature
2504
- });
2505
- return { text: result.text };
2506
- } catch (error) {
2507
- if (error instanceof ToolExecutionError) {
2508
- if (error.cause instanceof Error && error.cause.name === "WorkflowAbort") {
2509
- throw error.cause;
2510
- } else if (error.cause instanceof ToolExecutionError && error.cause.cause instanceof Error && error.cause.cause.name === "WorkflowAbort") {
2511
- throw error.cause.cause;
2512
- } else {
2513
- throw error;
2514
- }
2515
- } else {
2516
- throw error;
2517
- }
2518
- }
2519
- }
2520
- /**
2521
- * Convert the agent to a tool which can be used by other agents.
2522
- *
2523
- * @returns the agent as a tool
2524
- */
2525
- asTool() {
2526
- const toolDescriptions = Object.values(this.tools).map((tool3) => tool3.description).join("\n");
2527
- return tool2({
2528
- parameters: z.object({ prompt: z.string() }),
2529
- execute: async ({ prompt }) => {
2530
- return await this.call({ prompt });
2531
- },
2532
- description: `An AI Agent with the following background: ${this.background}Has access to the following tools: ${toolDescriptions}`
2533
- });
2534
- }
2535
- };
2536
- var ManagerAgent = class extends Agent {
2537
- agents;
2538
- /**
2539
- * A manager agent which coordinates agents available to it to achieve a
2540
- * given task
2541
- *
2542
- * @param name Name of the agent
2543
- * @param background Background of the agent. If not passed, default will be used.
2544
- * @param model LLM model to use
2545
- * @param agents: List of agents available to the agent
2546
- * @param maxSteps number of times the manager agent can call the LLM at most.
2547
- * If the agent abruptly stops execution after calling other agents, you may
2548
- * need to increase maxSteps
2549
- */
2550
- constructor({
2551
- agents,
2552
- background = MANAGER_AGENT_PROMPT,
2553
- model,
2554
- maxSteps,
2555
- name = "manager llm"
2556
- }, context) {
2557
- super(
2558
- {
2559
- background,
2560
- maxSteps,
2561
- tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool()])),
2562
- name,
2563
- model
2564
- },
2565
- context
2566
- );
2567
- this.agents = agents;
2568
- }
2569
- };
2570
-
2571
- // src/agents/task.ts
2572
- var Task = class {
2573
- context;
2574
- taskParameters;
2575
- constructor({
2576
- context,
2577
- taskParameters
2578
- }) {
2579
- this.context = context;
2580
- this.taskParameters = taskParameters;
2581
- }
2582
- /**
2583
- * Run the agents to complete the task
2584
- *
2585
- * @returns Result of the task as { text: string }
2586
- */
2587
- async run() {
2588
- const { prompt, ...otherParams } = this.taskParameters;
2589
- if ("agent" in otherParams) {
2590
- const agent = otherParams.agent;
2591
- const result = await agent.call({
2592
- prompt
2593
- });
2594
- return { text: result.text };
2595
- } else {
2596
- const { agents, maxSteps, model, background } = otherParams;
2597
- const managerAgent = new ManagerAgent(
2598
- {
2599
- model,
2600
- maxSteps,
2601
- agents,
2602
- name: "Manager LLM",
2603
- background
2604
- },
2605
- this.context
2606
- );
2607
- const result = await managerAgent.call({ prompt });
2608
- return { text: result.text };
2609
- }
2610
- }
2611
- };
2612
-
2613
- // src/agents/index.ts
2614
- var WorkflowAgents = class {
2615
- context;
2616
- constructor({ context }) {
2617
- this.context = context;
2618
- }
2619
- /**
2620
- * Defines an agent
2621
- *
2622
- * ```ts
2623
- * const researcherAgent = context.agents.agent({
2624
- * model,
2625
- * name: 'academic',
2626
- * maxSteps: 2,
2627
- * tools: {
2628
- * wikiTool: new WikipediaQueryRun({
2629
- * topKResults: 1,
2630
- * maxDocContentLength: 500,
2631
- * })
2632
- * },
2633
- * background:
2634
- * 'You are researcher agent with access to Wikipedia. ' +
2635
- * 'Utilize Wikipedia as much as possible for correct information',
2636
- * });
2637
- * ```
2638
- *
2639
- * @param params agent parameters
2640
- * @returns
2641
- */
2642
- agent(params) {
2643
- const wrappedTools = wrapTools({ context: this.context, tools: params.tools });
2644
- return new Agent(
2645
- {
2646
- ...params,
2647
- tools: wrappedTools
2648
- },
2649
- this.context
2650
- );
2651
- }
2652
- task(taskParameters) {
2653
- return new Task({ context: this.context, taskParameters });
2654
- }
2655
- /**
2656
- * creates an openai model for agents
2657
- */
2658
- openai(...params) {
2659
- const [model, settings] = params;
2660
- const { baseURL, apiKey, callSettings, ...otherSettings } = settings ?? {};
2661
- const openaiModel = this.AISDKModel({
2662
- context: this.context,
2663
- provider: createOpenAI,
2664
- providerParams: { baseURL, apiKey, compatibility: "strict" },
2665
- agentCallParams: callSettings
2666
- });
2667
- return openaiModel(model, otherSettings);
2668
- }
2669
- AISDKModel = createWorkflowModel;
2670
- };
2671
-
2672
2354
  // src/context/context.ts
2673
2355
  var WorkflowContext = class {
2674
2356
  executor;
@@ -2902,7 +2584,7 @@ var WorkflowContext = class {
2902
2584
  * @returns result of the step function
2903
2585
  */
2904
2586
  async run(stepName, stepFunction) {
2905
- const wrappedStepFunction = () => this.executor.wrapStep(stepName, stepFunction);
2587
+ const wrappedStepFunction = (() => this.executor.wrapStep(stepName, stepFunction));
2906
2588
  return await this.addStep(new LazyFunctionStep(stepName, wrappedStepFunction));
2907
2589
  }
2908
2590
  /**
@@ -3073,11 +2755,6 @@ var WorkflowContext = class {
3073
2755
  context: this
3074
2756
  });
3075
2757
  }
3076
- get agents() {
3077
- return new WorkflowAgents({
3078
- context: this
3079
- });
3080
- }
3081
2758
  };
3082
2759
 
3083
2760
  // src/logger.ts
@@ -3181,7 +2858,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
3181
2858
  try {
3182
2859
  await routeFunction(disabledContext);
3183
2860
  } catch (error) {
3184
- if (error instanceof WorkflowAbort && error.stepName === this.disabledMessage || error instanceof WorkflowNonRetryableError) {
2861
+ if (isInstanceOf(error, WorkflowAbort) && error.stepName === this.disabledMessage || isInstanceOf(error, WorkflowNonRetryableError) || isInstanceOf(error, WorkflowRetryAfterError)) {
3185
2862
  return ok("step-found");
3186
2863
  }
3187
2864
  console.warn(
@@ -3434,13 +3111,24 @@ var processOptions = (options) => {
3434
3111
  },
3435
3112
  status: 489
3436
3113
  });
3437
- } else if (detailedFinishCondition?.condition === "failure-callback") {
3438
- return new Response(detailedFinishCondition.result ?? void 0, {
3439
- status: 200,
3114
+ } else if (detailedFinishCondition?.condition === "retry-after-error") {
3115
+ return new Response(JSON.stringify(formatWorkflowError(detailedFinishCondition.result)), {
3440
3116
  headers: {
3117
+ "Retry-After": detailedFinishCondition.result.retryAfter.toString(),
3441
3118
  [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3442
- }
3119
+ },
3120
+ status: 429
3443
3121
  });
3122
+ } else if (detailedFinishCondition?.condition === "failure-callback") {
3123
+ return new Response(
3124
+ JSON.stringify({ result: detailedFinishCondition.result ?? void 0 }),
3125
+ {
3126
+ status: 200,
3127
+ headers: {
3128
+ [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
3129
+ }
3130
+ }
3131
+ );
3444
3132
  }
3445
3133
  return new Response(JSON.stringify({ workflowRunId }), {
3446
3134
  status: 200,
@@ -3650,12 +3338,18 @@ var serveBase = (routeFunction, telemetry, options) => {
3650
3338
  },
3651
3339
  debug
3652
3340
  });
3653
- if (result.isOk() && result.value instanceof WorkflowNonRetryableError) {
3341
+ if (result.isOk() && isInstanceOf(result.value, WorkflowNonRetryableError)) {
3654
3342
  return onStepFinish(workflowRunId, result.value, {
3655
3343
  condition: "non-retryable-error",
3656
3344
  result: result.value
3657
3345
  });
3658
3346
  }
3347
+ if (result.isOk() && isInstanceOf(result.value, WorkflowRetryAfterError)) {
3348
+ return onStepFinish(workflowRunId, result.value, {
3349
+ condition: "retry-after-error",
3350
+ result: result.value
3351
+ });
3352
+ }
3659
3353
  if (result.isErr()) {
3660
3354
  await debug?.log("ERROR", "ERROR", { error: result.error.message });
3661
3355
  throw result.error;
@@ -3686,7 +3380,7 @@ var serveBase = (routeFunction, telemetry, options) => {
3686
3380
  const errorMessage = `Error while running onError callback: '${formattedOnErrorError.message}'.
3687
3381
  Original error: '${formattedError.message}'`;
3688
3382
  console.error(errorMessage);
3689
- return new Response(errorMessage, {
3383
+ return new Response(JSON.stringify({ error: errorMessage }), {
3690
3384
  status: 500,
3691
3385
  headers: {
3692
3386
  [WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION
@@ -3715,18 +3409,18 @@ var serve = (routeFunction, options) => {
3715
3409
  };
3716
3410
 
3717
3411
  export {
3412
+ WorkflowError,
3413
+ WorkflowAbort,
3414
+ WorkflowNonRetryableError,
3415
+ WorkflowRetryAfterError,
3718
3416
  makeNotifyRequest,
3719
3417
  makeGetWaitersRequest,
3720
3418
  WORKFLOW_LABEL_HEADER,
3721
3419
  SDK_TELEMETRY,
3722
- WorkflowError,
3723
- WorkflowAbort,
3724
- WorkflowNonRetryableError,
3725
3420
  getWorkflowRunId,
3726
3421
  StepTypes,
3727
3422
  triggerFirstInvocation,
3728
3423
  prepareFlowControl,
3729
- WorkflowTool,
3730
3424
  serveManyBase,
3731
3425
  WorkflowContext,
3732
3426
  WorkflowLogger,
package/cloudflare.d.mts CHANGED
@@ -1,9 +1,7 @@
1
- import { R as RouteFunction, n as PublicServeOptions, y as InvokableWorkflow } from './types-Q3dM0UlR.mjs';
2
- import { s as serveManyBase } from './serve-many-BNusWYgt.mjs';
1
+ import { R as RouteFunction, n as PublicServeOptions, y as InvokableWorkflow } from './types-DESkn7K9.mjs';
2
+ import { s as serveManyBase } from './serve-many-DEwKPF6H.mjs';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
- import 'ai';
6
- import '@ai-sdk/openai';
7
5
 
8
6
  type WorkflowBindings = {
9
7
  QSTASH_TOKEN: string;
@@ -35,7 +33,7 @@ type WorkersHandlerArgs = [Request, Record<string, string | undefined>];
35
33
  declare const serve: <TInitialPayload = unknown, TResult = unknown>(routeFunction: RouteFunction<TInitialPayload, TResult>, options?: PublicServeOptions<TInitialPayload>) => {
36
34
  fetch: (...args: PagesHandlerArgs | WorkersHandlerArgs) => Promise<Response>;
37
35
  };
38
- declare const createWorkflow: <TInitialPayload, TResult>(routeFunction: RouteFunction<TInitialPayload, TResult>, options?: PublicServeOptions<TInitialPayload> | undefined) => InvokableWorkflow<TInitialPayload, TResult>;
36
+ declare const createWorkflow: <TInitialPayload, TResult>(...params: Parameters<typeof serve<TInitialPayload, TResult>>) => InvokableWorkflow<TInitialPayload, TResult>;
39
37
  declare const serveMany: (workflows: Parameters<typeof serveManyBase>[0]["workflows"], options?: Parameters<typeof serveManyBase>[0]["options"]) => {
40
38
  fetch: (...params: PagesHandlerArgs | WorkersHandlerArgs) => Promise<any>;
41
39
  };
package/cloudflare.d.ts CHANGED
@@ -1,9 +1,7 @@
1
- import { R as RouteFunction, n as PublicServeOptions, y as InvokableWorkflow } from './types-Q3dM0UlR.js';
2
- import { s as serveManyBase } from './serve-many-CXqQP3RI.js';
1
+ import { R as RouteFunction, n as PublicServeOptions, y as InvokableWorkflow } from './types-DESkn7K9.js';
2
+ import { s as serveManyBase } from './serve-many-DVtHRxeg.js';
3
3
  import '@upstash/qstash';
4
4
  import 'zod';
5
- import 'ai';
6
- import '@ai-sdk/openai';
7
5
 
8
6
  type WorkflowBindings = {
9
7
  QSTASH_TOKEN: string;
@@ -35,7 +33,7 @@ type WorkersHandlerArgs = [Request, Record<string, string | undefined>];
35
33
  declare const serve: <TInitialPayload = unknown, TResult = unknown>(routeFunction: RouteFunction<TInitialPayload, TResult>, options?: PublicServeOptions<TInitialPayload>) => {
36
34
  fetch: (...args: PagesHandlerArgs | WorkersHandlerArgs) => Promise<Response>;
37
35
  };
38
- declare const createWorkflow: <TInitialPayload, TResult>(routeFunction: RouteFunction<TInitialPayload, TResult>, options?: PublicServeOptions<TInitialPayload> | undefined) => InvokableWorkflow<TInitialPayload, TResult>;
36
+ declare const createWorkflow: <TInitialPayload, TResult>(...params: Parameters<typeof serve<TInitialPayload, TResult>>) => InvokableWorkflow<TInitialPayload, TResult>;
39
37
  declare const serveMany: (workflows: Parameters<typeof serveManyBase>[0]["workflows"], options?: Parameters<typeof serveManyBase>[0]["options"]) => {
40
38
  fetch: (...params: PagesHandlerArgs | WorkersHandlerArgs) => Promise<any>;
41
39
  };