@upstash/workflow 0.2.3 → 0.2.5-agents
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/agents.d.mts +5 -0
- package/agents.d.ts +5 -0
- package/agents.js +245 -0
- package/agents.mjs +12 -0
- package/astro.d.mts +4 -1
- package/astro.d.ts +4 -1
- package/astro.js +362 -78
- package/astro.mjs +8 -1
- package/chunk-PU5J4TNC.mjs +251 -0
- package/{chunk-QBJ3LQIO.mjs → chunk-RFX5YRRT.mjs} +148 -103
- package/cloudflare.d.mts +4 -1
- package/cloudflare.d.ts +4 -1
- package/cloudflare.js +368 -82
- package/cloudflare.mjs +14 -5
- package/express.d.mts +4 -1
- package/express.d.ts +4 -1
- package/express.js +363 -79
- package/express.mjs +12 -4
- package/h3.d.mts +4 -1
- package/h3.d.ts +4 -1
- package/h3.js +366 -79
- package/h3.mjs +12 -2
- package/hono.d.mts +4 -1
- package/hono.d.ts +4 -1
- package/hono.js +370 -84
- package/hono.mjs +16 -7
- package/index.d.mts +5 -2
- package/index.d.ts +5 -2
- package/index.js +376 -83
- package/index.mjs +11 -4
- package/nextjs.d.mts +4 -1
- package/nextjs.d.ts +4 -1
- package/nextjs.js +371 -79
- package/nextjs.mjs +17 -2
- package/package.json +1 -1
- package/solidjs.d.mts +4 -1
- package/solidjs.d.ts +4 -1
- package/solidjs.js +366 -79
- package/solidjs.mjs +12 -2
- package/svelte.d.mts +4 -1
- package/svelte.d.ts +4 -1
- package/svelte.js +368 -82
- package/svelte.mjs +14 -5
- package/{types-R9q4MUwl.d.mts → types-BEyIoCRe.d.mts} +164 -4
- package/{types-R9q4MUwl.d.ts → types-BEyIoCRe.d.ts} +164 -4
package/solidjs.js
CHANGED
|
@@ -77,6 +77,23 @@ var getSteps = async (requester, workflowRunId, messageId, debug) => {
|
|
|
77
77
|
}
|
|
78
78
|
};
|
|
79
79
|
|
|
80
|
+
// src/constants.ts
|
|
81
|
+
var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
|
|
82
|
+
var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
|
|
83
|
+
var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
|
|
84
|
+
var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
|
|
85
|
+
var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
|
|
86
|
+
var WORKFLOW_PROTOCOL_VERSION = "1";
|
|
87
|
+
var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
88
|
+
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
89
|
+
var NO_CONCURRENCY = 1;
|
|
90
|
+
var DEFAULT_RETRIES = 3;
|
|
91
|
+
var VERSION = "v0.2.3";
|
|
92
|
+
var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
|
|
93
|
+
var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
|
|
94
|
+
var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
|
|
95
|
+
var TELEMETRY_HEADER_RUNTIME = "Upstash-Telemetry-Runtime";
|
|
96
|
+
|
|
80
97
|
// src/error.ts
|
|
81
98
|
var import_qstash2 = require("@upstash/qstash");
|
|
82
99
|
var WorkflowError = class extends import_qstash2.QstashError {
|
|
@@ -714,18 +731,6 @@ var Err = class {
|
|
|
714
731
|
};
|
|
715
732
|
var fromThrowable = Result.fromThrowable;
|
|
716
733
|
|
|
717
|
-
// src/constants.ts
|
|
718
|
-
var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
|
|
719
|
-
var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
|
|
720
|
-
var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
|
|
721
|
-
var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
|
|
722
|
-
var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
|
|
723
|
-
var WORKFLOW_PROTOCOL_VERSION = "1";
|
|
724
|
-
var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
725
|
-
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
726
|
-
var NO_CONCURRENCY = 1;
|
|
727
|
-
var DEFAULT_RETRIES = 3;
|
|
728
|
-
|
|
729
734
|
// src/types.ts
|
|
730
735
|
var StepTypes = [
|
|
731
736
|
"Initial",
|
|
@@ -739,16 +744,21 @@ var StepTypes = [
|
|
|
739
744
|
|
|
740
745
|
// src/workflow-requests.ts
|
|
741
746
|
var import_qstash3 = require("@upstash/qstash");
|
|
742
|
-
var triggerFirstInvocation = async (
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
747
|
+
var triggerFirstInvocation = async ({
|
|
748
|
+
workflowContext,
|
|
749
|
+
useJSONContent,
|
|
750
|
+
telemetry,
|
|
751
|
+
debug
|
|
752
|
+
}) => {
|
|
753
|
+
const { headers } = getHeaders({
|
|
754
|
+
initHeaderValue: "true",
|
|
755
|
+
workflowRunId: workflowContext.workflowRunId,
|
|
756
|
+
workflowUrl: workflowContext.url,
|
|
757
|
+
userHeaders: workflowContext.headers,
|
|
758
|
+
failureUrl: workflowContext.failureUrl,
|
|
759
|
+
retries: workflowContext.retries,
|
|
760
|
+
telemetry
|
|
761
|
+
});
|
|
752
762
|
if (useJSONContent) {
|
|
753
763
|
headers["content-type"] = "application/json";
|
|
754
764
|
}
|
|
@@ -854,7 +864,16 @@ var recreateUserHeaders = (headers) => {
|
|
|
854
864
|
}
|
|
855
865
|
return filteredHeaders;
|
|
856
866
|
};
|
|
857
|
-
var handleThirdPartyCallResult = async (
|
|
867
|
+
var handleThirdPartyCallResult = async ({
|
|
868
|
+
request,
|
|
869
|
+
requestPayload,
|
|
870
|
+
client,
|
|
871
|
+
workflowUrl,
|
|
872
|
+
failureUrl,
|
|
873
|
+
retries,
|
|
874
|
+
telemetry,
|
|
875
|
+
debug
|
|
876
|
+
}) => {
|
|
858
877
|
try {
|
|
859
878
|
if (request.headers.get("Upstash-Workflow-Callback")) {
|
|
860
879
|
let callbackPayload;
|
|
@@ -913,15 +932,15 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
913
932
|
);
|
|
914
933
|
}
|
|
915
934
|
const userHeaders = recreateUserHeaders(request.headers);
|
|
916
|
-
const { headers: requestHeaders } = getHeaders(
|
|
917
|
-
"false",
|
|
935
|
+
const { headers: requestHeaders } = getHeaders({
|
|
936
|
+
initHeaderValue: "false",
|
|
918
937
|
workflowRunId,
|
|
919
938
|
workflowUrl,
|
|
920
939
|
userHeaders,
|
|
921
|
-
void 0,
|
|
922
940
|
failureUrl,
|
|
923
|
-
retries
|
|
924
|
-
|
|
941
|
+
retries,
|
|
942
|
+
telemetry
|
|
943
|
+
});
|
|
925
944
|
const callResponse = {
|
|
926
945
|
status: callbackMessage.status,
|
|
927
946
|
body: atob(callbackMessage.body ?? ""),
|
|
@@ -959,12 +978,31 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
959
978
|
);
|
|
960
979
|
}
|
|
961
980
|
};
|
|
962
|
-
var
|
|
981
|
+
var getTelemetryHeaders = (telemetry) => {
|
|
982
|
+
return {
|
|
983
|
+
[TELEMETRY_HEADER_SDK]: telemetry.sdk,
|
|
984
|
+
[TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework,
|
|
985
|
+
[TELEMETRY_HEADER_RUNTIME]: telemetry.runtime ?? "unknown"
|
|
986
|
+
};
|
|
987
|
+
};
|
|
988
|
+
var getHeaders = ({
|
|
989
|
+
initHeaderValue,
|
|
990
|
+
workflowRunId,
|
|
991
|
+
workflowUrl,
|
|
992
|
+
userHeaders,
|
|
993
|
+
failureUrl,
|
|
994
|
+
retries,
|
|
995
|
+
step,
|
|
996
|
+
callRetries,
|
|
997
|
+
callTimeout,
|
|
998
|
+
telemetry
|
|
999
|
+
}) => {
|
|
963
1000
|
const baseHeaders = {
|
|
964
1001
|
[WORKFLOW_INIT_HEADER]: initHeaderValue,
|
|
965
1002
|
[WORKFLOW_ID_HEADER]: workflowRunId,
|
|
966
1003
|
[WORKFLOW_URL_HEADER]: workflowUrl,
|
|
967
|
-
[WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody"
|
|
1004
|
+
[WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody",
|
|
1005
|
+
...telemetry ? getTelemetryHeaders(telemetry) : {}
|
|
968
1006
|
};
|
|
969
1007
|
if (!step?.callUrl) {
|
|
970
1008
|
baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
|
|
@@ -1038,6 +1076,13 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
|
|
|
1038
1076
|
...Object.fromEntries(
|
|
1039
1077
|
Object.entries(baseHeaders).map(([header, value]) => [header, [value]])
|
|
1040
1078
|
),
|
|
1079
|
+
// to include telemetry headers:
|
|
1080
|
+
...telemetry ? Object.fromEntries(
|
|
1081
|
+
Object.entries(getTelemetryHeaders(telemetry)).map(([header, value]) => [
|
|
1082
|
+
header,
|
|
1083
|
+
[value]
|
|
1084
|
+
])
|
|
1085
|
+
) : {},
|
|
1041
1086
|
// note: using WORKFLOW_ID_HEADER doesn't work, because Runid -> RunId:
|
|
1042
1087
|
"Upstash-Workflow-Runid": [workflowRunId],
|
|
1043
1088
|
[WORKFLOW_INIT_HEADER]: ["false"],
|
|
@@ -1076,6 +1121,7 @@ If you want to disable QStash Verification, you should clear env variables QSTAS
|
|
|
1076
1121
|
};
|
|
1077
1122
|
|
|
1078
1123
|
// src/context/auto-executor.ts
|
|
1124
|
+
var import_qstash4 = require("@upstash/qstash");
|
|
1079
1125
|
var AutoExecutor = class _AutoExecutor {
|
|
1080
1126
|
context;
|
|
1081
1127
|
promises = /* @__PURE__ */ new WeakMap();
|
|
@@ -1084,13 +1130,15 @@ var AutoExecutor = class _AutoExecutor {
|
|
|
1084
1130
|
nonPlanStepCount;
|
|
1085
1131
|
steps;
|
|
1086
1132
|
indexInCurrentList = 0;
|
|
1133
|
+
telemetry;
|
|
1087
1134
|
stepCount = 0;
|
|
1088
1135
|
planStepCount = 0;
|
|
1089
1136
|
executingStep = false;
|
|
1090
|
-
constructor(context, steps, debug) {
|
|
1137
|
+
constructor(context, steps, telemetry, debug) {
|
|
1091
1138
|
this.context = context;
|
|
1092
|
-
this.debug = debug;
|
|
1093
1139
|
this.steps = steps;
|
|
1140
|
+
this.telemetry = telemetry;
|
|
1141
|
+
this.debug = debug;
|
|
1094
1142
|
this.nonPlanStepCount = this.steps.filter((step) => !step.targetStep).length;
|
|
1095
1143
|
}
|
|
1096
1144
|
/**
|
|
@@ -1233,7 +1281,7 @@ var AutoExecutor = class _AutoExecutor {
|
|
|
1233
1281
|
);
|
|
1234
1282
|
await this.submitStepsToQStash([resultStep], [parallelStep]);
|
|
1235
1283
|
} catch (error) {
|
|
1236
|
-
if (error instanceof WorkflowAbort) {
|
|
1284
|
+
if (error instanceof WorkflowAbort || error instanceof import_qstash4.QstashError && error.status === 400) {
|
|
1237
1285
|
throw error;
|
|
1238
1286
|
}
|
|
1239
1287
|
throw new WorkflowError(
|
|
@@ -1304,15 +1352,16 @@ var AutoExecutor = class _AutoExecutor {
|
|
|
1304
1352
|
});
|
|
1305
1353
|
if (steps[0].waitEventId && steps.length === 1) {
|
|
1306
1354
|
const waitStep = steps[0];
|
|
1307
|
-
const { headers, timeoutHeaders } = getHeaders(
|
|
1308
|
-
"false",
|
|
1309
|
-
this.context.workflowRunId,
|
|
1310
|
-
this.context.url,
|
|
1311
|
-
this.context.headers,
|
|
1312
|
-
waitStep,
|
|
1313
|
-
this.context.failureUrl,
|
|
1314
|
-
this.context.retries
|
|
1315
|
-
|
|
1355
|
+
const { headers, timeoutHeaders } = getHeaders({
|
|
1356
|
+
initHeaderValue: "false",
|
|
1357
|
+
workflowRunId: this.context.workflowRunId,
|
|
1358
|
+
workflowUrl: this.context.url,
|
|
1359
|
+
userHeaders: this.context.headers,
|
|
1360
|
+
step: waitStep,
|
|
1361
|
+
failureUrl: this.context.failureUrl,
|
|
1362
|
+
retries: this.context.retries,
|
|
1363
|
+
telemetry: this.telemetry
|
|
1364
|
+
});
|
|
1316
1365
|
const waitBody = {
|
|
1317
1366
|
url: this.context.url,
|
|
1318
1367
|
timeout: waitStep.timeout,
|
|
@@ -1339,17 +1388,18 @@ var AutoExecutor = class _AutoExecutor {
|
|
|
1339
1388
|
const result = await this.context.qstashClient.batchJSON(
|
|
1340
1389
|
steps.map((singleStep, index) => {
|
|
1341
1390
|
const lazyStep = lazySteps[index];
|
|
1342
|
-
const { headers } = getHeaders(
|
|
1343
|
-
"false",
|
|
1344
|
-
this.context.workflowRunId,
|
|
1345
|
-
this.context.url,
|
|
1346
|
-
this.context.headers,
|
|
1347
|
-
singleStep,
|
|
1348
|
-
this.context.failureUrl,
|
|
1349
|
-
this.context.retries,
|
|
1350
|
-
lazyStep instanceof LazyCallStep ? lazyStep.retries : void 0,
|
|
1351
|
-
lazyStep instanceof LazyCallStep ? lazyStep.timeout : void 0
|
|
1352
|
-
|
|
1391
|
+
const { headers } = getHeaders({
|
|
1392
|
+
initHeaderValue: "false",
|
|
1393
|
+
workflowRunId: this.context.workflowRunId,
|
|
1394
|
+
workflowUrl: this.context.url,
|
|
1395
|
+
userHeaders: this.context.headers,
|
|
1396
|
+
step: singleStep,
|
|
1397
|
+
failureUrl: this.context.failureUrl,
|
|
1398
|
+
retries: this.context.retries,
|
|
1399
|
+
callRetries: lazyStep instanceof LazyCallStep ? lazyStep.retries : void 0,
|
|
1400
|
+
callTimeout: lazyStep instanceof LazyCallStep ? lazyStep.timeout : void 0,
|
|
1401
|
+
telemetry: this.telemetry
|
|
1402
|
+
});
|
|
1353
1403
|
const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
|
|
1354
1404
|
singleStep.out = JSON.stringify(singleStep.out);
|
|
1355
1405
|
return singleStep.callUrl ? (
|
|
@@ -1462,7 +1512,7 @@ var sortSteps = (steps) => {
|
|
|
1462
1512
|
};
|
|
1463
1513
|
|
|
1464
1514
|
// src/context/api/anthropic.ts
|
|
1465
|
-
var
|
|
1515
|
+
var import_qstash5 = require("@upstash/qstash");
|
|
1466
1516
|
|
|
1467
1517
|
// src/context/provider.ts
|
|
1468
1518
|
var getProviderInfo = (api) => {
|
|
@@ -1526,7 +1576,7 @@ var AnthropicAPI = class extends BaseWorkflowApi {
|
|
|
1526
1576
|
return await this.callApi(stepName, {
|
|
1527
1577
|
api: {
|
|
1528
1578
|
name: "llm",
|
|
1529
|
-
provider: (0,
|
|
1579
|
+
provider: (0, import_qstash5.anthropic)({ token })
|
|
1530
1580
|
},
|
|
1531
1581
|
...parameters
|
|
1532
1582
|
});
|
|
@@ -1534,14 +1584,14 @@ var AnthropicAPI = class extends BaseWorkflowApi {
|
|
|
1534
1584
|
};
|
|
1535
1585
|
|
|
1536
1586
|
// src/context/api/openai.ts
|
|
1537
|
-
var
|
|
1587
|
+
var import_qstash6 = require("@upstash/qstash");
|
|
1538
1588
|
var OpenAIAPI = class extends BaseWorkflowApi {
|
|
1539
1589
|
async call(stepName, settings) {
|
|
1540
1590
|
const { token, organization, operation, ...parameters } = settings;
|
|
1541
1591
|
return await this.callApi(stepName, {
|
|
1542
1592
|
api: {
|
|
1543
1593
|
name: "llm",
|
|
1544
|
-
provider: (0,
|
|
1594
|
+
provider: (0, import_qstash6.openai)({ token, organization })
|
|
1545
1595
|
},
|
|
1546
1596
|
...parameters
|
|
1547
1597
|
});
|
|
@@ -1549,14 +1599,14 @@ var OpenAIAPI = class extends BaseWorkflowApi {
|
|
|
1549
1599
|
};
|
|
1550
1600
|
|
|
1551
1601
|
// src/context/api/resend.ts
|
|
1552
|
-
var
|
|
1602
|
+
var import_qstash7 = require("@upstash/qstash");
|
|
1553
1603
|
var ResendAPI = class extends BaseWorkflowApi {
|
|
1554
1604
|
async call(stepName, settings) {
|
|
1555
1605
|
const { token, batch = false, ...parameters } = settings;
|
|
1556
1606
|
return await this.callApi(stepName, {
|
|
1557
1607
|
api: {
|
|
1558
1608
|
name: "email",
|
|
1559
|
-
provider: (0,
|
|
1609
|
+
provider: (0, import_qstash7.resend)({ token, batch })
|
|
1560
1610
|
},
|
|
1561
1611
|
...parameters
|
|
1562
1612
|
});
|
|
@@ -1582,6 +1632,216 @@ var WorkflowApi = class extends BaseWorkflowApi {
|
|
|
1582
1632
|
}
|
|
1583
1633
|
};
|
|
1584
1634
|
|
|
1635
|
+
// src/agents/adapters.ts
|
|
1636
|
+
var import_openai2 = require("@ai-sdk/openai");
|
|
1637
|
+
var import_ai = require("ai");
|
|
1638
|
+
var AGENT_NAME_HEADER = "upstash-agent-name";
|
|
1639
|
+
var createWorkflowOpenAI = (context) => {
|
|
1640
|
+
return (0, import_openai2.createOpenAI)({
|
|
1641
|
+
compatibility: "strict",
|
|
1642
|
+
fetch: async (input, init) => {
|
|
1643
|
+
try {
|
|
1644
|
+
const headers = init?.headers ? Object.fromEntries(new Headers(init.headers).entries()) : {};
|
|
1645
|
+
const body = init?.body ? JSON.parse(init.body) : void 0;
|
|
1646
|
+
const agentName = headers[AGENT_NAME_HEADER];
|
|
1647
|
+
const stepName = agentName ? `Call Agent ${agentName}` : "Call Agent";
|
|
1648
|
+
const responseInfo = await context.call(stepName, {
|
|
1649
|
+
url: input.toString(),
|
|
1650
|
+
method: init?.method,
|
|
1651
|
+
headers,
|
|
1652
|
+
body
|
|
1653
|
+
});
|
|
1654
|
+
const responseHeaders = new Headers(
|
|
1655
|
+
Object.entries(responseInfo.header).reduce(
|
|
1656
|
+
(acc, [key, values]) => {
|
|
1657
|
+
acc[key] = values.join(", ");
|
|
1658
|
+
return acc;
|
|
1659
|
+
},
|
|
1660
|
+
{}
|
|
1661
|
+
)
|
|
1662
|
+
);
|
|
1663
|
+
return new Response(JSON.stringify(responseInfo.body), {
|
|
1664
|
+
status: responseInfo.status,
|
|
1665
|
+
headers: responseHeaders
|
|
1666
|
+
});
|
|
1667
|
+
} catch (error) {
|
|
1668
|
+
if (error instanceof Error && error.name === "WorkflowAbort") {
|
|
1669
|
+
throw error;
|
|
1670
|
+
} else {
|
|
1671
|
+
console.error("Error in fetch implementation:", error);
|
|
1672
|
+
throw error;
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1675
|
+
}
|
|
1676
|
+
});
|
|
1677
|
+
};
|
|
1678
|
+
var wrapTools = ({
|
|
1679
|
+
context,
|
|
1680
|
+
tools
|
|
1681
|
+
}) => {
|
|
1682
|
+
return Object.fromEntries(
|
|
1683
|
+
Object.entries(tools).map((toolInfo) => {
|
|
1684
|
+
const [toolName, tool3] = toolInfo;
|
|
1685
|
+
const aiSDKTool = convertToAISDKTool(tool3);
|
|
1686
|
+
const execute = aiSDKTool.execute;
|
|
1687
|
+
if (execute) {
|
|
1688
|
+
const wrappedExecute = (...params) => {
|
|
1689
|
+
return context.run(`Run tool ${toolName}`, () => execute(...params));
|
|
1690
|
+
};
|
|
1691
|
+
aiSDKTool.execute = wrappedExecute;
|
|
1692
|
+
}
|
|
1693
|
+
return [toolName, aiSDKTool];
|
|
1694
|
+
})
|
|
1695
|
+
);
|
|
1696
|
+
};
|
|
1697
|
+
var convertToAISDKTool = (tool3) => {
|
|
1698
|
+
const isLangchainTool = "invoke" in tool3;
|
|
1699
|
+
return isLangchainTool ? convertLangchainTool(tool3) : tool3;
|
|
1700
|
+
};
|
|
1701
|
+
var convertLangchainTool = (langchainTool) => {
|
|
1702
|
+
return (0, import_ai.tool)({
|
|
1703
|
+
description: langchainTool.description,
|
|
1704
|
+
parameters: langchainTool.schema,
|
|
1705
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1706
|
+
execute: async (param) => langchainTool.invoke(param)
|
|
1707
|
+
});
|
|
1708
|
+
};
|
|
1709
|
+
|
|
1710
|
+
// src/agents/agent.ts
|
|
1711
|
+
var import_zod = require("zod");
|
|
1712
|
+
var import_ai2 = require("ai");
|
|
1713
|
+
var Agent = class {
|
|
1714
|
+
name;
|
|
1715
|
+
tools;
|
|
1716
|
+
maxSteps;
|
|
1717
|
+
background;
|
|
1718
|
+
model;
|
|
1719
|
+
constructor({ tools, maxSteps, background, name, model }) {
|
|
1720
|
+
this.name = name;
|
|
1721
|
+
this.tools = tools ?? {};
|
|
1722
|
+
this.maxSteps = maxSteps;
|
|
1723
|
+
this.background = background;
|
|
1724
|
+
this.model = model;
|
|
1725
|
+
}
|
|
1726
|
+
async call({ prompt }) {
|
|
1727
|
+
try {
|
|
1728
|
+
return await (0, import_ai2.generateText)({
|
|
1729
|
+
model: this.model,
|
|
1730
|
+
tools: this.tools,
|
|
1731
|
+
maxSteps: this.maxSteps,
|
|
1732
|
+
system: this.background,
|
|
1733
|
+
prompt,
|
|
1734
|
+
headers: {
|
|
1735
|
+
[AGENT_NAME_HEADER]: this.name
|
|
1736
|
+
}
|
|
1737
|
+
});
|
|
1738
|
+
} catch (error) {
|
|
1739
|
+
if (error instanceof import_ai2.ToolExecutionError) {
|
|
1740
|
+
if (error.cause instanceof Error && error.cause.name === "WorkflowAbort") {
|
|
1741
|
+
throw error.cause;
|
|
1742
|
+
} else if (error.cause instanceof import_ai2.ToolExecutionError && error.cause.cause instanceof Error && error.cause.cause.name === "WorkflowAbort") {
|
|
1743
|
+
throw error.cause.cause;
|
|
1744
|
+
} else {
|
|
1745
|
+
throw error;
|
|
1746
|
+
}
|
|
1747
|
+
} else {
|
|
1748
|
+
throw error;
|
|
1749
|
+
}
|
|
1750
|
+
}
|
|
1751
|
+
}
|
|
1752
|
+
asTool() {
|
|
1753
|
+
const toolDescriptions = Object.values(this.tools).map((tool3) => tool3.description).join("\n");
|
|
1754
|
+
return (0, import_ai2.tool)({
|
|
1755
|
+
parameters: import_zod.z.object({ prompt: import_zod.z.string() }),
|
|
1756
|
+
execute: async ({ prompt }) => {
|
|
1757
|
+
return await this.call({ prompt });
|
|
1758
|
+
},
|
|
1759
|
+
description: `An AI Agent with the following background: ${this.background}Has access to the following tools: ${toolDescriptions}`
|
|
1760
|
+
});
|
|
1761
|
+
}
|
|
1762
|
+
};
|
|
1763
|
+
var MANAGER_AGENT_PROMPT = `You are an AI agent who orchestrates other AI Agents.
|
|
1764
|
+
These other agents have tools available to them.
|
|
1765
|
+
Given a prompt, utilize these agents to address requests.
|
|
1766
|
+
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.
|
|
1767
|
+
`;
|
|
1768
|
+
var ManagerAgent = class extends Agent {
|
|
1769
|
+
agents;
|
|
1770
|
+
constructor({
|
|
1771
|
+
maxSteps,
|
|
1772
|
+
background = MANAGER_AGENT_PROMPT,
|
|
1773
|
+
agents,
|
|
1774
|
+
model,
|
|
1775
|
+
name = "manager llm"
|
|
1776
|
+
}) {
|
|
1777
|
+
super({
|
|
1778
|
+
background,
|
|
1779
|
+
maxSteps,
|
|
1780
|
+
tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool()])),
|
|
1781
|
+
name,
|
|
1782
|
+
model
|
|
1783
|
+
});
|
|
1784
|
+
this.agents = agents;
|
|
1785
|
+
}
|
|
1786
|
+
};
|
|
1787
|
+
|
|
1788
|
+
// src/agents/task.ts
|
|
1789
|
+
var Task = class {
|
|
1790
|
+
context;
|
|
1791
|
+
taskParameters;
|
|
1792
|
+
constructor({
|
|
1793
|
+
context,
|
|
1794
|
+
taskParameters
|
|
1795
|
+
}) {
|
|
1796
|
+
this.context = context;
|
|
1797
|
+
this.taskParameters = taskParameters;
|
|
1798
|
+
}
|
|
1799
|
+
async run() {
|
|
1800
|
+
const { prompt, ...otherParams } = this.taskParameters;
|
|
1801
|
+
const safePrompt = await this.context.run("Get Prompt", () => prompt);
|
|
1802
|
+
if ("agent" in otherParams) {
|
|
1803
|
+
const agent = otherParams.agent;
|
|
1804
|
+
const result = await agent.call({
|
|
1805
|
+
prompt: safePrompt
|
|
1806
|
+
});
|
|
1807
|
+
return { text: result.text };
|
|
1808
|
+
} else {
|
|
1809
|
+
const { agents, maxSteps, model, background } = otherParams;
|
|
1810
|
+
const managerAgent = new ManagerAgent({
|
|
1811
|
+
model,
|
|
1812
|
+
maxSteps,
|
|
1813
|
+
agents,
|
|
1814
|
+
name: "Manager LLM",
|
|
1815
|
+
background
|
|
1816
|
+
});
|
|
1817
|
+
const result = await managerAgent.call({ prompt: safePrompt });
|
|
1818
|
+
return { text: result.text };
|
|
1819
|
+
}
|
|
1820
|
+
}
|
|
1821
|
+
};
|
|
1822
|
+
|
|
1823
|
+
// src/agents/index.ts
|
|
1824
|
+
var WorkflowAgents = class {
|
|
1825
|
+
context;
|
|
1826
|
+
constructor({ context }) {
|
|
1827
|
+
this.context = context;
|
|
1828
|
+
}
|
|
1829
|
+
agent(params) {
|
|
1830
|
+
const wrappedTools = wrapTools({ context: this.context, tools: params.tools });
|
|
1831
|
+
return new Agent({
|
|
1832
|
+
...params,
|
|
1833
|
+
tools: wrappedTools
|
|
1834
|
+
});
|
|
1835
|
+
}
|
|
1836
|
+
task(taskParameters) {
|
|
1837
|
+
return new Task({ context: this.context, taskParameters });
|
|
1838
|
+
}
|
|
1839
|
+
openai(...params) {
|
|
1840
|
+
const openai2 = createWorkflowOpenAI(this.context);
|
|
1841
|
+
return openai2(...params);
|
|
1842
|
+
}
|
|
1843
|
+
};
|
|
1844
|
+
|
|
1585
1845
|
// src/context/context.ts
|
|
1586
1846
|
var WorkflowContext = class {
|
|
1587
1847
|
executor;
|
|
@@ -1714,7 +1974,8 @@ var WorkflowContext = class {
|
|
|
1714
1974
|
debug,
|
|
1715
1975
|
initialPayload,
|
|
1716
1976
|
env,
|
|
1717
|
-
retries
|
|
1977
|
+
retries,
|
|
1978
|
+
telemetry
|
|
1718
1979
|
}) {
|
|
1719
1980
|
this.qstashClient = qstashClient;
|
|
1720
1981
|
this.workflowRunId = workflowRunId;
|
|
@@ -1725,7 +1986,7 @@ var WorkflowContext = class {
|
|
|
1725
1986
|
this.requestPayload = initialPayload;
|
|
1726
1987
|
this.env = env ?? {};
|
|
1727
1988
|
this.retries = retries ?? DEFAULT_RETRIES;
|
|
1728
|
-
this.executor = new AutoExecutor(this, this.steps, debug);
|
|
1989
|
+
this.executor = new AutoExecutor(this, this.steps, telemetry, debug);
|
|
1729
1990
|
}
|
|
1730
1991
|
/**
|
|
1731
1992
|
* Executes a workflow step
|
|
@@ -1966,6 +2227,11 @@ var WorkflowContext = class {
|
|
|
1966
2227
|
context: this
|
|
1967
2228
|
});
|
|
1968
2229
|
}
|
|
2230
|
+
get agents() {
|
|
2231
|
+
return new WorkflowAgents({
|
|
2232
|
+
context: this
|
|
2233
|
+
});
|
|
2234
|
+
}
|
|
1969
2235
|
};
|
|
1970
2236
|
|
|
1971
2237
|
// src/logger.ts
|
|
@@ -2043,7 +2309,7 @@ function decodeBase64(base64) {
|
|
|
2043
2309
|
}
|
|
2044
2310
|
|
|
2045
2311
|
// src/serve/authorization.ts
|
|
2046
|
-
var
|
|
2312
|
+
var import_qstash8 = require("@upstash/qstash");
|
|
2047
2313
|
var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
|
|
2048
2314
|
static disabledMessage = "disabled-qstash-worklfow-run";
|
|
2049
2315
|
/**
|
|
@@ -2074,7 +2340,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
2074
2340
|
*/
|
|
2075
2341
|
static async tryAuthentication(routeFunction, context) {
|
|
2076
2342
|
const disabledContext = new _DisabledWorkflowContext({
|
|
2077
|
-
qstashClient: new
|
|
2343
|
+
qstashClient: new import_qstash8.Client({
|
|
2078
2344
|
baseUrl: "disabled-client",
|
|
2079
2345
|
token: "disabled-client"
|
|
2080
2346
|
}),
|
|
@@ -2170,6 +2436,7 @@ var checkIfLastOneIsDuplicate = async (steps, debug) => {
|
|
|
2170
2436
|
if (step.stepId === lastStepId && step.targetStep === lastTargetStepId) {
|
|
2171
2437
|
const message = `Upstash Workflow: The step '${step.stepName}' with id '${step.stepId}' has run twice during workflow execution. Rest of the workflow will continue running as usual.`;
|
|
2172
2438
|
await debug?.log("WARN", "RESPONSE_DEFAULT", message);
|
|
2439
|
+
console.log(steps);
|
|
2173
2440
|
console.warn(message);
|
|
2174
2441
|
return true;
|
|
2175
2442
|
}
|
|
@@ -2238,7 +2505,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, workflowRunId, requ
|
|
|
2238
2505
|
};
|
|
2239
2506
|
}
|
|
2240
2507
|
};
|
|
2241
|
-
var handleFailure = async (request, requestPayload, qstashClient, initialPayloadParser, routeFunction, failureFunction, debug) => {
|
|
2508
|
+
var handleFailure = async (request, requestPayload, qstashClient, initialPayloadParser, routeFunction, failureFunction, env, retries, debug) => {
|
|
2242
2509
|
if (request.headers.get(WORKFLOW_FAILURE_HEADER) !== "true") {
|
|
2243
2510
|
return ok("not-failure-callback");
|
|
2244
2511
|
}
|
|
@@ -2263,7 +2530,11 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
2263
2530
|
steps: [],
|
|
2264
2531
|
url,
|
|
2265
2532
|
failureUrl: url,
|
|
2266
|
-
debug
|
|
2533
|
+
debug,
|
|
2534
|
+
env,
|
|
2535
|
+
retries,
|
|
2536
|
+
telemetry: void 0
|
|
2537
|
+
// not going to make requests in authentication check
|
|
2267
2538
|
});
|
|
2268
2539
|
const authCheck = await DisabledWorkflowContext.tryAuthentication(
|
|
2269
2540
|
routeFunction,
|
|
@@ -2288,15 +2559,15 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
2288
2559
|
};
|
|
2289
2560
|
|
|
2290
2561
|
// src/serve/options.ts
|
|
2291
|
-
var import_qstash8 = require("@upstash/qstash");
|
|
2292
2562
|
var import_qstash9 = require("@upstash/qstash");
|
|
2563
|
+
var import_qstash10 = require("@upstash/qstash");
|
|
2293
2564
|
var processOptions = (options) => {
|
|
2294
2565
|
const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
|
|
2295
2566
|
const receiverEnvironmentVariablesSet = Boolean(
|
|
2296
2567
|
environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
|
|
2297
2568
|
);
|
|
2298
2569
|
return {
|
|
2299
|
-
qstashClient: new
|
|
2570
|
+
qstashClient: new import_qstash10.Client({
|
|
2300
2571
|
baseUrl: environment.QSTASH_URL,
|
|
2301
2572
|
token: environment.QSTASH_TOKEN
|
|
2302
2573
|
}),
|
|
@@ -2330,7 +2601,7 @@ var processOptions = (options) => {
|
|
|
2330
2601
|
throw error;
|
|
2331
2602
|
}
|
|
2332
2603
|
},
|
|
2333
|
-
receiver: receiverEnvironmentVariablesSet ? new
|
|
2604
|
+
receiver: receiverEnvironmentVariablesSet ? new import_qstash9.Receiver({
|
|
2334
2605
|
currentSigningKey: environment.QSTASH_CURRENT_SIGNING_KEY,
|
|
2335
2606
|
nextSigningKey: environment.QSTASH_NEXT_SIGNING_KEY
|
|
2336
2607
|
}) : void 0,
|
|
@@ -2338,6 +2609,7 @@ var processOptions = (options) => {
|
|
|
2338
2609
|
env: environment,
|
|
2339
2610
|
retries: DEFAULT_RETRIES,
|
|
2340
2611
|
useJSONContent: false,
|
|
2612
|
+
disableTelemetry: false,
|
|
2341
2613
|
...options
|
|
2342
2614
|
};
|
|
2343
2615
|
};
|
|
@@ -2372,7 +2644,7 @@ var determineUrls = async (request, url, baseUrl, failureFunction, failureUrl, d
|
|
|
2372
2644
|
var AUTH_FAIL_MESSAGE = `Failed to authenticate Workflow request. If this is unexpected, see the caveat https://upstash.com/docs/workflow/basics/caveats#avoid-non-deterministic-code-outside-context-run`;
|
|
2373
2645
|
|
|
2374
2646
|
// src/serve/index.ts
|
|
2375
|
-
var serveBase = (routeFunction, options) => {
|
|
2647
|
+
var serveBase = (routeFunction, telemetry, options) => {
|
|
2376
2648
|
const {
|
|
2377
2649
|
qstashClient,
|
|
2378
2650
|
onStepFinish,
|
|
@@ -2385,8 +2657,10 @@ var serveBase = (routeFunction, options) => {
|
|
|
2385
2657
|
baseUrl,
|
|
2386
2658
|
env,
|
|
2387
2659
|
retries,
|
|
2388
|
-
useJSONContent
|
|
2660
|
+
useJSONContent,
|
|
2661
|
+
disableTelemetry
|
|
2389
2662
|
} = processOptions(options);
|
|
2663
|
+
telemetry = disableTelemetry ? void 0 : telemetry;
|
|
2390
2664
|
const debug = WorkflowLogger.getLogger(verbose);
|
|
2391
2665
|
const handler = async (request) => {
|
|
2392
2666
|
await debug?.log("INFO", "ENDPOINT_START");
|
|
@@ -2422,7 +2696,10 @@ var serveBase = (routeFunction, options) => {
|
|
|
2422
2696
|
qstashClient,
|
|
2423
2697
|
initialPayloadParser,
|
|
2424
2698
|
routeFunction,
|
|
2425
|
-
failureFunction
|
|
2699
|
+
failureFunction,
|
|
2700
|
+
env,
|
|
2701
|
+
retries,
|
|
2702
|
+
debug
|
|
2426
2703
|
);
|
|
2427
2704
|
if (failureCheck.isErr()) {
|
|
2428
2705
|
throw failureCheck.error;
|
|
@@ -2440,7 +2717,8 @@ var serveBase = (routeFunction, options) => {
|
|
|
2440
2717
|
failureUrl: workflowFailureUrl,
|
|
2441
2718
|
debug,
|
|
2442
2719
|
env,
|
|
2443
|
-
retries
|
|
2720
|
+
retries,
|
|
2721
|
+
telemetry
|
|
2444
2722
|
});
|
|
2445
2723
|
const authCheck = await DisabledWorkflowContext.tryAuthentication(
|
|
2446
2724
|
routeFunction,
|
|
@@ -2456,22 +2734,23 @@ var serveBase = (routeFunction, options) => {
|
|
|
2456
2734
|
"auth-fail"
|
|
2457
2735
|
);
|
|
2458
2736
|
}
|
|
2459
|
-
const callReturnCheck = await handleThirdPartyCallResult(
|
|
2737
|
+
const callReturnCheck = await handleThirdPartyCallResult({
|
|
2460
2738
|
request,
|
|
2461
|
-
rawInitialPayload,
|
|
2462
|
-
qstashClient,
|
|
2739
|
+
requestPayload: rawInitialPayload,
|
|
2740
|
+
client: qstashClient,
|
|
2463
2741
|
workflowUrl,
|
|
2464
|
-
workflowFailureUrl,
|
|
2742
|
+
failureUrl: workflowFailureUrl,
|
|
2465
2743
|
retries,
|
|
2744
|
+
telemetry,
|
|
2466
2745
|
debug
|
|
2467
|
-
);
|
|
2746
|
+
});
|
|
2468
2747
|
if (callReturnCheck.isErr()) {
|
|
2469
2748
|
await debug?.log("ERROR", "SUBMIT_THIRD_PARTY_RESULT", {
|
|
2470
2749
|
error: callReturnCheck.error.message
|
|
2471
2750
|
});
|
|
2472
2751
|
throw callReturnCheck.error;
|
|
2473
2752
|
} else if (callReturnCheck.value === "continue-workflow") {
|
|
2474
|
-
const result = isFirstInvocation ? await triggerFirstInvocation(workflowContext,
|
|
2753
|
+
const result = isFirstInvocation ? await triggerFirstInvocation({ workflowContext, useJSONContent, telemetry, debug }) : await triggerRouteFunction({
|
|
2475
2754
|
onStep: async () => routeFunction(workflowContext),
|
|
2476
2755
|
onCleanup: async () => {
|
|
2477
2756
|
await triggerWorkflowDelete(workflowContext, debug);
|
|
@@ -2515,7 +2794,15 @@ var serve = (routeFunction, options) => {
|
|
|
2515
2794
|
status: 405
|
|
2516
2795
|
});
|
|
2517
2796
|
}
|
|
2518
|
-
const { handler: serveHandler } = serveBase(
|
|
2797
|
+
const { handler: serveHandler } = serveBase(
|
|
2798
|
+
routeFunction,
|
|
2799
|
+
{
|
|
2800
|
+
sdk: SDK_TELEMETRY,
|
|
2801
|
+
framework: "solidjs",
|
|
2802
|
+
runtime: process.versions.bun ? `bun@${process.versions.bun}/node@${process.version}` : `node@${process.version}`
|
|
2803
|
+
},
|
|
2804
|
+
options
|
|
2805
|
+
);
|
|
2519
2806
|
return await serveHandler(event.request);
|
|
2520
2807
|
};
|
|
2521
2808
|
return { POST: handler };
|