@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.
- package/README.md +39 -0
- package/astro.d.mts +3 -5
- package/astro.d.ts +3 -5
- package/astro.js +126 -397
- package/astro.mjs +1 -1
- package/{chunk-CAQSUCHB.mjs → chunk-AGYYZKP7.mjs} +94 -400
- package/cloudflare.d.mts +3 -5
- package/cloudflare.d.ts +3 -5
- package/cloudflare.js +126 -397
- package/cloudflare.mjs +1 -1
- package/express.d.mts +3 -5
- package/express.d.ts +3 -5
- package/express.js +128 -398
- package/express.mjs +3 -2
- package/h3.d.mts +3 -5
- package/h3.d.ts +3 -5
- package/h3.js +136 -410
- package/h3.mjs +11 -14
- package/hono.d.mts +4 -6
- package/hono.d.ts +4 -6
- package/hono.js +126 -397
- package/hono.mjs +1 -1
- package/index.d.mts +11 -5
- package/index.d.ts +11 -5
- package/index.js +130 -433
- package/index.mjs +5 -6
- package/nextjs.d.mts +4 -6
- package/nextjs.d.ts +4 -6
- package/nextjs.js +128 -398
- package/nextjs.mjs +3 -2
- package/package.json +1 -1
- package/{serve-many-BNusWYgt.d.mts → serve-many-DEwKPF6H.d.mts} +1 -1
- package/{serve-many-CXqQP3RI.d.ts → serve-many-DVtHRxeg.d.ts} +1 -1
- package/solidjs.d.mts +1 -3
- package/solidjs.d.ts +1 -3
- package/solidjs.js +126 -397
- package/solidjs.mjs +1 -1
- package/svelte.d.mts +4 -6
- package/svelte.d.ts +4 -6
- package/svelte.js +126 -397
- package/svelte.mjs +1 -1
- package/tanstack.d.mts +3 -5
- package/tanstack.d.ts +3 -5
- package/tanstack.js +126 -397
- package/tanstack.mjs +1 -1
- package/{types-Q3dM0UlR.d.ts → types-DESkn7K9.d.mts} +15 -306
- package/{types-Q3dM0UlR.d.mts → types-DESkn7K9.d.ts} +15 -306
|
@@ -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
|
|
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
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
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 === "
|
|
3438
|
-
return new Response(detailedFinishCondition.result
|
|
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
|
|
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-
|
|
2
|
-
import { s as serveManyBase } from './serve-many-
|
|
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>(
|
|
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-
|
|
2
|
-
import { s as serveManyBase } from './serve-many-
|
|
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>(
|
|
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
|
};
|