@upstash/workflow 0.2.5-agent-1 → 0.2.5-agents-2

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/hono.js CHANGED
@@ -826,29 +826,16 @@ var triggerWorkflowDelete = async (workflowContext, debug, cancel = false) => {
826
826
  await debug?.log("SUBMIT", "SUBMIT_CLEANUP", {
827
827
  deletedWorkflowRunId: workflowContext.workflowRunId
828
828
  });
829
- try {
830
- await workflowContext.qstashClient.http.request({
831
- path: ["v2", "workflows", "runs", `${workflowContext.workflowRunId}?cancel=${cancel}`],
832
- method: "DELETE",
833
- parseResponseAsJson: false
834
- });
835
- await debug?.log(
836
- "SUBMIT",
837
- "SUBMIT_CLEANUP",
838
- `workflow run ${workflowContext.workflowRunId} deleted.`
839
- );
840
- return { deleted: true };
841
- } catch (error) {
842
- if (error instanceof import_qstash3.QstashError && error.status === 404) {
843
- await debug?.log("WARN", "SUBMIT_CLEANUP", {
844
- message: `Failed to remove workflow run ${workflowContext.workflowRunId} as it doesn't exist.`,
845
- name: error.name,
846
- errorMessage: error.message
847
- });
848
- return { deleted: false };
849
- }
850
- throw error;
851
- }
829
+ await workflowContext.qstashClient.http.request({
830
+ path: ["v2", "workflows", "runs", `${workflowContext.workflowRunId}?cancel=${cancel}`],
831
+ method: "DELETE",
832
+ parseResponseAsJson: false
833
+ });
834
+ await debug?.log(
835
+ "SUBMIT",
836
+ "SUBMIT_CLEANUP",
837
+ `workflow run ${workflowContext.workflowRunId} deleted.`
838
+ );
852
839
  };
853
840
  var recreateUserHeaders = (headers) => {
854
841
  const filteredHeaders = new Headers();
@@ -1632,6 +1619,283 @@ var WorkflowApi = class extends BaseWorkflowApi {
1632
1619
  }
1633
1620
  };
1634
1621
 
1622
+ // src/agents/adapters.ts
1623
+ var import_openai2 = require("@ai-sdk/openai");
1624
+ var import_ai = require("ai");
1625
+
1626
+ // src/agents/constants.ts
1627
+ var AGENT_NAME_HEADER = "upstash-agent-name";
1628
+ var MANAGER_AGENT_PROMPT = `You are an agent orchestrating other AI Agents.
1629
+
1630
+ These other agents have tools available to them.
1631
+
1632
+ Given a prompt, utilize these agents to address requests.
1633
+
1634
+ 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.
1635
+
1636
+ Avoid calling the same agent twice in one turn. Instead, prefer to call it once but provide everything
1637
+ you need from that agent.
1638
+ `;
1639
+
1640
+ // src/agents/adapters.ts
1641
+ var createWorkflowOpenAI = (context) => {
1642
+ return (0, import_openai2.createOpenAI)({
1643
+ compatibility: "strict",
1644
+ fetch: async (input, init) => {
1645
+ try {
1646
+ const headers = init?.headers ? Object.fromEntries(new Headers(init.headers).entries()) : {};
1647
+ const body = init?.body ? JSON.parse(init.body) : void 0;
1648
+ const agentName = headers[AGENT_NAME_HEADER];
1649
+ const stepName = agentName ? `Call Agent ${agentName}` : "Call Agent";
1650
+ const responseInfo = await context.call(stepName, {
1651
+ url: input.toString(),
1652
+ method: init?.method,
1653
+ headers,
1654
+ body
1655
+ });
1656
+ const responseHeaders = new Headers(
1657
+ Object.entries(responseInfo.header).reduce(
1658
+ (acc, [key, values]) => {
1659
+ acc[key] = values.join(", ");
1660
+ return acc;
1661
+ },
1662
+ {}
1663
+ )
1664
+ );
1665
+ return new Response(JSON.stringify(responseInfo.body), {
1666
+ status: responseInfo.status,
1667
+ headers: responseHeaders
1668
+ });
1669
+ } catch (error) {
1670
+ if (error instanceof Error && error.name === "WorkflowAbort") {
1671
+ throw error;
1672
+ } else {
1673
+ console.error("Error in fetch implementation:", error);
1674
+ throw error;
1675
+ }
1676
+ }
1677
+ }
1678
+ });
1679
+ };
1680
+ var wrapTools = ({
1681
+ context,
1682
+ tools
1683
+ }) => {
1684
+ return Object.fromEntries(
1685
+ Object.entries(tools).map((toolInfo) => {
1686
+ const [toolName, tool3] = toolInfo;
1687
+ const aiSDKTool = convertToAISDKTool(tool3);
1688
+ const execute = aiSDKTool.execute;
1689
+ if (execute) {
1690
+ const wrappedExecute = (...params) => {
1691
+ return context.run(`Run tool ${toolName}`, () => execute(...params));
1692
+ };
1693
+ aiSDKTool.execute = wrappedExecute;
1694
+ }
1695
+ return [toolName, aiSDKTool];
1696
+ })
1697
+ );
1698
+ };
1699
+ var convertToAISDKTool = (tool3) => {
1700
+ const isLangchainTool = "invoke" in tool3;
1701
+ return isLangchainTool ? convertLangchainTool(tool3) : tool3;
1702
+ };
1703
+ var convertLangchainTool = (langchainTool) => {
1704
+ return (0, import_ai.tool)({
1705
+ description: langchainTool.description,
1706
+ parameters: langchainTool.schema,
1707
+ execute: async (...param) => langchainTool.invoke(...param)
1708
+ });
1709
+ };
1710
+
1711
+ // src/agents/agent.ts
1712
+ var import_zod = require("zod");
1713
+ var import_ai2 = require("ai");
1714
+ var Agent = class {
1715
+ name;
1716
+ tools;
1717
+ maxSteps;
1718
+ background;
1719
+ model;
1720
+ temparature;
1721
+ constructor({ tools, maxSteps, background, name, model, temparature = 0.1 }) {
1722
+ this.name = name;
1723
+ this.tools = tools ?? {};
1724
+ this.maxSteps = maxSteps;
1725
+ this.background = background;
1726
+ this.model = model;
1727
+ this.temparature = temparature;
1728
+ }
1729
+ /**
1730
+ * Trigger the agent by passing a prompt
1731
+ *
1732
+ * @param prompt task to assign to the agent
1733
+ * @returns Response as `{ text: string }`
1734
+ */
1735
+ async call({ prompt }) {
1736
+ try {
1737
+ const result = await (0, import_ai2.generateText)({
1738
+ model: this.model,
1739
+ tools: this.tools,
1740
+ maxSteps: this.maxSteps,
1741
+ system: this.background,
1742
+ prompt,
1743
+ headers: {
1744
+ [AGENT_NAME_HEADER]: this.name
1745
+ },
1746
+ temperature: this.temparature
1747
+ });
1748
+ return { text: result.text };
1749
+ } catch (error) {
1750
+ if (error instanceof import_ai2.ToolExecutionError) {
1751
+ if (error.cause instanceof Error && error.cause.name === "WorkflowAbort") {
1752
+ throw error.cause;
1753
+ } else if (error.cause instanceof import_ai2.ToolExecutionError && error.cause.cause instanceof Error && error.cause.cause.name === "WorkflowAbort") {
1754
+ throw error.cause.cause;
1755
+ } else {
1756
+ throw error;
1757
+ }
1758
+ } else {
1759
+ throw error;
1760
+ }
1761
+ }
1762
+ }
1763
+ /**
1764
+ * Convert the agent to a tool which can be used by other agents.
1765
+ *
1766
+ * @returns the agent as a tool
1767
+ */
1768
+ asTool() {
1769
+ const toolDescriptions = Object.values(this.tools).map((tool3) => tool3.description).join("\n");
1770
+ return (0, import_ai2.tool)({
1771
+ parameters: import_zod.z.object({ prompt: import_zod.z.string() }),
1772
+ execute: async ({ prompt }) => {
1773
+ return await this.call({ prompt });
1774
+ },
1775
+ description: `An AI Agent with the following background: ${this.background}Has access to the following tools: ${toolDescriptions}`
1776
+ });
1777
+ }
1778
+ };
1779
+ var ManagerAgent = class extends Agent {
1780
+ agents;
1781
+ /**
1782
+ * A manager agent which coordinates agents available to it to achieve a
1783
+ * given task
1784
+ *
1785
+ * @param name Name of the agent
1786
+ * @param background Background of the agent. If not passed, default will be used.
1787
+ * @param model LLM model to use
1788
+ * @param agents: List of agents available to the agent
1789
+ * @param maxSteps number of times the manager agent can call the LLM at most.
1790
+ * If the agent abruptly stops execution after calling other agents, you may
1791
+ * need to increase maxSteps
1792
+ */
1793
+ constructor({
1794
+ agents,
1795
+ background = MANAGER_AGENT_PROMPT,
1796
+ model,
1797
+ maxSteps,
1798
+ name = "manager llm"
1799
+ }) {
1800
+ super({
1801
+ background,
1802
+ maxSteps,
1803
+ tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool()])),
1804
+ name,
1805
+ model
1806
+ });
1807
+ this.agents = agents;
1808
+ }
1809
+ };
1810
+
1811
+ // src/agents/task.ts
1812
+ var Task = class {
1813
+ context;
1814
+ taskParameters;
1815
+ constructor({
1816
+ context,
1817
+ taskParameters
1818
+ }) {
1819
+ this.context = context;
1820
+ this.taskParameters = taskParameters;
1821
+ }
1822
+ /**
1823
+ * Run the agents to complete the task
1824
+ *
1825
+ * @returns Result of the task as { text: string }
1826
+ */
1827
+ async run() {
1828
+ const { prompt, ...otherParams } = this.taskParameters;
1829
+ const safePrompt = await this.context.run("Get Prompt", () => prompt);
1830
+ if ("agent" in otherParams) {
1831
+ const agent = otherParams.agent;
1832
+ const result = await agent.call({
1833
+ prompt: safePrompt
1834
+ });
1835
+ return { text: result.text };
1836
+ } else {
1837
+ const { agents, maxSteps, model, background } = otherParams;
1838
+ const managerAgent = new ManagerAgent({
1839
+ model,
1840
+ maxSteps,
1841
+ agents,
1842
+ name: "Manager LLM",
1843
+ background
1844
+ });
1845
+ const result = await managerAgent.call({ prompt: safePrompt });
1846
+ return { text: result.text };
1847
+ }
1848
+ }
1849
+ };
1850
+
1851
+ // src/agents/index.ts
1852
+ var WorkflowAgents = class {
1853
+ context;
1854
+ constructor({ context }) {
1855
+ this.context = context;
1856
+ }
1857
+ /**
1858
+ * Defines an agent
1859
+ *
1860
+ * ```ts
1861
+ * const researcherAgent = context.agents.agent({
1862
+ * model,
1863
+ * name: 'academic',
1864
+ * maxSteps: 2,
1865
+ * tools: {
1866
+ * wikiTool: new WikipediaQueryRun({
1867
+ * topKResults: 1,
1868
+ * maxDocContentLength: 500,
1869
+ * })
1870
+ * },
1871
+ * background:
1872
+ * 'You are researcher agent with access to Wikipedia. ' +
1873
+ * 'Utilize Wikipedia as much as possible for correct information',
1874
+ * });
1875
+ * ```
1876
+ *
1877
+ * @param params agent parameters
1878
+ * @returns
1879
+ */
1880
+ agent(params) {
1881
+ const wrappedTools = wrapTools({ context: this.context, tools: params.tools });
1882
+ return new Agent({
1883
+ ...params,
1884
+ tools: wrappedTools
1885
+ });
1886
+ }
1887
+ task(taskParameters) {
1888
+ return new Task({ context: this.context, taskParameters });
1889
+ }
1890
+ /**
1891
+ * creates an openai model for agents
1892
+ */
1893
+ openai(...params) {
1894
+ const openai2 = createWorkflowOpenAI(this.context);
1895
+ return openai2(...params);
1896
+ }
1897
+ };
1898
+
1635
1899
  // src/context/context.ts
1636
1900
  var WorkflowContext = class {
1637
1901
  executor;
@@ -2017,6 +2281,11 @@ var WorkflowContext = class {
2017
2281
  context: this
2018
2282
  });
2019
2283
  }
2284
+ get agents() {
2285
+ return new WorkflowAgents({
2286
+ context: this
2287
+ });
2288
+ }
2020
2289
  };
2021
2290
 
2022
2291
  // src/logger.ts
package/hono.mjs CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  SDK_TELEMETRY,
3
3
  serveBase
4
- } from "./chunk-ETDFMXER.mjs";
4
+ } from "./chunk-VOM3CFYZ.mjs";
5
5
 
6
6
  // platforms/hono.ts
7
7
  var serve = (routeFunction, options) => {
package/index.d.mts CHANGED
@@ -1,6 +1,8 @@
1
- import { R as RouteFunction, W as WorkflowServeOptions, N as NotifyResponse, a as Waiter, S as Step } from './types-Bt4-paRy.mjs';
2
- export { A as AsyncStepFunction, C as CallResponse, q as CallSettings, D as Duration, k as FailureFunctionPayload, F as FinishCondition, H as HeaderParams, L as LogLevel, o as NotifyStepResponse, P as ParallelCallState, j as PublicServeOptions, g as RawStep, l as RequiredExceptFields, i as StepFunction, f as StepType, e as StepTypes, h as SyncStepFunction, T as Telemetry, p as WaitEventOptions, m as WaitRequest, n as WaitStepResponse, c as WorkflowClient, b as WorkflowContext, s as WorkflowLogger, r as WorkflowLoggerOptions, d as WorkflowReceiver } from './types-Bt4-paRy.mjs';
1
+ import { R as RouteFunction, W as WorkflowServeOptions, N as NotifyResponse, a as Waiter, S as Step } from './types-D9gwTj2n.mjs';
2
+ export { A as AsyncStepFunction, C as CallResponse, q as CallSettings, D as Duration, k as FailureFunctionPayload, F as FinishCondition, H as HeaderParams, L as LogLevel, o as NotifyStepResponse, P as ParallelCallState, j as PublicServeOptions, g as RawStep, l as RequiredExceptFields, i as StepFunction, f as StepType, e as StepTypes, h as SyncStepFunction, T as Telemetry, p as WaitEventOptions, m as WaitRequest, n as WaitStepResponse, c as WorkflowClient, b as WorkflowContext, s as WorkflowLogger, r as WorkflowLoggerOptions, d as WorkflowReceiver } from './types-D9gwTj2n.mjs';
3
3
  import { Client as Client$1, QstashError } from '@upstash/qstash';
4
+ import 'ai';
5
+ import '@ai-sdk/openai';
4
6
 
5
7
  /**
6
8
  * Creates an async method that handles incoming requests and runs the provided
package/index.d.ts CHANGED
@@ -1,6 +1,8 @@
1
- import { R as RouteFunction, W as WorkflowServeOptions, N as NotifyResponse, a as Waiter, S as Step } from './types-Bt4-paRy.js';
2
- export { A as AsyncStepFunction, C as CallResponse, q as CallSettings, D as Duration, k as FailureFunctionPayload, F as FinishCondition, H as HeaderParams, L as LogLevel, o as NotifyStepResponse, P as ParallelCallState, j as PublicServeOptions, g as RawStep, l as RequiredExceptFields, i as StepFunction, f as StepType, e as StepTypes, h as SyncStepFunction, T as Telemetry, p as WaitEventOptions, m as WaitRequest, n as WaitStepResponse, c as WorkflowClient, b as WorkflowContext, s as WorkflowLogger, r as WorkflowLoggerOptions, d as WorkflowReceiver } from './types-Bt4-paRy.js';
1
+ import { R as RouteFunction, W as WorkflowServeOptions, N as NotifyResponse, a as Waiter, S as Step } from './types-D9gwTj2n.js';
2
+ export { A as AsyncStepFunction, C as CallResponse, q as CallSettings, D as Duration, k as FailureFunctionPayload, F as FinishCondition, H as HeaderParams, L as LogLevel, o as NotifyStepResponse, P as ParallelCallState, j as PublicServeOptions, g as RawStep, l as RequiredExceptFields, i as StepFunction, f as StepType, e as StepTypes, h as SyncStepFunction, T as Telemetry, p as WaitEventOptions, m as WaitRequest, n as WaitStepResponse, c as WorkflowClient, b as WorkflowContext, s as WorkflowLogger, r as WorkflowLoggerOptions, d as WorkflowReceiver } from './types-D9gwTj2n.js';
3
3
  import { Client as Client$1, QstashError } from '@upstash/qstash';
4
+ import 'ai';
5
+ import '@ai-sdk/openai';
4
6
 
5
7
  /**
6
8
  * Creates an async method that handles incoming requests and runs the provided
package/index.js CHANGED
@@ -839,29 +839,16 @@ var triggerWorkflowDelete = async (workflowContext, debug, cancel = false) => {
839
839
  await debug?.log("SUBMIT", "SUBMIT_CLEANUP", {
840
840
  deletedWorkflowRunId: workflowContext.workflowRunId
841
841
  });
842
- try {
843
- await workflowContext.qstashClient.http.request({
844
- path: ["v2", "workflows", "runs", `${workflowContext.workflowRunId}?cancel=${cancel}`],
845
- method: "DELETE",
846
- parseResponseAsJson: false
847
- });
848
- await debug?.log(
849
- "SUBMIT",
850
- "SUBMIT_CLEANUP",
851
- `workflow run ${workflowContext.workflowRunId} deleted.`
852
- );
853
- return { deleted: true };
854
- } catch (error) {
855
- if (error instanceof import_qstash3.QstashError && error.status === 404) {
856
- await debug?.log("WARN", "SUBMIT_CLEANUP", {
857
- message: `Failed to remove workflow run ${workflowContext.workflowRunId} as it doesn't exist.`,
858
- name: error.name,
859
- errorMessage: error.message
860
- });
861
- return { deleted: false };
862
- }
863
- throw error;
864
- }
842
+ await workflowContext.qstashClient.http.request({
843
+ path: ["v2", "workflows", "runs", `${workflowContext.workflowRunId}?cancel=${cancel}`],
844
+ method: "DELETE",
845
+ parseResponseAsJson: false
846
+ });
847
+ await debug?.log(
848
+ "SUBMIT",
849
+ "SUBMIT_CLEANUP",
850
+ `workflow run ${workflowContext.workflowRunId} deleted.`
851
+ );
865
852
  };
866
853
  var recreateUserHeaders = (headers) => {
867
854
  const filteredHeaders = new Headers();
@@ -1645,6 +1632,283 @@ var WorkflowApi = class extends BaseWorkflowApi {
1645
1632
  }
1646
1633
  };
1647
1634
 
1635
+ // src/agents/adapters.ts
1636
+ var import_openai2 = require("@ai-sdk/openai");
1637
+ var import_ai = require("ai");
1638
+
1639
+ // src/agents/constants.ts
1640
+ var AGENT_NAME_HEADER = "upstash-agent-name";
1641
+ var MANAGER_AGENT_PROMPT = `You are an agent orchestrating other AI Agents.
1642
+
1643
+ These other agents have tools available to them.
1644
+
1645
+ Given a prompt, utilize these agents to address requests.
1646
+
1647
+ 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.
1648
+
1649
+ Avoid calling the same agent twice in one turn. Instead, prefer to call it once but provide everything
1650
+ you need from that agent.
1651
+ `;
1652
+
1653
+ // src/agents/adapters.ts
1654
+ var createWorkflowOpenAI = (context) => {
1655
+ return (0, import_openai2.createOpenAI)({
1656
+ compatibility: "strict",
1657
+ fetch: async (input, init) => {
1658
+ try {
1659
+ const headers = init?.headers ? Object.fromEntries(new Headers(init.headers).entries()) : {};
1660
+ const body = init?.body ? JSON.parse(init.body) : void 0;
1661
+ const agentName = headers[AGENT_NAME_HEADER];
1662
+ const stepName = agentName ? `Call Agent ${agentName}` : "Call Agent";
1663
+ const responseInfo = await context.call(stepName, {
1664
+ url: input.toString(),
1665
+ method: init?.method,
1666
+ headers,
1667
+ body
1668
+ });
1669
+ const responseHeaders = new Headers(
1670
+ Object.entries(responseInfo.header).reduce(
1671
+ (acc, [key, values]) => {
1672
+ acc[key] = values.join(", ");
1673
+ return acc;
1674
+ },
1675
+ {}
1676
+ )
1677
+ );
1678
+ return new Response(JSON.stringify(responseInfo.body), {
1679
+ status: responseInfo.status,
1680
+ headers: responseHeaders
1681
+ });
1682
+ } catch (error) {
1683
+ if (error instanceof Error && error.name === "WorkflowAbort") {
1684
+ throw error;
1685
+ } else {
1686
+ console.error("Error in fetch implementation:", error);
1687
+ throw error;
1688
+ }
1689
+ }
1690
+ }
1691
+ });
1692
+ };
1693
+ var wrapTools = ({
1694
+ context,
1695
+ tools
1696
+ }) => {
1697
+ return Object.fromEntries(
1698
+ Object.entries(tools).map((toolInfo) => {
1699
+ const [toolName, tool3] = toolInfo;
1700
+ const aiSDKTool = convertToAISDKTool(tool3);
1701
+ const execute = aiSDKTool.execute;
1702
+ if (execute) {
1703
+ const wrappedExecute = (...params) => {
1704
+ return context.run(`Run tool ${toolName}`, () => execute(...params));
1705
+ };
1706
+ aiSDKTool.execute = wrappedExecute;
1707
+ }
1708
+ return [toolName, aiSDKTool];
1709
+ })
1710
+ );
1711
+ };
1712
+ var convertToAISDKTool = (tool3) => {
1713
+ const isLangchainTool = "invoke" in tool3;
1714
+ return isLangchainTool ? convertLangchainTool(tool3) : tool3;
1715
+ };
1716
+ var convertLangchainTool = (langchainTool) => {
1717
+ return (0, import_ai.tool)({
1718
+ description: langchainTool.description,
1719
+ parameters: langchainTool.schema,
1720
+ execute: async (...param) => langchainTool.invoke(...param)
1721
+ });
1722
+ };
1723
+
1724
+ // src/agents/agent.ts
1725
+ var import_zod = require("zod");
1726
+ var import_ai2 = require("ai");
1727
+ var Agent = class {
1728
+ name;
1729
+ tools;
1730
+ maxSteps;
1731
+ background;
1732
+ model;
1733
+ temparature;
1734
+ constructor({ tools, maxSteps, background, name, model, temparature = 0.1 }) {
1735
+ this.name = name;
1736
+ this.tools = tools ?? {};
1737
+ this.maxSteps = maxSteps;
1738
+ this.background = background;
1739
+ this.model = model;
1740
+ this.temparature = temparature;
1741
+ }
1742
+ /**
1743
+ * Trigger the agent by passing a prompt
1744
+ *
1745
+ * @param prompt task to assign to the agent
1746
+ * @returns Response as `{ text: string }`
1747
+ */
1748
+ async call({ prompt }) {
1749
+ try {
1750
+ const result = await (0, import_ai2.generateText)({
1751
+ model: this.model,
1752
+ tools: this.tools,
1753
+ maxSteps: this.maxSteps,
1754
+ system: this.background,
1755
+ prompt,
1756
+ headers: {
1757
+ [AGENT_NAME_HEADER]: this.name
1758
+ },
1759
+ temperature: this.temparature
1760
+ });
1761
+ return { text: result.text };
1762
+ } catch (error) {
1763
+ if (error instanceof import_ai2.ToolExecutionError) {
1764
+ if (error.cause instanceof Error && error.cause.name === "WorkflowAbort") {
1765
+ throw error.cause;
1766
+ } else if (error.cause instanceof import_ai2.ToolExecutionError && error.cause.cause instanceof Error && error.cause.cause.name === "WorkflowAbort") {
1767
+ throw error.cause.cause;
1768
+ } else {
1769
+ throw error;
1770
+ }
1771
+ } else {
1772
+ throw error;
1773
+ }
1774
+ }
1775
+ }
1776
+ /**
1777
+ * Convert the agent to a tool which can be used by other agents.
1778
+ *
1779
+ * @returns the agent as a tool
1780
+ */
1781
+ asTool() {
1782
+ const toolDescriptions = Object.values(this.tools).map((tool3) => tool3.description).join("\n");
1783
+ return (0, import_ai2.tool)({
1784
+ parameters: import_zod.z.object({ prompt: import_zod.z.string() }),
1785
+ execute: async ({ prompt }) => {
1786
+ return await this.call({ prompt });
1787
+ },
1788
+ description: `An AI Agent with the following background: ${this.background}Has access to the following tools: ${toolDescriptions}`
1789
+ });
1790
+ }
1791
+ };
1792
+ var ManagerAgent = class extends Agent {
1793
+ agents;
1794
+ /**
1795
+ * A manager agent which coordinates agents available to it to achieve a
1796
+ * given task
1797
+ *
1798
+ * @param name Name of the agent
1799
+ * @param background Background of the agent. If not passed, default will be used.
1800
+ * @param model LLM model to use
1801
+ * @param agents: List of agents available to the agent
1802
+ * @param maxSteps number of times the manager agent can call the LLM at most.
1803
+ * If the agent abruptly stops execution after calling other agents, you may
1804
+ * need to increase maxSteps
1805
+ */
1806
+ constructor({
1807
+ agents,
1808
+ background = MANAGER_AGENT_PROMPT,
1809
+ model,
1810
+ maxSteps,
1811
+ name = "manager llm"
1812
+ }) {
1813
+ super({
1814
+ background,
1815
+ maxSteps,
1816
+ tools: Object.fromEntries(agents.map((agent) => [agent.name, agent.asTool()])),
1817
+ name,
1818
+ model
1819
+ });
1820
+ this.agents = agents;
1821
+ }
1822
+ };
1823
+
1824
+ // src/agents/task.ts
1825
+ var Task = class {
1826
+ context;
1827
+ taskParameters;
1828
+ constructor({
1829
+ context,
1830
+ taskParameters
1831
+ }) {
1832
+ this.context = context;
1833
+ this.taskParameters = taskParameters;
1834
+ }
1835
+ /**
1836
+ * Run the agents to complete the task
1837
+ *
1838
+ * @returns Result of the task as { text: string }
1839
+ */
1840
+ async run() {
1841
+ const { prompt, ...otherParams } = this.taskParameters;
1842
+ const safePrompt = await this.context.run("Get Prompt", () => prompt);
1843
+ if ("agent" in otherParams) {
1844
+ const agent = otherParams.agent;
1845
+ const result = await agent.call({
1846
+ prompt: safePrompt
1847
+ });
1848
+ return { text: result.text };
1849
+ } else {
1850
+ const { agents, maxSteps, model, background } = otherParams;
1851
+ const managerAgent = new ManagerAgent({
1852
+ model,
1853
+ maxSteps,
1854
+ agents,
1855
+ name: "Manager LLM",
1856
+ background
1857
+ });
1858
+ const result = await managerAgent.call({ prompt: safePrompt });
1859
+ return { text: result.text };
1860
+ }
1861
+ }
1862
+ };
1863
+
1864
+ // src/agents/index.ts
1865
+ var WorkflowAgents = class {
1866
+ context;
1867
+ constructor({ context }) {
1868
+ this.context = context;
1869
+ }
1870
+ /**
1871
+ * Defines an agent
1872
+ *
1873
+ * ```ts
1874
+ * const researcherAgent = context.agents.agent({
1875
+ * model,
1876
+ * name: 'academic',
1877
+ * maxSteps: 2,
1878
+ * tools: {
1879
+ * wikiTool: new WikipediaQueryRun({
1880
+ * topKResults: 1,
1881
+ * maxDocContentLength: 500,
1882
+ * })
1883
+ * },
1884
+ * background:
1885
+ * 'You are researcher agent with access to Wikipedia. ' +
1886
+ * 'Utilize Wikipedia as much as possible for correct information',
1887
+ * });
1888
+ * ```
1889
+ *
1890
+ * @param params agent parameters
1891
+ * @returns
1892
+ */
1893
+ agent(params) {
1894
+ const wrappedTools = wrapTools({ context: this.context, tools: params.tools });
1895
+ return new Agent({
1896
+ ...params,
1897
+ tools: wrappedTools
1898
+ });
1899
+ }
1900
+ task(taskParameters) {
1901
+ return new Task({ context: this.context, taskParameters });
1902
+ }
1903
+ /**
1904
+ * creates an openai model for agents
1905
+ */
1906
+ openai(...params) {
1907
+ const openai2 = createWorkflowOpenAI(this.context);
1908
+ return openai2(...params);
1909
+ }
1910
+ };
1911
+
1648
1912
  // src/context/context.ts
1649
1913
  var WorkflowContext = class {
1650
1914
  executor;
@@ -2030,6 +2294,11 @@ var WorkflowContext = class {
2030
2294
  context: this
2031
2295
  });
2032
2296
  }
2297
+ get agents() {
2298
+ return new WorkflowAgents({
2299
+ context: this
2300
+ });
2301
+ }
2033
2302
  };
2034
2303
 
2035
2304
  // src/logger.ts