@upstash/workflow 0.2.8-rc-invoke → 0.2.8
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/astro.d.mts +3 -8
- package/astro.d.ts +3 -8
- package/astro.js +75 -239
- package/astro.mjs +7 -33
- package/{chunk-IWAW7GIG.mjs → chunk-BPUSHNSD.mjs} +171 -195
- package/cloudflare.d.mts +4 -9
- package/cloudflare.d.ts +4 -9
- package/cloudflare.js +81 -242
- package/cloudflare.mjs +13 -36
- package/express.d.mts +3 -7
- package/express.d.ts +3 -7
- package/express.js +78 -249
- package/express.mjs +10 -41
- package/h3.d.mts +7 -9
- package/h3.d.ts +7 -9
- package/h3.js +88 -250
- package/h3.mjs +20 -44
- package/hono.d.mts +4 -10
- package/hono.d.ts +4 -10
- package/hono.js +83 -241
- package/hono.mjs +15 -35
- package/index.d.mts +267 -18
- package/index.d.ts +267 -18
- package/index.js +133 -102
- package/index.mjs +56 -1
- package/nextjs.d.mts +5 -14
- package/nextjs.d.ts +5 -14
- package/nextjs.js +62 -250
- package/nextjs.mjs +16 -64
- package/package.json +1 -1
- package/solidjs.d.mts +3 -3
- package/solidjs.d.ts +3 -3
- package/solidjs.js +56 -108
- package/solidjs.mjs +10 -7
- package/svelte.d.mts +4 -12
- package/svelte.d.ts +4 -12
- package/svelte.js +81 -241
- package/svelte.mjs +13 -35
- package/{types-C7Y7WUQd.d.mts → types-B62AnIU3.d.mts} +59 -33
- package/{types-C7Y7WUQd.d.ts → types-B62AnIU3.d.ts} +59 -33
- package/chunk-LCZMBGEM.mjs +0 -95
- package/serve-many-BlBvXfBS.d.mts +0 -10
- package/serve-many-Dw-UUnH6.d.ts +0 -10
|
@@ -41,7 +41,7 @@ var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
|
41
41
|
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
42
42
|
var NO_CONCURRENCY = 1;
|
|
43
43
|
var DEFAULT_RETRIES = 3;
|
|
44
|
-
var VERSION = "v0.2.
|
|
44
|
+
var VERSION = "v0.2.3";
|
|
45
45
|
var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
|
|
46
46
|
var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
|
|
47
47
|
var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
|
|
@@ -96,10 +96,133 @@ var StepTypes = [
|
|
|
96
96
|
"SleepUntil",
|
|
97
97
|
"Call",
|
|
98
98
|
"Wait",
|
|
99
|
-
"Notify"
|
|
100
|
-
"Invoke"
|
|
99
|
+
"Notify"
|
|
101
100
|
];
|
|
102
101
|
|
|
102
|
+
// src/agents/adapters.ts
|
|
103
|
+
import { createOpenAI } from "@ai-sdk/openai";
|
|
104
|
+
import { tool } from "ai";
|
|
105
|
+
|
|
106
|
+
// src/agents/constants.ts
|
|
107
|
+
var AGENT_NAME_HEADER = "upstash-agent-name";
|
|
108
|
+
var MANAGER_AGENT_PROMPT = `You are an agent orchestrating other AI Agents.
|
|
109
|
+
|
|
110
|
+
These other agents have tools available to them.
|
|
111
|
+
|
|
112
|
+
Given a prompt, utilize these agents to address requests.
|
|
113
|
+
|
|
114
|
+
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.
|
|
115
|
+
|
|
116
|
+
Avoid calling the same agent twice in one turn. Instead, prefer to call it once but provide everything
|
|
117
|
+
you need from that agent.
|
|
118
|
+
`;
|
|
119
|
+
|
|
120
|
+
// src/agents/adapters.ts
|
|
121
|
+
var createWorkflowOpenAI = (context, config) => {
|
|
122
|
+
const { baseURL, apiKey } = config ?? {};
|
|
123
|
+
return createOpenAI({
|
|
124
|
+
baseURL,
|
|
125
|
+
apiKey,
|
|
126
|
+
compatibility: "strict",
|
|
127
|
+
fetch: async (input, init) => {
|
|
128
|
+
try {
|
|
129
|
+
const headers = init?.headers ? Object.fromEntries(new Headers(init.headers).entries()) : {};
|
|
130
|
+
const body = init?.body ? JSON.parse(init.body) : void 0;
|
|
131
|
+
const agentName = headers[AGENT_NAME_HEADER];
|
|
132
|
+
const stepName = agentName ? `Call Agent ${agentName}` : "Call Agent";
|
|
133
|
+
const responseInfo = await context.call(stepName, {
|
|
134
|
+
url: input.toString(),
|
|
135
|
+
method: init?.method,
|
|
136
|
+
headers,
|
|
137
|
+
body
|
|
138
|
+
});
|
|
139
|
+
const responseHeaders = new Headers(
|
|
140
|
+
Object.entries(responseInfo.header).reduce(
|
|
141
|
+
(acc, [key, values]) => {
|
|
142
|
+
acc[key] = values.join(", ");
|
|
143
|
+
return acc;
|
|
144
|
+
},
|
|
145
|
+
{}
|
|
146
|
+
)
|
|
147
|
+
);
|
|
148
|
+
return new Response(JSON.stringify(responseInfo.body), {
|
|
149
|
+
status: responseInfo.status,
|
|
150
|
+
headers: responseHeaders
|
|
151
|
+
});
|
|
152
|
+
} catch (error) {
|
|
153
|
+
if (error instanceof Error && error.name === "WorkflowAbort") {
|
|
154
|
+
throw error;
|
|
155
|
+
} else {
|
|
156
|
+
console.error("Error in fetch implementation:", error);
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
};
|
|
163
|
+
var wrapTools = ({
|
|
164
|
+
context,
|
|
165
|
+
tools
|
|
166
|
+
}) => {
|
|
167
|
+
return Object.fromEntries(
|
|
168
|
+
Object.entries(tools).map((toolInfo) => {
|
|
169
|
+
const [toolName, tool3] = toolInfo;
|
|
170
|
+
const executeAsStep = "executeAsStep" in tool3 ? tool3.executeAsStep : true;
|
|
171
|
+
const aiSDKTool = convertToAISDKTool(tool3);
|
|
172
|
+
const execute = aiSDKTool.execute;
|
|
173
|
+
if (execute && executeAsStep) {
|
|
174
|
+
const wrappedExecute = (...params) => {
|
|
175
|
+
return context.run(`Run tool ${toolName}`, () => execute(...params));
|
|
176
|
+
};
|
|
177
|
+
aiSDKTool.execute = wrappedExecute;
|
|
178
|
+
}
|
|
179
|
+
return [toolName, aiSDKTool];
|
|
180
|
+
})
|
|
181
|
+
);
|
|
182
|
+
};
|
|
183
|
+
var convertToAISDKTool = (tool3) => {
|
|
184
|
+
const isLangchainTool = "invoke" in tool3;
|
|
185
|
+
return isLangchainTool ? convertLangchainTool(tool3) : tool3;
|
|
186
|
+
};
|
|
187
|
+
var convertLangchainTool = (langchainTool) => {
|
|
188
|
+
return tool({
|
|
189
|
+
description: langchainTool.description,
|
|
190
|
+
parameters: langchainTool.schema,
|
|
191
|
+
execute: async (...param) => langchainTool.invoke(...param)
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
var WorkflowTool = class {
|
|
195
|
+
/**
|
|
196
|
+
* description of the tool
|
|
197
|
+
*/
|
|
198
|
+
description;
|
|
199
|
+
/**
|
|
200
|
+
* schema of the tool
|
|
201
|
+
*/
|
|
202
|
+
schema;
|
|
203
|
+
/**
|
|
204
|
+
* function to invoke the tool
|
|
205
|
+
*/
|
|
206
|
+
invoke;
|
|
207
|
+
/**
|
|
208
|
+
* whether the invoke method of the tool is to be wrapped with `context.run`
|
|
209
|
+
*/
|
|
210
|
+
executeAsStep;
|
|
211
|
+
/**
|
|
212
|
+
*
|
|
213
|
+
* @param description description of the tool
|
|
214
|
+
* @param schema schema of the tool
|
|
215
|
+
* @param invoke function to invoke the tool
|
|
216
|
+
* @param executeAsStep whether the invoke method of the tool is to be wrapped with `context.run`
|
|
217
|
+
*/
|
|
218
|
+
constructor(params) {
|
|
219
|
+
this.description = params.description;
|
|
220
|
+
this.schema = params.schema;
|
|
221
|
+
this.invoke = params.invoke;
|
|
222
|
+
this.executeAsStep = params.executeAsStep ?? true;
|
|
223
|
+
}
|
|
224
|
+
};
|
|
225
|
+
|
|
103
226
|
// src/client/utils.ts
|
|
104
227
|
import { QstashError as QstashError2 } from "@upstash/qstash";
|
|
105
228
|
var makeNotifyRequest = async (requester, eventId, eventData) => {
|
|
@@ -160,31 +283,6 @@ var getSteps = async (requester, workflowRunId, messageId, debug) => {
|
|
|
160
283
|
}
|
|
161
284
|
};
|
|
162
285
|
|
|
163
|
-
// src/utils.ts
|
|
164
|
-
var NANOID_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
|
|
165
|
-
var NANOID_LENGTH = 21;
|
|
166
|
-
function getRandomInt() {
|
|
167
|
-
return Math.floor(Math.random() * NANOID_CHARS.length);
|
|
168
|
-
}
|
|
169
|
-
function nanoid() {
|
|
170
|
-
return Array.from({ length: NANOID_LENGTH }).map(() => NANOID_CHARS[getRandomInt()]).join("");
|
|
171
|
-
}
|
|
172
|
-
function getWorkflowRunId(id) {
|
|
173
|
-
return `wfr_${id ?? nanoid()}`;
|
|
174
|
-
}
|
|
175
|
-
function decodeBase64(base64) {
|
|
176
|
-
try {
|
|
177
|
-
const binString = atob(base64);
|
|
178
|
-
const intArray = Uint8Array.from(binString, (m) => m.codePointAt(0));
|
|
179
|
-
return new TextDecoder().decode(intArray);
|
|
180
|
-
} catch (error) {
|
|
181
|
-
console.warn(
|
|
182
|
-
`Upstash Qstash: Failed while decoding base64 "${base64}". Decoding with atob and returning it instead. ${error}`
|
|
183
|
-
);
|
|
184
|
-
return atob(base64);
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
286
|
// src/context/steps.ts
|
|
189
287
|
var BaseLazyStep = class {
|
|
190
288
|
stepName;
|
|
@@ -365,41 +463,6 @@ var LazyNotifyStep = class extends LazyFunctionStep {
|
|
|
365
463
|
});
|
|
366
464
|
}
|
|
367
465
|
};
|
|
368
|
-
var LazyInvokeStep = class extends BaseLazyStep {
|
|
369
|
-
stepType = "Invoke";
|
|
370
|
-
params;
|
|
371
|
-
constructor(stepName, { workflow, body, headers = {}, workflowRunId, retries }) {
|
|
372
|
-
super(stepName);
|
|
373
|
-
this.params = {
|
|
374
|
-
workflow,
|
|
375
|
-
body,
|
|
376
|
-
headers,
|
|
377
|
-
workflowRunId: getWorkflowRunId(workflowRunId),
|
|
378
|
-
retries
|
|
379
|
-
};
|
|
380
|
-
}
|
|
381
|
-
getPlanStep(concurrent, targetStep) {
|
|
382
|
-
return {
|
|
383
|
-
stepId: 0,
|
|
384
|
-
stepName: this.stepName,
|
|
385
|
-
stepType: this.stepType,
|
|
386
|
-
concurrent,
|
|
387
|
-
targetStep
|
|
388
|
-
};
|
|
389
|
-
}
|
|
390
|
-
/**
|
|
391
|
-
* won't be used as it's the server who will add the result step
|
|
392
|
-
* in Invoke step.
|
|
393
|
-
*/
|
|
394
|
-
getResultStep(concurrent, stepId) {
|
|
395
|
-
return Promise.resolve({
|
|
396
|
-
stepId,
|
|
397
|
-
stepName: this.stepName,
|
|
398
|
-
stepType: this.stepType,
|
|
399
|
-
concurrent
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
};
|
|
403
466
|
|
|
404
467
|
// node_modules/neverthrow/dist/index.es.js
|
|
405
468
|
var defaultErrorConfig = {
|
|
@@ -877,8 +940,8 @@ var triggerRouteFunction = async ({
|
|
|
877
940
|
debug
|
|
878
941
|
}) => {
|
|
879
942
|
try {
|
|
880
|
-
|
|
881
|
-
await onCleanup(
|
|
943
|
+
await onStep();
|
|
944
|
+
await onCleanup();
|
|
882
945
|
return ok("workflow-finished");
|
|
883
946
|
} catch (error) {
|
|
884
947
|
const error_ = error;
|
|
@@ -899,15 +962,14 @@ var triggerRouteFunction = async ({
|
|
|
899
962
|
}
|
|
900
963
|
}
|
|
901
964
|
};
|
|
902
|
-
var triggerWorkflowDelete = async (workflowContext,
|
|
965
|
+
var triggerWorkflowDelete = async (workflowContext, debug, cancel = false) => {
|
|
903
966
|
await debug?.log("SUBMIT", "SUBMIT_CLEANUP", {
|
|
904
967
|
deletedWorkflowRunId: workflowContext.workflowRunId
|
|
905
968
|
});
|
|
906
969
|
await workflowContext.qstashClient.http.request({
|
|
907
970
|
path: ["v2", "workflows", "runs", `${workflowContext.workflowRunId}?cancel=${cancel}`],
|
|
908
971
|
method: "DELETE",
|
|
909
|
-
parseResponseAsJson: false
|
|
910
|
-
body: JSON.stringify(result)
|
|
972
|
+
parseResponseAsJson: false
|
|
911
973
|
});
|
|
912
974
|
await debug?.log(
|
|
913
975
|
"SUBMIT",
|
|
@@ -1062,14 +1124,11 @@ var getHeaders = ({
|
|
|
1062
1124
|
callTimeout,
|
|
1063
1125
|
telemetry
|
|
1064
1126
|
}) => {
|
|
1065
|
-
const contentType = (userHeaders ? userHeaders.get("Content-Type") : void 0) ?? DEFAULT_CONTENT_TYPE;
|
|
1066
1127
|
const baseHeaders = {
|
|
1067
1128
|
[WORKFLOW_INIT_HEADER]: initHeaderValue,
|
|
1068
1129
|
[WORKFLOW_ID_HEADER]: workflowRunId,
|
|
1069
1130
|
[WORKFLOW_URL_HEADER]: workflowUrl,
|
|
1070
1131
|
[WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody",
|
|
1071
|
-
[WORKFLOW_PROTOCOL_VERSION_HEADER]: WORKFLOW_PROTOCOL_VERSION,
|
|
1072
|
-
"content-type": contentType,
|
|
1073
1132
|
...telemetry ? getTelemetryHeaders(telemetry) : {}
|
|
1074
1133
|
};
|
|
1075
1134
|
if (!step?.callUrl) {
|
|
@@ -1080,13 +1139,18 @@ var getHeaders = ({
|
|
|
1080
1139
|
}
|
|
1081
1140
|
if (failureUrl) {
|
|
1082
1141
|
baseHeaders[`Upstash-Failure-Callback-Forward-${WORKFLOW_FAILURE_HEADER}`] = "true";
|
|
1142
|
+
baseHeaders[`Upstash-Failure-Callback-Forward-Upstash-Workflow-Failure-Callback`] = "true";
|
|
1143
|
+
baseHeaders["Upstash-Failure-Callback-Workflow-Runid"] = workflowRunId;
|
|
1144
|
+
baseHeaders["Upstash-Failure-Callback-Workflow-Init"] = "false";
|
|
1145
|
+
baseHeaders["Upstash-Failure-Callback-Workflow-Url"] = workflowUrl;
|
|
1146
|
+
baseHeaders["Upstash-Failure-Callback-Workflow-Calltype"] = "failureCall";
|
|
1147
|
+
if (retries !== void 0) {
|
|
1148
|
+
baseHeaders["Upstash-Failure-Callback-Retries"] = retries.toString();
|
|
1149
|
+
}
|
|
1083
1150
|
if (!step?.callUrl) {
|
|
1084
1151
|
baseHeaders["Upstash-Failure-Callback"] = failureUrl;
|
|
1085
1152
|
}
|
|
1086
1153
|
}
|
|
1087
|
-
if (step?.stepType === "Invoke") {
|
|
1088
|
-
baseHeaders["upstash-workflow-invoke"] = "true";
|
|
1089
|
-
}
|
|
1090
1154
|
if (step?.callUrl) {
|
|
1091
1155
|
baseHeaders["Upstash-Retries"] = callRetries?.toString() ?? "0";
|
|
1092
1156
|
baseHeaders[WORKFLOW_FEATURE_HEADER] = "WF_NoDelete,InitialBody";
|
|
@@ -1108,6 +1172,7 @@ var getHeaders = ({
|
|
|
1108
1172
|
baseHeaders[`Upstash-Failure-Callback-Forward-${header}`] = userHeaders.get(header);
|
|
1109
1173
|
}
|
|
1110
1174
|
}
|
|
1175
|
+
const contentType = (userHeaders ? userHeaders.get("Content-Type") : void 0) ?? DEFAULT_CONTENT_TYPE;
|
|
1111
1176
|
if (step?.callHeaders) {
|
|
1112
1177
|
const forwardedHeaders = Object.fromEntries(
|
|
1113
1178
|
Object.entries(step.callHeaders).map(([header, value]) => [
|
|
@@ -1157,7 +1222,8 @@ var getHeaders = ({
|
|
|
1157
1222
|
"Upstash-Workflow-Runid": [workflowRunId],
|
|
1158
1223
|
[WORKFLOW_INIT_HEADER]: ["false"],
|
|
1159
1224
|
[WORKFLOW_URL_HEADER]: [workflowUrl],
|
|
1160
|
-
"Upstash-Workflow-CallType": ["step"]
|
|
1225
|
+
"Upstash-Workflow-CallType": ["step"],
|
|
1226
|
+
"Content-Type": [contentType]
|
|
1161
1227
|
}
|
|
1162
1228
|
};
|
|
1163
1229
|
}
|
|
@@ -1452,23 +1518,7 @@ var AutoExecutor = class _AutoExecutor {
|
|
|
1452
1518
|
method: "POST",
|
|
1453
1519
|
parseResponseAsJson: false
|
|
1454
1520
|
});
|
|
1455
|
-
throw new WorkflowAbort(
|
|
1456
|
-
}
|
|
1457
|
-
if (steps.length === 1 && lazySteps[0] instanceof LazyInvokeStep) {
|
|
1458
|
-
const invokeStep = steps[0];
|
|
1459
|
-
const lazyInvokeStep = lazySteps[0];
|
|
1460
|
-
await lazyInvokeStep.params.workflow.callback(
|
|
1461
|
-
{
|
|
1462
|
-
body: lazyInvokeStep.params.body,
|
|
1463
|
-
headers: lazyInvokeStep.params.headers,
|
|
1464
|
-
workflowRunId: lazyInvokeStep.params.workflowRunId,
|
|
1465
|
-
workflow: lazyInvokeStep.params.workflow,
|
|
1466
|
-
retries: lazyInvokeStep.params.retries
|
|
1467
|
-
},
|
|
1468
|
-
invokeStep,
|
|
1469
|
-
this.context
|
|
1470
|
-
);
|
|
1471
|
-
throw new WorkflowAbort(invokeStep.stepName, invokeStep);
|
|
1521
|
+
throw new WorkflowAbort(steps[0].stepName, steps[0]);
|
|
1472
1522
|
}
|
|
1473
1523
|
const result = await this.context.qstashClient.batchJSON(
|
|
1474
1524
|
steps.map((singleStep, index) => {
|
|
@@ -1719,98 +1769,6 @@ var WorkflowApi = class extends BaseWorkflowApi {
|
|
|
1719
1769
|
}
|
|
1720
1770
|
};
|
|
1721
1771
|
|
|
1722
|
-
// src/agents/adapters.ts
|
|
1723
|
-
import { createOpenAI } from "@ai-sdk/openai";
|
|
1724
|
-
import { tool } from "ai";
|
|
1725
|
-
|
|
1726
|
-
// src/agents/constants.ts
|
|
1727
|
-
var AGENT_NAME_HEADER = "upstash-agent-name";
|
|
1728
|
-
var MANAGER_AGENT_PROMPT = `You are an agent orchestrating other AI Agents.
|
|
1729
|
-
|
|
1730
|
-
These other agents have tools available to them.
|
|
1731
|
-
|
|
1732
|
-
Given a prompt, utilize these agents to address requests.
|
|
1733
|
-
|
|
1734
|
-
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.
|
|
1735
|
-
|
|
1736
|
-
Avoid calling the same agent twice in one turn. Instead, prefer to call it once but provide everything
|
|
1737
|
-
you need from that agent.
|
|
1738
|
-
`;
|
|
1739
|
-
|
|
1740
|
-
// src/agents/adapters.ts
|
|
1741
|
-
var createWorkflowOpenAI = (context, config) => {
|
|
1742
|
-
const { baseURL, apiKey } = config ?? {};
|
|
1743
|
-
return createOpenAI({
|
|
1744
|
-
baseURL,
|
|
1745
|
-
apiKey,
|
|
1746
|
-
compatibility: "strict",
|
|
1747
|
-
fetch: async (input, init) => {
|
|
1748
|
-
try {
|
|
1749
|
-
const headers = init?.headers ? Object.fromEntries(new Headers(init.headers).entries()) : {};
|
|
1750
|
-
const body = init?.body ? JSON.parse(init.body) : void 0;
|
|
1751
|
-
const agentName = headers[AGENT_NAME_HEADER];
|
|
1752
|
-
const stepName = agentName ? `Call Agent ${agentName}` : "Call Agent";
|
|
1753
|
-
const responseInfo = await context.call(stepName, {
|
|
1754
|
-
url: input.toString(),
|
|
1755
|
-
method: init?.method,
|
|
1756
|
-
headers,
|
|
1757
|
-
body
|
|
1758
|
-
});
|
|
1759
|
-
const responseHeaders = new Headers(
|
|
1760
|
-
Object.entries(responseInfo.header).reduce(
|
|
1761
|
-
(acc, [key, values]) => {
|
|
1762
|
-
acc[key] = values.join(", ");
|
|
1763
|
-
return acc;
|
|
1764
|
-
},
|
|
1765
|
-
{}
|
|
1766
|
-
)
|
|
1767
|
-
);
|
|
1768
|
-
return new Response(JSON.stringify(responseInfo.body), {
|
|
1769
|
-
status: responseInfo.status,
|
|
1770
|
-
headers: responseHeaders
|
|
1771
|
-
});
|
|
1772
|
-
} catch (error) {
|
|
1773
|
-
if (error instanceof Error && error.name === "WorkflowAbort") {
|
|
1774
|
-
throw error;
|
|
1775
|
-
} else {
|
|
1776
|
-
console.error("Error in fetch implementation:", error);
|
|
1777
|
-
throw error;
|
|
1778
|
-
}
|
|
1779
|
-
}
|
|
1780
|
-
}
|
|
1781
|
-
});
|
|
1782
|
-
};
|
|
1783
|
-
var wrapTools = ({
|
|
1784
|
-
context,
|
|
1785
|
-
tools
|
|
1786
|
-
}) => {
|
|
1787
|
-
return Object.fromEntries(
|
|
1788
|
-
Object.entries(tools).map((toolInfo) => {
|
|
1789
|
-
const [toolName, tool3] = toolInfo;
|
|
1790
|
-
const aiSDKTool = convertToAISDKTool(tool3);
|
|
1791
|
-
const execute = aiSDKTool.execute;
|
|
1792
|
-
if (execute) {
|
|
1793
|
-
const wrappedExecute = (...params) => {
|
|
1794
|
-
return context.run(`Run tool ${toolName}`, () => execute(...params));
|
|
1795
|
-
};
|
|
1796
|
-
aiSDKTool.execute = wrappedExecute;
|
|
1797
|
-
}
|
|
1798
|
-
return [toolName, aiSDKTool];
|
|
1799
|
-
})
|
|
1800
|
-
);
|
|
1801
|
-
};
|
|
1802
|
-
var convertToAISDKTool = (tool3) => {
|
|
1803
|
-
const isLangchainTool = "invoke" in tool3;
|
|
1804
|
-
return isLangchainTool ? convertLangchainTool(tool3) : tool3;
|
|
1805
|
-
};
|
|
1806
|
-
var convertLangchainTool = (langchainTool) => {
|
|
1807
|
-
return tool({
|
|
1808
|
-
description: langchainTool.description,
|
|
1809
|
-
parameters: langchainTool.schema,
|
|
1810
|
-
execute: async (...param) => langchainTool.invoke(...param)
|
|
1811
|
-
});
|
|
1812
|
-
};
|
|
1813
|
-
|
|
1814
1772
|
// src/agents/agent.ts
|
|
1815
1773
|
import { z } from "zod";
|
|
1816
1774
|
import { generateText, tool as tool2, ToolExecutionError } from "ai";
|
|
@@ -2385,13 +2343,6 @@ var WorkflowContext = class {
|
|
|
2385
2343
|
return result;
|
|
2386
2344
|
}
|
|
2387
2345
|
}
|
|
2388
|
-
async invoke(stepName, settings) {
|
|
2389
|
-
const result = await this.addStep(new LazyInvokeStep(stepName, settings));
|
|
2390
|
-
return {
|
|
2391
|
-
...result,
|
|
2392
|
-
body: result.body ? JSON.parse(result.body) : void 0
|
|
2393
|
-
};
|
|
2394
|
-
}
|
|
2395
2346
|
/**
|
|
2396
2347
|
* Cancel the current workflow run
|
|
2397
2348
|
*
|
|
@@ -2469,6 +2420,31 @@ var WorkflowLogger = class _WorkflowLogger {
|
|
|
2469
2420
|
}
|
|
2470
2421
|
};
|
|
2471
2422
|
|
|
2423
|
+
// src/utils.ts
|
|
2424
|
+
var NANOID_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
|
|
2425
|
+
var NANOID_LENGTH = 21;
|
|
2426
|
+
function getRandomInt() {
|
|
2427
|
+
return Math.floor(Math.random() * NANOID_CHARS.length);
|
|
2428
|
+
}
|
|
2429
|
+
function nanoid() {
|
|
2430
|
+
return Array.from({ length: NANOID_LENGTH }).map(() => NANOID_CHARS[getRandomInt()]).join("");
|
|
2431
|
+
}
|
|
2432
|
+
function getWorkflowRunId(id) {
|
|
2433
|
+
return `wfr_${id ?? nanoid()}`;
|
|
2434
|
+
}
|
|
2435
|
+
function decodeBase64(base64) {
|
|
2436
|
+
try {
|
|
2437
|
+
const binString = atob(base64);
|
|
2438
|
+
const intArray = Uint8Array.from(binString, (m) => m.codePointAt(0));
|
|
2439
|
+
return new TextDecoder().decode(intArray);
|
|
2440
|
+
} catch (error) {
|
|
2441
|
+
console.warn(
|
|
2442
|
+
`Upstash Qstash: Failed while decoding base64 "${base64}". Decoding with atob and returning it instead. ${error}`
|
|
2443
|
+
);
|
|
2444
|
+
return atob(base64);
|
|
2445
|
+
}
|
|
2446
|
+
}
|
|
2447
|
+
|
|
2472
2448
|
// src/serve/authorization.ts
|
|
2473
2449
|
import { Client as Client2 } from "@upstash/qstash";
|
|
2474
2450
|
var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
|
|
@@ -2914,8 +2890,8 @@ var serveBase = (routeFunction, telemetry, options) => {
|
|
|
2914
2890
|
} else if (callReturnCheck.value === "continue-workflow") {
|
|
2915
2891
|
const result = isFirstInvocation ? await triggerFirstInvocation({ workflowContext, useJSONContent, telemetry, debug }) : await triggerRouteFunction({
|
|
2916
2892
|
onStep: async () => routeFunction(workflowContext),
|
|
2917
|
-
onCleanup: async (
|
|
2918
|
-
await triggerWorkflowDelete(workflowContext,
|
|
2893
|
+
onCleanup: async () => {
|
|
2894
|
+
await triggerWorkflowDelete(workflowContext, debug);
|
|
2919
2895
|
},
|
|
2920
2896
|
onCancel: async () => {
|
|
2921
2897
|
await makeCancelRequest(workflowContext.qstashClient.http, workflowRunId);
|
|
@@ -2966,12 +2942,12 @@ export {
|
|
|
2966
2942
|
SDK_TELEMETRY,
|
|
2967
2943
|
WorkflowError,
|
|
2968
2944
|
WorkflowAbort,
|
|
2969
|
-
getWorkflowRunId,
|
|
2970
2945
|
StepTypes,
|
|
2971
2946
|
triggerFirstInvocation,
|
|
2972
|
-
|
|
2947
|
+
WorkflowTool,
|
|
2973
2948
|
WorkflowContext,
|
|
2974
2949
|
WorkflowLogger,
|
|
2950
|
+
getWorkflowRunId,
|
|
2975
2951
|
serveBase,
|
|
2976
2952
|
serve
|
|
2977
2953
|
};
|
package/cloudflare.d.mts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { R as RouteFunction,
|
|
2
|
-
import { s as serveManyBase } from './serve-many-BlBvXfBS.mjs';
|
|
1
|
+
import { R as RouteFunction, k as PublicServeOptions } from './types-B62AnIU3.mjs';
|
|
3
2
|
import '@upstash/qstash';
|
|
4
3
|
import 'zod';
|
|
5
4
|
import 'ai';
|
|
@@ -24,7 +23,7 @@ type PagesHandlerArgs = [{
|
|
|
24
23
|
*/
|
|
25
24
|
type WorkersHandlerArgs = [Request, Record<string, string | undefined>];
|
|
26
25
|
/**
|
|
27
|
-
* Serve method to serve a Upstash Workflow in a
|
|
26
|
+
* Serve method to serve a Upstash Workflow in a Nextjs project
|
|
28
27
|
*
|
|
29
28
|
* See for options https://upstash.com/docs/qstash/workflows/basics/serve
|
|
30
29
|
*
|
|
@@ -32,12 +31,8 @@ type WorkersHandlerArgs = [Request, Record<string, string | undefined>];
|
|
|
32
31
|
* @param options workflow options
|
|
33
32
|
* @returns
|
|
34
33
|
*/
|
|
35
|
-
declare const serve: <TInitialPayload = unknown
|
|
34
|
+
declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: PublicServeOptions<TInitialPayload>) => {
|
|
36
35
|
fetch: (...args: PagesHandlerArgs | WorkersHandlerArgs) => Promise<Response>;
|
|
37
36
|
};
|
|
38
|
-
declare const createWorkflow: <TInitialPayload, TResult>(routeFunction: RouteFunction<TInitialPayload, TResult>, options?: PublicServeOptions<TInitialPayload> | undefined) => InvokableWorkflow<TInitialPayload, TResult, Parameters<ReturnType<typeof serve<TInitialPayload, TResult>>["fetch"]>>;
|
|
39
|
-
declare const serveMany: (workflows: Parameters<typeof serveManyBase>[0]["workflows"]) => {
|
|
40
|
-
fetch: (...params: PagesHandlerArgs | WorkersHandlerArgs) => Promise<any>;
|
|
41
|
-
};
|
|
42
37
|
|
|
43
|
-
export { type PagesHandlerArgs, type WorkersHandlerArgs, type WorkflowBindings,
|
|
38
|
+
export { type PagesHandlerArgs, type WorkersHandlerArgs, type WorkflowBindings, serve };
|
package/cloudflare.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { R as RouteFunction,
|
|
2
|
-
import { s as serveManyBase } from './serve-many-Dw-UUnH6.js';
|
|
1
|
+
import { R as RouteFunction, k as PublicServeOptions } from './types-B62AnIU3.js';
|
|
3
2
|
import '@upstash/qstash';
|
|
4
3
|
import 'zod';
|
|
5
4
|
import 'ai';
|
|
@@ -24,7 +23,7 @@ type PagesHandlerArgs = [{
|
|
|
24
23
|
*/
|
|
25
24
|
type WorkersHandlerArgs = [Request, Record<string, string | undefined>];
|
|
26
25
|
/**
|
|
27
|
-
* Serve method to serve a Upstash Workflow in a
|
|
26
|
+
* Serve method to serve a Upstash Workflow in a Nextjs project
|
|
28
27
|
*
|
|
29
28
|
* See for options https://upstash.com/docs/qstash/workflows/basics/serve
|
|
30
29
|
*
|
|
@@ -32,12 +31,8 @@ type WorkersHandlerArgs = [Request, Record<string, string | undefined>];
|
|
|
32
31
|
* @param options workflow options
|
|
33
32
|
* @returns
|
|
34
33
|
*/
|
|
35
|
-
declare const serve: <TInitialPayload = unknown
|
|
34
|
+
declare const serve: <TInitialPayload = unknown>(routeFunction: RouteFunction<TInitialPayload>, options?: PublicServeOptions<TInitialPayload>) => {
|
|
36
35
|
fetch: (...args: PagesHandlerArgs | WorkersHandlerArgs) => Promise<Response>;
|
|
37
36
|
};
|
|
38
|
-
declare const createWorkflow: <TInitialPayload, TResult>(routeFunction: RouteFunction<TInitialPayload, TResult>, options?: PublicServeOptions<TInitialPayload> | undefined) => InvokableWorkflow<TInitialPayload, TResult, Parameters<ReturnType<typeof serve<TInitialPayload, TResult>>["fetch"]>>;
|
|
39
|
-
declare const serveMany: (workflows: Parameters<typeof serveManyBase>[0]["workflows"]) => {
|
|
40
|
-
fetch: (...params: PagesHandlerArgs | WorkersHandlerArgs) => Promise<any>;
|
|
41
|
-
};
|
|
42
37
|
|
|
43
|
-
export { type PagesHandlerArgs, type WorkersHandlerArgs, type WorkflowBindings,
|
|
38
|
+
export { type PagesHandlerArgs, type WorkersHandlerArgs, type WorkflowBindings, serve };
|