@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/h3.js
CHANGED
|
@@ -389,6 +389,23 @@ var getSteps = async (requester, workflowRunId, messageId, debug) => {
|
|
|
389
389
|
}
|
|
390
390
|
};
|
|
391
391
|
|
|
392
|
+
// src/constants.ts
|
|
393
|
+
var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
|
|
394
|
+
var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
|
|
395
|
+
var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
|
|
396
|
+
var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
|
|
397
|
+
var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
|
|
398
|
+
var WORKFLOW_PROTOCOL_VERSION = "1";
|
|
399
|
+
var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
400
|
+
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
401
|
+
var NO_CONCURRENCY = 1;
|
|
402
|
+
var DEFAULT_RETRIES = 3;
|
|
403
|
+
var VERSION = "v0.2.3";
|
|
404
|
+
var SDK_TELEMETRY = `@upstash/workflow@${VERSION}`;
|
|
405
|
+
var TELEMETRY_HEADER_SDK = "Upstash-Telemetry-Sdk";
|
|
406
|
+
var TELEMETRY_HEADER_FRAMEWORK = "Upstash-Telemetry-Framework";
|
|
407
|
+
var TELEMETRY_HEADER_RUNTIME = "Upstash-Telemetry-Runtime";
|
|
408
|
+
|
|
392
409
|
// src/error.ts
|
|
393
410
|
var import_qstash2 = require("@upstash/qstash");
|
|
394
411
|
var WorkflowError = class extends import_qstash2.QstashError {
|
|
@@ -1026,18 +1043,6 @@ var Err = class {
|
|
|
1026
1043
|
};
|
|
1027
1044
|
var fromThrowable = Result.fromThrowable;
|
|
1028
1045
|
|
|
1029
|
-
// src/constants.ts
|
|
1030
|
-
var WORKFLOW_ID_HEADER = "Upstash-Workflow-RunId";
|
|
1031
|
-
var WORKFLOW_INIT_HEADER = "Upstash-Workflow-Init";
|
|
1032
|
-
var WORKFLOW_URL_HEADER = "Upstash-Workflow-Url";
|
|
1033
|
-
var WORKFLOW_FAILURE_HEADER = "Upstash-Workflow-Is-Failure";
|
|
1034
|
-
var WORKFLOW_FEATURE_HEADER = "Upstash-Feature-Set";
|
|
1035
|
-
var WORKFLOW_PROTOCOL_VERSION = "1";
|
|
1036
|
-
var WORKFLOW_PROTOCOL_VERSION_HEADER = "Upstash-Workflow-Sdk-Version";
|
|
1037
|
-
var DEFAULT_CONTENT_TYPE = "application/json";
|
|
1038
|
-
var NO_CONCURRENCY = 1;
|
|
1039
|
-
var DEFAULT_RETRIES = 3;
|
|
1040
|
-
|
|
1041
1046
|
// src/types.ts
|
|
1042
1047
|
var StepTypes = [
|
|
1043
1048
|
"Initial",
|
|
@@ -1051,16 +1056,21 @@ var StepTypes = [
|
|
|
1051
1056
|
|
|
1052
1057
|
// src/workflow-requests.ts
|
|
1053
1058
|
var import_qstash3 = require("@upstash/qstash");
|
|
1054
|
-
var triggerFirstInvocation = async (
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1059
|
+
var triggerFirstInvocation = async ({
|
|
1060
|
+
workflowContext,
|
|
1061
|
+
useJSONContent,
|
|
1062
|
+
telemetry,
|
|
1063
|
+
debug
|
|
1064
|
+
}) => {
|
|
1065
|
+
const { headers } = getHeaders({
|
|
1066
|
+
initHeaderValue: "true",
|
|
1067
|
+
workflowRunId: workflowContext.workflowRunId,
|
|
1068
|
+
workflowUrl: workflowContext.url,
|
|
1069
|
+
userHeaders: workflowContext.headers,
|
|
1070
|
+
failureUrl: workflowContext.failureUrl,
|
|
1071
|
+
retries: workflowContext.retries,
|
|
1072
|
+
telemetry
|
|
1073
|
+
});
|
|
1064
1074
|
if (useJSONContent) {
|
|
1065
1075
|
headers["content-type"] = "application/json";
|
|
1066
1076
|
}
|
|
@@ -1166,7 +1176,16 @@ var recreateUserHeaders = (headers) => {
|
|
|
1166
1176
|
}
|
|
1167
1177
|
return filteredHeaders;
|
|
1168
1178
|
};
|
|
1169
|
-
var handleThirdPartyCallResult = async (
|
|
1179
|
+
var handleThirdPartyCallResult = async ({
|
|
1180
|
+
request,
|
|
1181
|
+
requestPayload,
|
|
1182
|
+
client,
|
|
1183
|
+
workflowUrl,
|
|
1184
|
+
failureUrl,
|
|
1185
|
+
retries,
|
|
1186
|
+
telemetry,
|
|
1187
|
+
debug
|
|
1188
|
+
}) => {
|
|
1170
1189
|
try {
|
|
1171
1190
|
if (request.headers.get("Upstash-Workflow-Callback")) {
|
|
1172
1191
|
let callbackPayload;
|
|
@@ -1225,15 +1244,15 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
1225
1244
|
);
|
|
1226
1245
|
}
|
|
1227
1246
|
const userHeaders = recreateUserHeaders(request.headers);
|
|
1228
|
-
const { headers: requestHeaders } = getHeaders(
|
|
1229
|
-
"false",
|
|
1247
|
+
const { headers: requestHeaders } = getHeaders({
|
|
1248
|
+
initHeaderValue: "false",
|
|
1230
1249
|
workflowRunId,
|
|
1231
1250
|
workflowUrl,
|
|
1232
1251
|
userHeaders,
|
|
1233
|
-
void 0,
|
|
1234
1252
|
failureUrl,
|
|
1235
|
-
retries
|
|
1236
|
-
|
|
1253
|
+
retries,
|
|
1254
|
+
telemetry
|
|
1255
|
+
});
|
|
1237
1256
|
const callResponse = {
|
|
1238
1257
|
status: callbackMessage.status,
|
|
1239
1258
|
body: atob(callbackMessage.body ?? ""),
|
|
@@ -1271,12 +1290,31 @@ ${atob(callbackMessage.body ?? "")}`
|
|
|
1271
1290
|
);
|
|
1272
1291
|
}
|
|
1273
1292
|
};
|
|
1274
|
-
var
|
|
1293
|
+
var getTelemetryHeaders = (telemetry) => {
|
|
1294
|
+
return {
|
|
1295
|
+
[TELEMETRY_HEADER_SDK]: telemetry.sdk,
|
|
1296
|
+
[TELEMETRY_HEADER_FRAMEWORK]: telemetry.framework,
|
|
1297
|
+
[TELEMETRY_HEADER_RUNTIME]: telemetry.runtime ?? "unknown"
|
|
1298
|
+
};
|
|
1299
|
+
};
|
|
1300
|
+
var getHeaders = ({
|
|
1301
|
+
initHeaderValue,
|
|
1302
|
+
workflowRunId,
|
|
1303
|
+
workflowUrl,
|
|
1304
|
+
userHeaders,
|
|
1305
|
+
failureUrl,
|
|
1306
|
+
retries,
|
|
1307
|
+
step,
|
|
1308
|
+
callRetries,
|
|
1309
|
+
callTimeout,
|
|
1310
|
+
telemetry
|
|
1311
|
+
}) => {
|
|
1275
1312
|
const baseHeaders = {
|
|
1276
1313
|
[WORKFLOW_INIT_HEADER]: initHeaderValue,
|
|
1277
1314
|
[WORKFLOW_ID_HEADER]: workflowRunId,
|
|
1278
1315
|
[WORKFLOW_URL_HEADER]: workflowUrl,
|
|
1279
|
-
[WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody"
|
|
1316
|
+
[WORKFLOW_FEATURE_HEADER]: "LazyFetch,InitialBody",
|
|
1317
|
+
...telemetry ? getTelemetryHeaders(telemetry) : {}
|
|
1280
1318
|
};
|
|
1281
1319
|
if (!step?.callUrl) {
|
|
1282
1320
|
baseHeaders[`Upstash-Forward-${WORKFLOW_PROTOCOL_VERSION_HEADER}`] = WORKFLOW_PROTOCOL_VERSION;
|
|
@@ -1350,6 +1388,13 @@ var getHeaders = (initHeaderValue, workflowRunId, workflowUrl, userHeaders, step
|
|
|
1350
1388
|
...Object.fromEntries(
|
|
1351
1389
|
Object.entries(baseHeaders).map(([header, value]) => [header, [value]])
|
|
1352
1390
|
),
|
|
1391
|
+
// to include telemetry headers:
|
|
1392
|
+
...telemetry ? Object.fromEntries(
|
|
1393
|
+
Object.entries(getTelemetryHeaders(telemetry)).map(([header, value]) => [
|
|
1394
|
+
header,
|
|
1395
|
+
[value]
|
|
1396
|
+
])
|
|
1397
|
+
) : {},
|
|
1353
1398
|
// note: using WORKFLOW_ID_HEADER doesn't work, because Runid -> RunId:
|
|
1354
1399
|
"Upstash-Workflow-Runid": [workflowRunId],
|
|
1355
1400
|
[WORKFLOW_INIT_HEADER]: ["false"],
|
|
@@ -1388,6 +1433,7 @@ If you want to disable QStash Verification, you should clear env variables QSTAS
|
|
|
1388
1433
|
};
|
|
1389
1434
|
|
|
1390
1435
|
// src/context/auto-executor.ts
|
|
1436
|
+
var import_qstash4 = require("@upstash/qstash");
|
|
1391
1437
|
var AutoExecutor = class _AutoExecutor {
|
|
1392
1438
|
context;
|
|
1393
1439
|
promises = /* @__PURE__ */ new WeakMap();
|
|
@@ -1396,13 +1442,15 @@ var AutoExecutor = class _AutoExecutor {
|
|
|
1396
1442
|
nonPlanStepCount;
|
|
1397
1443
|
steps;
|
|
1398
1444
|
indexInCurrentList = 0;
|
|
1445
|
+
telemetry;
|
|
1399
1446
|
stepCount = 0;
|
|
1400
1447
|
planStepCount = 0;
|
|
1401
1448
|
executingStep = false;
|
|
1402
|
-
constructor(context, steps, debug) {
|
|
1449
|
+
constructor(context, steps, telemetry, debug) {
|
|
1403
1450
|
this.context = context;
|
|
1404
|
-
this.debug = debug;
|
|
1405
1451
|
this.steps = steps;
|
|
1452
|
+
this.telemetry = telemetry;
|
|
1453
|
+
this.debug = debug;
|
|
1406
1454
|
this.nonPlanStepCount = this.steps.filter((step) => !step.targetStep).length;
|
|
1407
1455
|
}
|
|
1408
1456
|
/**
|
|
@@ -1545,7 +1593,7 @@ var AutoExecutor = class _AutoExecutor {
|
|
|
1545
1593
|
);
|
|
1546
1594
|
await this.submitStepsToQStash([resultStep], [parallelStep]);
|
|
1547
1595
|
} catch (error) {
|
|
1548
|
-
if (error instanceof WorkflowAbort) {
|
|
1596
|
+
if (error instanceof WorkflowAbort || error instanceof import_qstash4.QstashError && error.status === 400) {
|
|
1549
1597
|
throw error;
|
|
1550
1598
|
}
|
|
1551
1599
|
throw new WorkflowError(
|
|
@@ -1616,15 +1664,16 @@ var AutoExecutor = class _AutoExecutor {
|
|
|
1616
1664
|
});
|
|
1617
1665
|
if (steps[0].waitEventId && steps.length === 1) {
|
|
1618
1666
|
const waitStep = steps[0];
|
|
1619
|
-
const { headers, timeoutHeaders } = getHeaders(
|
|
1620
|
-
"false",
|
|
1621
|
-
this.context.workflowRunId,
|
|
1622
|
-
this.context.url,
|
|
1623
|
-
this.context.headers,
|
|
1624
|
-
waitStep,
|
|
1625
|
-
this.context.failureUrl,
|
|
1626
|
-
this.context.retries
|
|
1627
|
-
|
|
1667
|
+
const { headers, timeoutHeaders } = getHeaders({
|
|
1668
|
+
initHeaderValue: "false",
|
|
1669
|
+
workflowRunId: this.context.workflowRunId,
|
|
1670
|
+
workflowUrl: this.context.url,
|
|
1671
|
+
userHeaders: this.context.headers,
|
|
1672
|
+
step: waitStep,
|
|
1673
|
+
failureUrl: this.context.failureUrl,
|
|
1674
|
+
retries: this.context.retries,
|
|
1675
|
+
telemetry: this.telemetry
|
|
1676
|
+
});
|
|
1628
1677
|
const waitBody = {
|
|
1629
1678
|
url: this.context.url,
|
|
1630
1679
|
timeout: waitStep.timeout,
|
|
@@ -1651,17 +1700,18 @@ var AutoExecutor = class _AutoExecutor {
|
|
|
1651
1700
|
const result = await this.context.qstashClient.batchJSON(
|
|
1652
1701
|
steps.map((singleStep, index) => {
|
|
1653
1702
|
const lazyStep = lazySteps[index];
|
|
1654
|
-
const { headers } = getHeaders(
|
|
1655
|
-
"false",
|
|
1656
|
-
this.context.workflowRunId,
|
|
1657
|
-
this.context.url,
|
|
1658
|
-
this.context.headers,
|
|
1659
|
-
singleStep,
|
|
1660
|
-
this.context.failureUrl,
|
|
1661
|
-
this.context.retries,
|
|
1662
|
-
lazyStep instanceof LazyCallStep ? lazyStep.retries : void 0,
|
|
1663
|
-
lazyStep instanceof LazyCallStep ? lazyStep.timeout : void 0
|
|
1664
|
-
|
|
1703
|
+
const { headers } = getHeaders({
|
|
1704
|
+
initHeaderValue: "false",
|
|
1705
|
+
workflowRunId: this.context.workflowRunId,
|
|
1706
|
+
workflowUrl: this.context.url,
|
|
1707
|
+
userHeaders: this.context.headers,
|
|
1708
|
+
step: singleStep,
|
|
1709
|
+
failureUrl: this.context.failureUrl,
|
|
1710
|
+
retries: this.context.retries,
|
|
1711
|
+
callRetries: lazyStep instanceof LazyCallStep ? lazyStep.retries : void 0,
|
|
1712
|
+
callTimeout: lazyStep instanceof LazyCallStep ? lazyStep.timeout : void 0,
|
|
1713
|
+
telemetry: this.telemetry
|
|
1714
|
+
});
|
|
1665
1715
|
const willWait = singleStep.concurrent === NO_CONCURRENCY || singleStep.stepId === 0;
|
|
1666
1716
|
singleStep.out = JSON.stringify(singleStep.out);
|
|
1667
1717
|
return singleStep.callUrl ? (
|
|
@@ -1774,7 +1824,7 @@ var sortSteps = (steps) => {
|
|
|
1774
1824
|
};
|
|
1775
1825
|
|
|
1776
1826
|
// src/context/api/anthropic.ts
|
|
1777
|
-
var
|
|
1827
|
+
var import_qstash5 = require("@upstash/qstash");
|
|
1778
1828
|
|
|
1779
1829
|
// src/context/provider.ts
|
|
1780
1830
|
var getProviderInfo = (api) => {
|
|
@@ -1838,7 +1888,7 @@ var AnthropicAPI = class extends BaseWorkflowApi {
|
|
|
1838
1888
|
return await this.callApi(stepName, {
|
|
1839
1889
|
api: {
|
|
1840
1890
|
name: "llm",
|
|
1841
|
-
provider: (0,
|
|
1891
|
+
provider: (0, import_qstash5.anthropic)({ token })
|
|
1842
1892
|
},
|
|
1843
1893
|
...parameters
|
|
1844
1894
|
});
|
|
@@ -1846,14 +1896,14 @@ var AnthropicAPI = class extends BaseWorkflowApi {
|
|
|
1846
1896
|
};
|
|
1847
1897
|
|
|
1848
1898
|
// src/context/api/openai.ts
|
|
1849
|
-
var
|
|
1899
|
+
var import_qstash6 = require("@upstash/qstash");
|
|
1850
1900
|
var OpenAIAPI = class extends BaseWorkflowApi {
|
|
1851
1901
|
async call(stepName, settings) {
|
|
1852
1902
|
const { token, organization, operation, ...parameters } = settings;
|
|
1853
1903
|
return await this.callApi(stepName, {
|
|
1854
1904
|
api: {
|
|
1855
1905
|
name: "llm",
|
|
1856
|
-
provider: (0,
|
|
1906
|
+
provider: (0, import_qstash6.openai)({ token, organization })
|
|
1857
1907
|
},
|
|
1858
1908
|
...parameters
|
|
1859
1909
|
});
|
|
@@ -1861,14 +1911,14 @@ var OpenAIAPI = class extends BaseWorkflowApi {
|
|
|
1861
1911
|
};
|
|
1862
1912
|
|
|
1863
1913
|
// src/context/api/resend.ts
|
|
1864
|
-
var
|
|
1914
|
+
var import_qstash7 = require("@upstash/qstash");
|
|
1865
1915
|
var ResendAPI = class extends BaseWorkflowApi {
|
|
1866
1916
|
async call(stepName, settings) {
|
|
1867
1917
|
const { token, batch = false, ...parameters } = settings;
|
|
1868
1918
|
return await this.callApi(stepName, {
|
|
1869
1919
|
api: {
|
|
1870
1920
|
name: "email",
|
|
1871
|
-
provider: (0,
|
|
1921
|
+
provider: (0, import_qstash7.resend)({ token, batch })
|
|
1872
1922
|
},
|
|
1873
1923
|
...parameters
|
|
1874
1924
|
});
|
|
@@ -1894,6 +1944,216 @@ var WorkflowApi = class extends BaseWorkflowApi {
|
|
|
1894
1944
|
}
|
|
1895
1945
|
};
|
|
1896
1946
|
|
|
1947
|
+
// src/agents/adapters.ts
|
|
1948
|
+
var import_openai2 = require("@ai-sdk/openai");
|
|
1949
|
+
var import_ai = require("ai");
|
|
1950
|
+
var AGENT_NAME_HEADER = "upstash-agent-name";
|
|
1951
|
+
var createWorkflowOpenAI = (context) => {
|
|
1952
|
+
return (0, import_openai2.createOpenAI)({
|
|
1953
|
+
compatibility: "strict",
|
|
1954
|
+
fetch: async (input, init) => {
|
|
1955
|
+
try {
|
|
1956
|
+
const headers = init?.headers ? Object.fromEntries(new Headers(init.headers).entries()) : {};
|
|
1957
|
+
const body = init?.body ? JSON.parse(init.body) : void 0;
|
|
1958
|
+
const agentName = headers[AGENT_NAME_HEADER];
|
|
1959
|
+
const stepName = agentName ? `Call Agent ${agentName}` : "Call Agent";
|
|
1960
|
+
const responseInfo = await context.call(stepName, {
|
|
1961
|
+
url: input.toString(),
|
|
1962
|
+
method: init?.method,
|
|
1963
|
+
headers,
|
|
1964
|
+
body
|
|
1965
|
+
});
|
|
1966
|
+
const responseHeaders = new Headers(
|
|
1967
|
+
Object.entries(responseInfo.header).reduce(
|
|
1968
|
+
(acc, [key, values]) => {
|
|
1969
|
+
acc[key] = values.join(", ");
|
|
1970
|
+
return acc;
|
|
1971
|
+
},
|
|
1972
|
+
{}
|
|
1973
|
+
)
|
|
1974
|
+
);
|
|
1975
|
+
return new Response(JSON.stringify(responseInfo.body), {
|
|
1976
|
+
status: responseInfo.status,
|
|
1977
|
+
headers: responseHeaders
|
|
1978
|
+
});
|
|
1979
|
+
} catch (error) {
|
|
1980
|
+
if (error instanceof Error && error.name === "WorkflowAbort") {
|
|
1981
|
+
throw error;
|
|
1982
|
+
} else {
|
|
1983
|
+
console.error("Error in fetch implementation:", error);
|
|
1984
|
+
throw error;
|
|
1985
|
+
}
|
|
1986
|
+
}
|
|
1987
|
+
}
|
|
1988
|
+
});
|
|
1989
|
+
};
|
|
1990
|
+
var wrapTools = ({
|
|
1991
|
+
context,
|
|
1992
|
+
tools
|
|
1993
|
+
}) => {
|
|
1994
|
+
return Object.fromEntries(
|
|
1995
|
+
Object.entries(tools).map((toolInfo) => {
|
|
1996
|
+
const [toolName, tool3] = toolInfo;
|
|
1997
|
+
const aiSDKTool = convertToAISDKTool(tool3);
|
|
1998
|
+
const execute = aiSDKTool.execute;
|
|
1999
|
+
if (execute) {
|
|
2000
|
+
const wrappedExecute = (...params) => {
|
|
2001
|
+
return context.run(`Run tool ${toolName}`, () => execute(...params));
|
|
2002
|
+
};
|
|
2003
|
+
aiSDKTool.execute = wrappedExecute;
|
|
2004
|
+
}
|
|
2005
|
+
return [toolName, aiSDKTool];
|
|
2006
|
+
})
|
|
2007
|
+
);
|
|
2008
|
+
};
|
|
2009
|
+
var convertToAISDKTool = (tool3) => {
|
|
2010
|
+
const isLangchainTool = "invoke" in tool3;
|
|
2011
|
+
return isLangchainTool ? convertLangchainTool(tool3) : tool3;
|
|
2012
|
+
};
|
|
2013
|
+
var convertLangchainTool = (langchainTool) => {
|
|
2014
|
+
return (0, import_ai.tool)({
|
|
2015
|
+
description: langchainTool.description,
|
|
2016
|
+
parameters: langchainTool.schema,
|
|
2017
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2018
|
+
execute: async (param) => langchainTool.invoke(param)
|
|
2019
|
+
});
|
|
2020
|
+
};
|
|
2021
|
+
|
|
2022
|
+
// src/agents/agent.ts
|
|
2023
|
+
var import_zod = require("zod");
|
|
2024
|
+
var import_ai2 = require("ai");
|
|
2025
|
+
var Agent = class {
|
|
2026
|
+
name;
|
|
2027
|
+
tools;
|
|
2028
|
+
maxSteps;
|
|
2029
|
+
background;
|
|
2030
|
+
model;
|
|
2031
|
+
constructor({ tools, maxSteps, background, name, model }) {
|
|
2032
|
+
this.name = name;
|
|
2033
|
+
this.tools = tools ?? {};
|
|
2034
|
+
this.maxSteps = maxSteps;
|
|
2035
|
+
this.background = background;
|
|
2036
|
+
this.model = model;
|
|
2037
|
+
}
|
|
2038
|
+
async call({ prompt }) {
|
|
2039
|
+
try {
|
|
2040
|
+
return await (0, import_ai2.generateText)({
|
|
2041
|
+
model: this.model,
|
|
2042
|
+
tools: this.tools,
|
|
2043
|
+
maxSteps: this.maxSteps,
|
|
2044
|
+
system: this.background,
|
|
2045
|
+
prompt,
|
|
2046
|
+
headers: {
|
|
2047
|
+
[AGENT_NAME_HEADER]: this.name
|
|
2048
|
+
}
|
|
2049
|
+
});
|
|
2050
|
+
} catch (error) {
|
|
2051
|
+
if (error instanceof import_ai2.ToolExecutionError) {
|
|
2052
|
+
if (error.cause instanceof Error && error.cause.name === "WorkflowAbort") {
|
|
2053
|
+
throw error.cause;
|
|
2054
|
+
} else if (error.cause instanceof import_ai2.ToolExecutionError && error.cause.cause instanceof Error && error.cause.cause.name === "WorkflowAbort") {
|
|
2055
|
+
throw error.cause.cause;
|
|
2056
|
+
} else {
|
|
2057
|
+
throw error;
|
|
2058
|
+
}
|
|
2059
|
+
} else {
|
|
2060
|
+
throw error;
|
|
2061
|
+
}
|
|
2062
|
+
}
|
|
2063
|
+
}
|
|
2064
|
+
asTool() {
|
|
2065
|
+
const toolDescriptions = Object.values(this.tools).map((tool3) => tool3.description).join("\n");
|
|
2066
|
+
return (0, import_ai2.tool)({
|
|
2067
|
+
parameters: import_zod.z.object({ prompt: import_zod.z.string() }),
|
|
2068
|
+
execute: async ({ prompt }) => {
|
|
2069
|
+
return await this.call({ prompt });
|
|
2070
|
+
},
|
|
2071
|
+
description: `An AI Agent with the following background: ${this.background}Has access to the following tools: ${toolDescriptions}`
|
|
2072
|
+
});
|
|
2073
|
+
}
|
|
2074
|
+
};
|
|
2075
|
+
var MANAGER_AGENT_PROMPT = `You are an AI agent who orchestrates other AI Agents.
|
|
2076
|
+
These other agents have tools available to them.
|
|
2077
|
+
Given a prompt, utilize these agents to address requests.
|
|
2078
|
+
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.
|
|
2079
|
+
`;
|
|
2080
|
+
var ManagerAgent = class extends Agent {
|
|
2081
|
+
agents;
|
|
2082
|
+
constructor({
|
|
2083
|
+
maxSteps,
|
|
2084
|
+
background = MANAGER_AGENT_PROMPT,
|
|
2085
|
+
agents,
|
|
2086
|
+
model,
|
|
2087
|
+
name = "manager llm"
|
|
2088
|
+
}) {
|
|
2089
|
+
super({
|
|
2090
|
+
background,
|
|
2091
|
+
maxSteps,
|
|
2092
|
+
tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool()])),
|
|
2093
|
+
name,
|
|
2094
|
+
model
|
|
2095
|
+
});
|
|
2096
|
+
this.agents = agents;
|
|
2097
|
+
}
|
|
2098
|
+
};
|
|
2099
|
+
|
|
2100
|
+
// src/agents/task.ts
|
|
2101
|
+
var Task = class {
|
|
2102
|
+
context;
|
|
2103
|
+
taskParameters;
|
|
2104
|
+
constructor({
|
|
2105
|
+
context,
|
|
2106
|
+
taskParameters
|
|
2107
|
+
}) {
|
|
2108
|
+
this.context = context;
|
|
2109
|
+
this.taskParameters = taskParameters;
|
|
2110
|
+
}
|
|
2111
|
+
async run() {
|
|
2112
|
+
const { prompt, ...otherParams } = this.taskParameters;
|
|
2113
|
+
const safePrompt = await this.context.run("Get Prompt", () => prompt);
|
|
2114
|
+
if ("agent" in otherParams) {
|
|
2115
|
+
const agent = otherParams.agent;
|
|
2116
|
+
const result = await agent.call({
|
|
2117
|
+
prompt: safePrompt
|
|
2118
|
+
});
|
|
2119
|
+
return { text: result.text };
|
|
2120
|
+
} else {
|
|
2121
|
+
const { agents, maxSteps, model, background } = otherParams;
|
|
2122
|
+
const managerAgent = new ManagerAgent({
|
|
2123
|
+
model,
|
|
2124
|
+
maxSteps,
|
|
2125
|
+
agents,
|
|
2126
|
+
name: "Manager LLM",
|
|
2127
|
+
background
|
|
2128
|
+
});
|
|
2129
|
+
const result = await managerAgent.call({ prompt: safePrompt });
|
|
2130
|
+
return { text: result.text };
|
|
2131
|
+
}
|
|
2132
|
+
}
|
|
2133
|
+
};
|
|
2134
|
+
|
|
2135
|
+
// src/agents/index.ts
|
|
2136
|
+
var WorkflowAgents = class {
|
|
2137
|
+
context;
|
|
2138
|
+
constructor({ context }) {
|
|
2139
|
+
this.context = context;
|
|
2140
|
+
}
|
|
2141
|
+
agent(params) {
|
|
2142
|
+
const wrappedTools = wrapTools({ context: this.context, tools: params.tools });
|
|
2143
|
+
return new Agent({
|
|
2144
|
+
...params,
|
|
2145
|
+
tools: wrappedTools
|
|
2146
|
+
});
|
|
2147
|
+
}
|
|
2148
|
+
task(taskParameters) {
|
|
2149
|
+
return new Task({ context: this.context, taskParameters });
|
|
2150
|
+
}
|
|
2151
|
+
openai(...params) {
|
|
2152
|
+
const openai2 = createWorkflowOpenAI(this.context);
|
|
2153
|
+
return openai2(...params);
|
|
2154
|
+
}
|
|
2155
|
+
};
|
|
2156
|
+
|
|
1897
2157
|
// src/context/context.ts
|
|
1898
2158
|
var WorkflowContext = class {
|
|
1899
2159
|
executor;
|
|
@@ -2026,7 +2286,8 @@ var WorkflowContext = class {
|
|
|
2026
2286
|
debug,
|
|
2027
2287
|
initialPayload,
|
|
2028
2288
|
env,
|
|
2029
|
-
retries
|
|
2289
|
+
retries,
|
|
2290
|
+
telemetry
|
|
2030
2291
|
}) {
|
|
2031
2292
|
this.qstashClient = qstashClient;
|
|
2032
2293
|
this.workflowRunId = workflowRunId;
|
|
@@ -2037,7 +2298,7 @@ var WorkflowContext = class {
|
|
|
2037
2298
|
this.requestPayload = initialPayload;
|
|
2038
2299
|
this.env = env ?? {};
|
|
2039
2300
|
this.retries = retries ?? DEFAULT_RETRIES;
|
|
2040
|
-
this.executor = new AutoExecutor(this, this.steps, debug);
|
|
2301
|
+
this.executor = new AutoExecutor(this, this.steps, telemetry, debug);
|
|
2041
2302
|
}
|
|
2042
2303
|
/**
|
|
2043
2304
|
* Executes a workflow step
|
|
@@ -2278,6 +2539,11 @@ var WorkflowContext = class {
|
|
|
2278
2539
|
context: this
|
|
2279
2540
|
});
|
|
2280
2541
|
}
|
|
2542
|
+
get agents() {
|
|
2543
|
+
return new WorkflowAgents({
|
|
2544
|
+
context: this
|
|
2545
|
+
});
|
|
2546
|
+
}
|
|
2281
2547
|
};
|
|
2282
2548
|
|
|
2283
2549
|
// src/logger.ts
|
|
@@ -2355,7 +2621,7 @@ function decodeBase64(base64) {
|
|
|
2355
2621
|
}
|
|
2356
2622
|
|
|
2357
2623
|
// src/serve/authorization.ts
|
|
2358
|
-
var
|
|
2624
|
+
var import_qstash8 = require("@upstash/qstash");
|
|
2359
2625
|
var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowContext {
|
|
2360
2626
|
static disabledMessage = "disabled-qstash-worklfow-run";
|
|
2361
2627
|
/**
|
|
@@ -2386,7 +2652,7 @@ var DisabledWorkflowContext = class _DisabledWorkflowContext extends WorkflowCon
|
|
|
2386
2652
|
*/
|
|
2387
2653
|
static async tryAuthentication(routeFunction, context) {
|
|
2388
2654
|
const disabledContext = new _DisabledWorkflowContext({
|
|
2389
|
-
qstashClient: new
|
|
2655
|
+
qstashClient: new import_qstash8.Client({
|
|
2390
2656
|
baseUrl: "disabled-client",
|
|
2391
2657
|
token: "disabled-client"
|
|
2392
2658
|
}),
|
|
@@ -2482,6 +2748,7 @@ var checkIfLastOneIsDuplicate = async (steps, debug) => {
|
|
|
2482
2748
|
if (step.stepId === lastStepId && step.targetStep === lastTargetStepId) {
|
|
2483
2749
|
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.`;
|
|
2484
2750
|
await debug?.log("WARN", "RESPONSE_DEFAULT", message);
|
|
2751
|
+
console.log(steps);
|
|
2485
2752
|
console.warn(message);
|
|
2486
2753
|
return true;
|
|
2487
2754
|
}
|
|
@@ -2550,7 +2817,7 @@ var parseRequest = async (requestPayload, isFirstInvocation, workflowRunId, requ
|
|
|
2550
2817
|
};
|
|
2551
2818
|
}
|
|
2552
2819
|
};
|
|
2553
|
-
var handleFailure = async (request, requestPayload, qstashClient, initialPayloadParser, routeFunction, failureFunction, debug) => {
|
|
2820
|
+
var handleFailure = async (request, requestPayload, qstashClient, initialPayloadParser, routeFunction, failureFunction, env, retries, debug) => {
|
|
2554
2821
|
if (request.headers.get(WORKFLOW_FAILURE_HEADER) !== "true") {
|
|
2555
2822
|
return ok("not-failure-callback");
|
|
2556
2823
|
}
|
|
@@ -2575,7 +2842,11 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
2575
2842
|
steps: [],
|
|
2576
2843
|
url,
|
|
2577
2844
|
failureUrl: url,
|
|
2578
|
-
debug
|
|
2845
|
+
debug,
|
|
2846
|
+
env,
|
|
2847
|
+
retries,
|
|
2848
|
+
telemetry: void 0
|
|
2849
|
+
// not going to make requests in authentication check
|
|
2579
2850
|
});
|
|
2580
2851
|
const authCheck = await DisabledWorkflowContext.tryAuthentication(
|
|
2581
2852
|
routeFunction,
|
|
@@ -2600,15 +2871,15 @@ var handleFailure = async (request, requestPayload, qstashClient, initialPayload
|
|
|
2600
2871
|
};
|
|
2601
2872
|
|
|
2602
2873
|
// src/serve/options.ts
|
|
2603
|
-
var import_qstash8 = require("@upstash/qstash");
|
|
2604
2874
|
var import_qstash9 = require("@upstash/qstash");
|
|
2875
|
+
var import_qstash10 = require("@upstash/qstash");
|
|
2605
2876
|
var processOptions = (options) => {
|
|
2606
2877
|
const environment = options?.env ?? (typeof process === "undefined" ? {} : process.env);
|
|
2607
2878
|
const receiverEnvironmentVariablesSet = Boolean(
|
|
2608
2879
|
environment.QSTASH_CURRENT_SIGNING_KEY && environment.QSTASH_NEXT_SIGNING_KEY
|
|
2609
2880
|
);
|
|
2610
2881
|
return {
|
|
2611
|
-
qstashClient: new
|
|
2882
|
+
qstashClient: new import_qstash10.Client({
|
|
2612
2883
|
baseUrl: environment.QSTASH_URL,
|
|
2613
2884
|
token: environment.QSTASH_TOKEN
|
|
2614
2885
|
}),
|
|
@@ -2642,7 +2913,7 @@ var processOptions = (options) => {
|
|
|
2642
2913
|
throw error;
|
|
2643
2914
|
}
|
|
2644
2915
|
},
|
|
2645
|
-
receiver: receiverEnvironmentVariablesSet ? new
|
|
2916
|
+
receiver: receiverEnvironmentVariablesSet ? new import_qstash9.Receiver({
|
|
2646
2917
|
currentSigningKey: environment.QSTASH_CURRENT_SIGNING_KEY,
|
|
2647
2918
|
nextSigningKey: environment.QSTASH_NEXT_SIGNING_KEY
|
|
2648
2919
|
}) : void 0,
|
|
@@ -2650,6 +2921,7 @@ var processOptions = (options) => {
|
|
|
2650
2921
|
env: environment,
|
|
2651
2922
|
retries: DEFAULT_RETRIES,
|
|
2652
2923
|
useJSONContent: false,
|
|
2924
|
+
disableTelemetry: false,
|
|
2653
2925
|
...options
|
|
2654
2926
|
};
|
|
2655
2927
|
};
|
|
@@ -2684,7 +2956,7 @@ var determineUrls = async (request, url, baseUrl, failureFunction, failureUrl, d
|
|
|
2684
2956
|
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`;
|
|
2685
2957
|
|
|
2686
2958
|
// src/serve/index.ts
|
|
2687
|
-
var serveBase = (routeFunction, options) => {
|
|
2959
|
+
var serveBase = (routeFunction, telemetry, options) => {
|
|
2688
2960
|
const {
|
|
2689
2961
|
qstashClient,
|
|
2690
2962
|
onStepFinish,
|
|
@@ -2697,8 +2969,10 @@ var serveBase = (routeFunction, options) => {
|
|
|
2697
2969
|
baseUrl,
|
|
2698
2970
|
env,
|
|
2699
2971
|
retries,
|
|
2700
|
-
useJSONContent
|
|
2972
|
+
useJSONContent,
|
|
2973
|
+
disableTelemetry
|
|
2701
2974
|
} = processOptions(options);
|
|
2975
|
+
telemetry = disableTelemetry ? void 0 : telemetry;
|
|
2702
2976
|
const debug = WorkflowLogger.getLogger(verbose);
|
|
2703
2977
|
const handler = async (request) => {
|
|
2704
2978
|
await debug?.log("INFO", "ENDPOINT_START");
|
|
@@ -2734,7 +3008,10 @@ var serveBase = (routeFunction, options) => {
|
|
|
2734
3008
|
qstashClient,
|
|
2735
3009
|
initialPayloadParser,
|
|
2736
3010
|
routeFunction,
|
|
2737
|
-
failureFunction
|
|
3011
|
+
failureFunction,
|
|
3012
|
+
env,
|
|
3013
|
+
retries,
|
|
3014
|
+
debug
|
|
2738
3015
|
);
|
|
2739
3016
|
if (failureCheck.isErr()) {
|
|
2740
3017
|
throw failureCheck.error;
|
|
@@ -2752,7 +3029,8 @@ var serveBase = (routeFunction, options) => {
|
|
|
2752
3029
|
failureUrl: workflowFailureUrl,
|
|
2753
3030
|
debug,
|
|
2754
3031
|
env,
|
|
2755
|
-
retries
|
|
3032
|
+
retries,
|
|
3033
|
+
telemetry
|
|
2756
3034
|
});
|
|
2757
3035
|
const authCheck = await DisabledWorkflowContext.tryAuthentication(
|
|
2758
3036
|
routeFunction,
|
|
@@ -2768,22 +3046,23 @@ var serveBase = (routeFunction, options) => {
|
|
|
2768
3046
|
"auth-fail"
|
|
2769
3047
|
);
|
|
2770
3048
|
}
|
|
2771
|
-
const callReturnCheck = await handleThirdPartyCallResult(
|
|
3049
|
+
const callReturnCheck = await handleThirdPartyCallResult({
|
|
2772
3050
|
request,
|
|
2773
|
-
rawInitialPayload,
|
|
2774
|
-
qstashClient,
|
|
3051
|
+
requestPayload: rawInitialPayload,
|
|
3052
|
+
client: qstashClient,
|
|
2775
3053
|
workflowUrl,
|
|
2776
|
-
workflowFailureUrl,
|
|
3054
|
+
failureUrl: workflowFailureUrl,
|
|
2777
3055
|
retries,
|
|
3056
|
+
telemetry,
|
|
2778
3057
|
debug
|
|
2779
|
-
);
|
|
3058
|
+
});
|
|
2780
3059
|
if (callReturnCheck.isErr()) {
|
|
2781
3060
|
await debug?.log("ERROR", "SUBMIT_THIRD_PARTY_RESULT", {
|
|
2782
3061
|
error: callReturnCheck.error.message
|
|
2783
3062
|
});
|
|
2784
3063
|
throw callReturnCheck.error;
|
|
2785
3064
|
} else if (callReturnCheck.value === "continue-workflow") {
|
|
2786
|
-
const result = isFirstInvocation ? await triggerFirstInvocation(workflowContext,
|
|
3065
|
+
const result = isFirstInvocation ? await triggerFirstInvocation({ workflowContext, useJSONContent, telemetry, debug }) : await triggerRouteFunction({
|
|
2787
3066
|
onStep: async () => routeFunction(workflowContext),
|
|
2788
3067
|
onCleanup: async () => {
|
|
2789
3068
|
await triggerWorkflowDelete(workflowContext, debug);
|
|
@@ -2845,7 +3124,15 @@ var serve = (routeFunction, options) => {
|
|
|
2845
3124
|
body: await readRawBody(event),
|
|
2846
3125
|
method: "POST"
|
|
2847
3126
|
});
|
|
2848
|
-
const { handler: serveHandler } = serveBase(
|
|
3127
|
+
const { handler: serveHandler } = serveBase(
|
|
3128
|
+
routeFunction,
|
|
3129
|
+
{
|
|
3130
|
+
sdk: SDK_TELEMETRY,
|
|
3131
|
+
framework: "h3",
|
|
3132
|
+
runtime: process.versions.bun ? `bun@${process.versions.bun}/node@${process.version}` : `node@${process.version}`
|
|
3133
|
+
},
|
|
3134
|
+
options
|
|
3135
|
+
);
|
|
2849
3136
|
return await serveHandler(request);
|
|
2850
3137
|
});
|
|
2851
3138
|
return { handler };
|