UNPKG

@mintplex-labs/openai-assistant-swarm

Version:

A simple library the extends the OpenAI NodeJS SDK so you can automatically delegate any task to any assistants you create in OpenAi through one united interface and manager. Now you can delegate work to a swarm of assistant all specialized with specific

1 lines 44 kB
{"version":3,"sources":["../src/manager/index.ts","../src/utils/index.ts","../src/manager/child.ts","../src/utils/toolCalls.ts","../src/index.ts"],"sourcesContent":["import EventEmitter from \"events\";\nimport OpenAI from \"openai\";\nimport { Assistant } from \"openai/resources/beta/assistants/assistants\";\nimport {\n Run,\n RunCreateParams,\n RunSubmitToolOutputsParams,\n} from \"openai/resources/beta/threads/runs/runs\";\nimport {\n ManagerOptions,\n DelegatedToolCall,\n DelegationResponse,\n DelegateRun,\n EventTypes,\n ParentResponseEvent,\n SubRunResponseEvent,\n PollEvent,\n RunSubmitToolTempOutput,\n} from \"../utils/types\";\nimport {\n DEFAULT_OPTS,\n _allAssistants,\n _getAssistants,\n deDupeToolOutputs,\n messageHistoryForThread,\n pollRun,\n runMessage,\n toolsFromAssistants,\n} from \"../utils\";\nimport SwarmAssistant from \"./child\";\nimport { compressToolCalls } from \"../utils/toolCalls\";\n\nexport default class SwarmManager {\n public emitter: EventEmitter;\n public client: OpenAI;\n public knownAssistantIds?: string[];\n public assistants: OpenAI[\"beta\"][\"assistants\"];\n public log: (_: any) => void;\n public logGroup: (_: any, __?: any) => void;\n\n private ready: boolean;\n private _mgrBotName: string;\n private mgrAssistant?: Assistant;\n private options: ManagerOptions;\n\n constructor(client: OpenAI, options?: ManagerOptions) {\n this.emitter = new EventEmitter();\n this.ready = false;\n this.mgrAssistant;\n this.knownAssistantIds = [];\n this.client = client;\n this.assistants = client.beta.assistants;\n this.options = options ?? DEFAULT_OPTS;\n this._mgrBotName =\n this.options.managerAssistantOptions?.name ||\n DEFAULT_OPTS.managerAssistantOptions.name;\n\n this.log = options?.debug\n ? (arg: any) => {\n console.log(`\\x1b[44mDBG: Assistant-Swarm\\x1b[0m`, arg);\n }\n : (_: any) => null;\n this.logGroup = options?.debug\n ? (title: string | null, end?: boolean) => {\n if (end) {\n console.groupEnd();\n return;\n }\n console.group(title);\n }\n : (_: any, __?: any) => null;\n }\n\n private isReady(): boolean {\n if (!this.ready)\n throw new Error(`SwarmManager requires .init() to be called before use.`);\n return true;\n }\n\n private async findOrUpsertManager(): Promise<boolean> {\n const assistants = await _allAssistants(this.assistants, this.log);\n const mgrAssistant = assistants.find((a) => a.name === this._mgrBotName);\n const availableAssistants = assistants.filter(\n (a) => a.name !== this._mgrBotName,\n );\n const newOpts = {\n name:\n this.options.managerAssistantOptions?.name ||\n DEFAULT_OPTS.managerAssistantOptions.name,\n model:\n this.options.managerAssistantOptions?.model ||\n DEFAULT_OPTS.managerAssistantOptions.model,\n instructions:\n this.options.managerAssistantOptions?.instructions ||\n `You are a manager of assistants that all perform various functions. Your job is to select the best or top assistants under your direction to complete a job. If you do not have the assistant or ability to fulfill the required request by the user respond with the agent_id of '<none>'. If you respond with the agent_id of '<none>' tell the user that you are sorry and cannot process their request as the required assistant to do so is not available currently. It is very important that you get this right and always have the end user satisfied with your choice of assistant calls and end result. Each time you delegate you should reword the task to the assistant in terms and actions that is specific to that assistant's details and role. You will NEVER directly respond to the user input and will instead acknowledge their needs and announce that you will relay this request to another assistant if not <none>, who can best handle their needs.`,\n tools: toolsFromAssistants(availableAssistants),\n };\n\n if (!!mgrAssistant) {\n this.log(\n \"Primary Swarm Manager already exists - upserting new options...\",\n );\n const updatedMgr = await this.assistants.update(mgrAssistant.id, newOpts);\n this.mgrAssistant = updatedMgr;\n this.knownAssistantIds = availableAssistants.map((a) => a.id);\n return !!mgrAssistant;\n }\n\n const newAssistant = await this.assistants.create(newOpts);\n this.log(\"New Primary Swarm Manager was created!\");\n this.mgrAssistant = newAssistant;\n this.knownAssistantIds = availableAssistants.map((a) => a.id);\n return !!newAssistant;\n }\n\n private async delegateTaskToChildren(primaryRun: Run): Promise<{\n concludedPrimaryRun: ParentResponseEvent[\"data\"][\"parentRun\"];\n subRuns: DelegateRun[];\n }> {\n // If primary run does not require any action at all - return the primary run.\n if (primaryRun.status !== \"requires_action\") {\n const textResponse = await runMessage(this.client, this.log, primaryRun);\n\n this.emitEvent(\"poll_event\", {\n data: {\n status: \"parent_run_concluded\",\n textResponse,\n playground: this.playgroundLink(primaryRun),\n run: primaryRun,\n },\n });\n this.emitEvent(\"parent_assistant_complete\", {\n data: {\n parentRun: {\n ...primaryRun,\n playground: this.playgroundLink(primaryRun),\n textResponse,\n },\n },\n });\n this.emitEvent(\"child_assistants_complete\", { data: { subRuns: [] } });\n this.emitEvent(\"poll_event\", { data: { status: \"DONE\" } });\n\n return {\n concludedPrimaryRun: {\n ...primaryRun,\n playground: this.playgroundLink(primaryRun),\n textResponse,\n },\n subRuns: [],\n };\n }\n\n const toolCalls: DelegatedToolCall[] = compressToolCalls(this, primaryRun);\n const uniqueAgents = new Set();\n const toolOutputs: RunSubmitToolTempOutput[] = [];\n const subRunRequests: (() => Promise<DelegateRun>)[] = [];\n const messageHistory = await messageHistoryForThread(\n this.client,\n this.log,\n primaryRun.thread_id,\n );\n\n for (const toolCall of toolCalls) {\n if (toolCall.agentId === \"<none>\") {\n toolOutputs.push({\n tool_call_id: toolCall.id,\n output: [\n {\n originatingToolCallId: toolCall.id,\n delegatedTo: \"nobody\",\n viaFunc: toolCall.function,\n },\n ],\n });\n continue;\n }\n\n uniqueAgents.add(toolCall.agentId);\n toolOutputs.push({\n tool_call_id: toolCall.id,\n output: [\n {\n originatingToolCallId: toolCall.id,\n delegatedTo: toolCall.agentId,\n viaFunc: toolCall.function,\n },\n ],\n });\n\n subRunRequests.push(() => {\n return new Promise(async (resolve) => {\n try {\n const swarmAssistant = new SwarmAssistant(this);\n await swarmAssistant\n .runDelegatedTask(primaryRun, toolCall, messageHistory)\n .then((runInfo) => {\n resolve(runInfo as DelegateRun);\n })\n .catch((e: any) => {\n this.log(e);\n resolve({\n status: \"failed\",\n parentRun: primaryRun,\n parentToolCallId: toolCall.id,\n abortReason: e.message,\n playground: null,\n textResponse: null,\n assistant: null,\n thread: null,\n run: null,\n } as DelegateRun);\n });\n } catch (e: any) {\n this.log(e);\n resolve({\n status: \"failed\",\n parentRun: primaryRun,\n parentToolCallId: toolCall.id,\n abortReason: e.message,\n playground: null,\n textResponse: null,\n assistant: null,\n thread: null,\n run: null,\n } as DelegateRun);\n }\n });\n });\n }\n\n const subRunsPromise: any = (): Promise<DelegateRun[]> => {\n return new Promise(async (resolve) => {\n this.log(\n `Fanning out ${subRunRequests.length} tool executions for ${uniqueAgents.size} agents across swarm.`,\n );\n\n await Promise.all(subRunRequests.flat().map((fn) => fn())).then(\n (results) => {\n this.emitEvent(\"child_assistants_complete\", {\n data: { subRuns: results },\n });\n resolve(results);\n },\n );\n });\n };\n\n const concludedPrimaryRunPromise: any = () => {\n return new Promise(async (resolve) => {\n const _runClosedRun =\n await this.client.beta.threads.runs.submitToolOutputs(\n primaryRun.thread_id,\n primaryRun.id,\n {\n tool_outputs: deDupeToolOutputs(toolOutputs),\n },\n );\n const concludedPrimaryRun = await pollRun(\n this.client,\n this.logGroup,\n this.log,\n _runClosedRun,\n );\n const textResponse = await runMessage(\n this.client,\n this.log,\n concludedPrimaryRun,\n );\n\n this.emitEvent(\"poll_event\", {\n data: {\n status: \"parent_assistant_complete\",\n playground: this.playgroundLink(concludedPrimaryRun),\n textResponse,\n run: concludedPrimaryRun,\n },\n });\n this.emitEvent(\"parent_assistant_complete\", {\n data: {\n parentRun: {\n ...concludedPrimaryRun,\n playground: this.playgroundLink(concludedPrimaryRun),\n textResponse,\n },\n },\n });\n\n resolve({\n ...concludedPrimaryRun,\n playground: this.playgroundLink(concludedPrimaryRun),\n textResponse,\n });\n });\n };\n\n const [concludedPrimaryRun, subRuns] = await Promise.all([\n concludedPrimaryRunPromise(),\n subRunsPromise(),\n ]);\n this.log(\"Swarm Complete.\");\n return { concludedPrimaryRun, subRuns };\n }\n\n /**\n * Initializes your account with the primary assistant to execute and delegate to existing assistants\n */\n async init() {\n this.log(\"Initialization of Swarm Manager is running.\");\n const _ready = await this.findOrUpsertManager();\n this.ready = _ready;\n }\n\n /**\n * Returns a list of all assistants connected to this OpenAI apiKey.\n */\n async allAssistants(): Promise<Assistant[]> {\n this.isReady();\n return (await _allAssistants(this.assistants, this.log)).filter(\n (a) => a.id !== this.mgrAssistant?.id,\n );\n }\n\n /**\n * Returns multiple assistants at once from multiple ids.\n */\n async getAssistants(assistantIds: string[] = []): Promise<Assistant[]> {\n this.isReady();\n return (\n await _getAssistants(this.assistants, this.log, assistantIds)\n ).filter((a) => a.id !== this.mgrAssistant?.id);\n }\n\n /**\n * Cleanup and remove primary swarm assistant manager from your account.\n * Only removes the one created with this script using the params defined during creation of class.\n */\n async cleanup() {\n this.isReady();\n if (!this.mgrAssistant) return;\n await this.assistants.del(this.mgrAssistant.id);\n this.log(\n `Primary swarm assistant manager was deleted from OpenAI account.`,\n );\n return;\n }\n\n /**\n * Emit informative event from the swarm process running.\n */\n emitEvent(\n event: EventTypes,\n args: ParentResponseEvent | SubRunResponseEvent | PollEvent,\n ) {\n this.emitter.emit(event, args);\n }\n\n /**\n * Generate the Playground link for an assistant and thread for visualization in the browser.\n */\n playgroundLink(run?: Run | null): string | null {\n if (!run) return null;\n return `https://platform.openai.com/playground?assistant=${run.assistant_id}&mode=assistant&thread=${run.thread_id}`;\n }\n\n /**\n * Given a single prompt we will create a thread and then find the best option\n * for assistant execution to complete or fulfill the task.\n */\n async delegateWithPrompt(\n prompt: string,\n assistantIds: string[] = [\"<any>\"],\n runOpts?: RunCreateParams,\n ): Promise<DelegationResponse> {\n this.isReady();\n const thread = await this.client.beta.threads.create({\n messages: [{ role: \"user\", content: prompt }],\n metadata: {\n createdBy: \"@mintplex-labs/openai-assistant-swarm\",\n },\n });\n if (!thread) throw new Error(\"Failed to create thread.\");\n\n const mgrAssistant = this.mgrAssistant as Assistant;\n const assistants = await this.getAssistants(assistantIds);\n\n // If the user defined a sub-set of assistants we want to reduce scope of known assistants\n // so we don't execute tasks outside of the subset.\n this.knownAssistantIds = assistants.map((a) => a.id);\n\n const run = await this.client.beta.threads.runs.create(thread.id, {\n assistant_id: mgrAssistant.id,\n tools: toolsFromAssistants(assistants),\n instructions: `${\n mgrAssistant.instructions\n } Your available assistants and their descriptions are presented between <assistant></assistant> tags with their id and descriptions. Only select assistants that are explicitly listed here.\n${assistants.map((assistant: Assistant) => {\n return `<assistant>\n<agent_id>${assistant.id}</agent_id>\n<name>${assistant.name}</name>\n<description>${assistant.description ?? assistant.instructions}</description>\n</assistant>`;\n})},`,\n ...(!!runOpts ? { ...runOpts } : {}),\n });\n\n this.log(`Run created: ${run.id}`);\n this.log({ parentThreadPlaygroundLink: this.playgroundLink(run) });\n this.emitEvent(\"poll_event\", {\n data: {\n status: \"parent_run_created\",\n prompt,\n playground: this.playgroundLink(run),\n run,\n },\n });\n\n const settledManagerRun = await pollRun(\n this.client,\n this.logGroup,\n this.log,\n run,\n );\n\n return await this.delegateTaskToChildren(settledManagerRun);\n }\n}\n","import { Assistant } from \"openai/resources/beta/assistants/assistants\";\nimport {\n AssistantListResponse,\n MessageHistory,\n RunSubmitToolTempOutput,\n} from \"./types\";\nimport SwarmManager from \"../manager\";\nimport OpenAI from \"openai\";\nimport { RunSubmitToolOutputsParams } from \"openai/resources/beta/threads/runs/runs\";\n\nexport const DEFAULT_OPTS = {\n debug: false,\n managerAssistantOptions: {\n name: \"[AUTOMATED] ___Swarm Manager\",\n model: \"gpt-3.5-turbo\",\n },\n};\n\n/**\n * Given a list of assistants, create a prompt to manage them that works for most model.\n */\nexport function toolsFromAssistants(\n assistants: Assistant[] = [],\n): Assistant.Function[] {\n return [\n {\n type: \"function\",\n function: {\n name: \"delegate\",\n description:\n \"Delegates tasks with descriptive prompt to an autonomous assistant that will then go and execute the assignment based on the information provided.\",\n parameters: {\n type: \"object\",\n properties: {\n instructions: {\n type: \"array\",\n description:\n \"The information that will enable an assistant go an execute a provided task.\",\n items: {\n type: \"object\",\n properties: {\n prompt: {\n type: \"string\",\n },\n agent_id: {\n type: \"array\",\n description: \"The list agent_id who will work\",\n enum: [...assistants.map((a) => a.id), \"<none>\"],\n },\n },\n },\n },\n },\n required: [\"instructions\"],\n },\n },\n },\n ];\n}\n\n/**\n * Take thread messages and convert them into the traditional role, content format that are used to pre-populate a thread with\n * messages.\n */\nexport async function messageHistoryForThread(\n client: SwarmManager[\"client\"],\n logger: SwarmManager[\"log\"],\n threadId: string,\n): Promise<MessageHistory[]> {\n return await new Promise(async (resolve, _) => {\n try {\n let _messages: MessageHistory[] = [];\n let nextPage: null | string = null;\n let hasMorePages = true;\n\n while (hasMorePages) {\n const response: OpenAI.Beta.Threads.ThreadMessagesPage =\n await client.beta.threads.messages.list(threadId, {\n limit: 100,\n ...(nextPage ? { after: nextPage } : {}),\n });\n for (const msg of response.data) {\n _messages.push({\n role: \"user\", // Assistants only support user role right now.\n content: (msg.content as any).find(\n (i: { type: string }) => i.type === \"text\",\n )?.text?.value,\n });\n }\n\n hasMorePages = response.hasNextPage();\n nextPage = response.data.slice(-1)?.[0]?.id ?? null;\n }\n resolve(_messages.flat());\n } catch (e: any) {\n logger(e.message);\n resolve([]);\n }\n });\n}\n\n/**\n * Get all assistants attached to an account. Handles pagination and all.\n */\nexport async function _allAssistants(\n client: SwarmManager[\"assistants\"],\n logger: SwarmManager[\"log\"],\n): Promise<Assistant[]> {\n return await new Promise(async (resolve, _) => {\n try {\n let _assistants = [];\n let nextPage: null | string = null;\n let hasMorePages = true;\n\n while (hasMorePages) {\n const response: AssistantListResponse = await client.list({\n limit: 100,\n ...(nextPage ? { after: nextPage } : {}),\n });\n\n _assistants.push(response.data);\n hasMorePages = response.hasNextPage();\n nextPage = response.data.slice(-1)?.[0]?.id ?? null;\n }\n resolve(_assistants.flat());\n } catch (e: any) {\n logger(e.message);\n resolve([]);\n }\n });\n}\n\n/**\n * Gets a list of assistants with concurrency. Useful for concurrent assistant fan-out when that is enabled.\n */\nexport async function _getAssistants(\n client: SwarmManager[\"assistants\"],\n logger: SwarmManager[\"log\"],\n assistantIds: string[] = [],\n): Promise<Assistant[]> {\n // If the <any> client is passed in at all in to the array we short-circuit to all\n // assistants\n if (assistantIds.includes(\"<any>\"))\n return await _allAssistants(client, logger);\n\n const assistantPromises = [];\n for (const assistantId of assistantIds) {\n assistantPromises.push(\n new Promise(async (resolve) => {\n try {\n await client\n .retrieve(assistantId)\n .then((assistant) => resolve(assistant))\n .catch((e: any) => {\n logger(e.message);\n resolve(null);\n });\n } catch (e: any) {\n logger(e.message);\n resolve(null);\n }\n }),\n );\n }\n\n const assistants = (await Promise.all(assistantPromises)).filter(\n (assistant) => assistant !== null,\n );\n return assistants as Assistant[];\n}\n\n/**\n * Poll a run on a thread until it has reached a settled state or until we time it out.\n * Settled states are all states that are not queued or in_progress.\n */\nexport async function pollRun(\n client: SwarmManager[\"client\"],\n logGroup: SwarmManager[\"logGroup\"],\n logger: SwarmManager[\"log\"],\n runItem: OpenAI.Beta.Threads.Run,\n): Promise<OpenAI.Beta.Threads.Run> {\n if (![\"queued\", \"in_progress\"].includes(runItem.status)) return runItem;\n\n logGroup(`Polling status of ${runItem.id}...`);\n let count = 1;\n let polling = true;\n const pollInterval = 5000;\n while (polling) {\n if (count > 5) {\n logGroup(null, true);\n return runItem;\n }\n\n const run = await client.beta.threads.runs.retrieve(\n runItem.thread_id,\n runItem.id,\n );\n logger({ status: run.status });\n\n if (![\"queued\", \"in_progress\"].includes(run.status)) {\n logGroup(null, true);\n return run;\n }\n\n count++;\n await new Promise((r) => setTimeout(r, pollInterval * count));\n }\n\n logGroup(null, true);\n return runItem;\n}\n\n/**\n * Get the first assistant text message from a thread that was sent.\n * You should only run this once you know the thread is in a settled state.\n * Why is it in ascending order and get the first assistant message?\n *\n * -> Sometimes on worse models (3.5t) the assistant will respond to itself for no reason and chat with itself until it tires out\n * when this happens the first response is 100% perfect, but the next one will be as if the thread failed to delegate.\n *\n */\nexport async function runMessage(\n client: SwarmManager[\"client\"],\n logger: SwarmManager[\"log\"],\n runItem: OpenAI.Beta.Threads.Run,\n): Promise<string> {\n try {\n const lastMessageText = client.beta.threads.messages\n .list(runItem.thread_id, { limit: 10, order: \"asc\" })\n .then(({ data }) => data.find((msg) => msg.role === \"assistant\"))\n .then((firstAssistantMsg) => {\n if (!firstAssistantMsg) throw new Error(\"Assistant never responded.\");\n return firstAssistantMsg.content.find(\n (content) => content.type === \"text\",\n );\n })\n .then((textContent) => {\n return (textContent as OpenAI.Beta.Threads.Messages.MessageContentText)\n ?.text?.value;\n })\n .then((text) => {\n if (!text) throw new Error(\"No response was created.\");\n return text;\n });\n return lastMessageText;\n } catch (e: any) {\n logger(e.message);\n return \"Failed to get a written response from the thread.\";\n }\n}\n\n/**\n * When parallel function calling is done we can have the same results being created\n * for the same tool_call - so here we compress all results related to a single tool_call_id\n */\nexport function deDupeToolOutputs(\n toolOutputs: RunSubmitToolTempOutput[],\n): RunSubmitToolOutputsParams.ToolOutput[] {\n const compressed: RunSubmitToolTempOutput[] = [];\n const uniqueCallIds = new Set();\n\n for (const output of toolOutputs) {\n if (uniqueCallIds.has(output.tool_call_id)) {\n const existing = compressed.find((call) => call.tool_call_id) as\n | RunSubmitToolTempOutput\n | undefined;\n if (!existing) continue;\n\n existing.output = [...existing.output, output.output].flat();\n continue;\n }\n\n compressed.push(output);\n uniqueCallIds.add(output.tool_call_id);\n }\n\n return compressed.map((res) => {\n return {\n tool_call_id: res.tool_call_id,\n output: JSON.stringify(res.output),\n };\n });\n}\n","import { Run } from \"openai/resources/beta/threads/runs/runs\";\nimport { DelegatedToolCall, MessageHistory, DelegateRun } from \"../utils/types\";\nimport { _allAssistants, _getAssistants, pollRun, runMessage } from \"../utils\";\nimport SwarmManager from \".\";\n\nexport default class SwarmAssistant {\n private super: SwarmManager;\n constructor(parent: SwarmManager) {\n this.super = parent;\n }\n\n async runDelegatedTask(\n parentRun: Run,\n toolCall: DelegatedToolCall,\n messageHistory: MessageHistory[],\n ): Promise<DelegateRun> {\n const lastMsg = messageHistory?.slice(-1)?.[0]?.content || null;\n const delegationMessage = `You are being assigned a task from the system! Use all available information and your instructions to complete it with 100% satisfaction.\n System: ${toolCall.args.prompt}\n\n The last user message was the following:\n ${lastMsg}\n `;\n const thread = await this.super.client.beta.threads.create({\n messages: [{ role: \"user\", content: delegationMessage }],\n metadata: {\n delegatedBy: parentRun.assistant_id,\n viaFunc: toolCall.function,\n toAssistant: toolCall.agentId,\n originatingToolCallId: toolCall.id,\n createdBy: \"@mintplex-labs/openai-assistant-swarm\",\n },\n });\n if (!thread) throw new Error(\"Failed to create thread for sub task.\");\n if (!this.super.knownAssistantIds?.includes(toolCall.agentId))\n throw new Error(\n `Assistant ${toolCall.agentId} is not a known assistant! Must have been hallucinated.`,\n );\n const assistant = (\n await _getAssistants(this.super.assistants, this.super.log, [\n toolCall.agentId,\n ])\n )?.[0];\n const run = await this.super.client.beta.threads.runs.create(thread.id, {\n assistant_id: assistant.id,\n });\n if (!run)\n throw new Error(\n `Failed to create run for thread of sub task for assistant ${toolCall.agentId}.`,\n );\n\n this.super.emitEvent(\"poll_event\", {\n data: {\n status: \"child_run_created\",\n prompt: delegationMessage,\n playground: this.super.playgroundLink(run),\n run,\n },\n });\n\n // Will get us to either completed, none, or action required. In which case now the user needs to\n // run that action to whatever it is tied to in their codebase.\n this.super.log(\n `Running sub-child task for ${assistant.id} (${assistant.name})`,\n );\n this.super.log({\n childThreadPlaygroundLink: this.super.playgroundLink(run),\n });\n\n const settledRun = await pollRun(\n this.super.client,\n this.super.logGroup,\n this.super.log,\n run,\n );\n const textResponse =\n settledRun.status === \"completed\"\n ? await runMessage(this.super.client, this.super.log, settledRun)\n : null;\n\n this.super.emitEvent(\"poll_event\", {\n data: {\n status: \"child_run_concluded\",\n playground: this.super.playgroundLink(run),\n textResponse,\n run: settledRun,\n },\n });\n\n return {\n abortReason: null,\n textResponse:\n settledRun.status === \"completed\"\n ? await runMessage(this.super.client, this.super.log, settledRun)\n : null,\n parentToolCallId: toolCall.id,\n status: \"success\",\n run: settledRun,\n playground: this.super.playgroundLink(settledRun),\n assistant,\n parentRun,\n thread,\n };\n }\n}\n","import {\n RequiredActionFunctionToolCall,\n Run,\n} from \"openai/resources/beta/threads/runs/runs\";\nimport { DelegatedToolCall, DelegationArguments } from \"./types\";\nimport SwarmManager from \"../manager\";\n\n/**\n * Handle and parse all possible cases of tool calls\n * 1. Single call with single instruction\n * 2. single call with multiple instructions\n * 3. parallel call with multiple or single instructions\n */\nexport function compressToolCalls(\n swarmManager: SwarmManager,\n primaryRun: Run,\n): DelegatedToolCall[] {\n return (\n primaryRun.required_action?.submit_tool_outputs?.tool_calls\n ?.map((toolCall) => {\n try {\n const isParallelCall = (toolCall.function.name =\n \"multi_tool_use.parallel\");\n if (isParallelCall) {\n swarmManager.log(\n `Parallel function call instruction set found - parsing`,\n );\n return parseParallelToolCall(toolCall);\n }\n\n swarmManager.log(\n `Single function call instruction set found - parsing`,\n );\n return parseSingleToolCall(toolCall);\n } catch {}\n return null;\n })\n ?.flat()\n ?.filter((call: any) => !!call) || []\n );\n}\n\n/**\n * Parallel calls can come in two distinct ways - as a list of instructions in a single call\n * Or bundled in an object called \"tool_uses\".\n * Here we can check which response mode is randomly chose and handle each.\n * multi_tool_use.parallel({ \"tool_uses\": [ { \"recipient_name\": \"functions.delegate\", \"parameters\": { \"instructions\": [ {...} ] } }, { \"recipient_name\": \"functions.delegate\", \"parameters\": { \"instructions\": [ {... } ] } } ] })\n * or\n * tool_output({ \"instructions\": [ {...},{...} ] })\n */\nfunction parseParallelToolCall(toolCall: RequiredActionFunctionToolCall) {\n let instructions;\n const callId = toolCall.id;\n const data = JSON.parse(toolCall.function.arguments);\n if (data.hasOwnProperty(\"tool_uses\")) {\n instructions = data.tool_uses\n .map(({ parameters }: { parameters: any }) => parameters.instructions)\n .flat();\n } else {\n instructions = data.instructions;\n }\n\n return instructions.map((instruction: DelegationArguments) => {\n return {\n id: callId,\n function: \"delegate\",\n agentId: instruction.agent_id,\n args: instruction,\n };\n });\n}\n\nfunction parseSingleToolCall(toolCall: RequiredActionFunctionToolCall) {\n const { instructions } = JSON.parse(toolCall.function.arguments);\n return instructions.map((instruction: DelegationArguments) => {\n return {\n id: toolCall.id,\n function: toolCall.function,\n agentId: instruction.agent_id,\n args: instruction,\n };\n });\n}\n","import OpenAI from \"openai\";\nimport SwarmManager from \"./manager/index.js\";\n\nexport interface OpenAIExtended extends OpenAI {\n beta: OpenAI[\"beta\"] & {\n assistants: OpenAI[\"beta\"][\"assistants\"] & {\n swarm: SwarmManager;\n };\n };\n}\n\nexport function EnableSwarmAbilities(\n client: OpenAI,\n options?: SwarmManager[\"options\"],\n) {\n if (!client.hasOwnProperty(\"beta\"))\n throw new Error(\"Beta submodule does not exist on client!\");\n if (!client.beta.hasOwnProperty(\"assistants\"))\n throw new Error(\"Beta Assistant submodule does not exist on client!\");\n (client.beta.assistants as any).swarm = new SwarmManager(client, options);\n return client as OpenAIExtended;\n}\n"],"mappings":"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","names":["concludedPrimaryRun"]}