@alpic80/rivet-core 1.19.1-aidon.1

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.
Files changed (381) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +176 -0
  3. package/dist/cjs/bundle.cjs +18915 -0
  4. package/dist/cjs/bundle.cjs.map +7 -0
  5. package/dist/esm/api/createProcessor.js +131 -0
  6. package/dist/esm/api/streaming.js +116 -0
  7. package/dist/esm/exports.js +32 -0
  8. package/dist/esm/index.js +2 -0
  9. package/dist/esm/integrations/AudioProvider.js +1 -0
  10. package/dist/esm/integrations/DatasetProvider.js +92 -0
  11. package/dist/esm/integrations/EmbeddingGenerator.js +1 -0
  12. package/dist/esm/integrations/GptTokenizerTokenizer.js +65 -0
  13. package/dist/esm/integrations/LLMProvider.js +1 -0
  14. package/dist/esm/integrations/Tokenizer.js +1 -0
  15. package/dist/esm/integrations/VectorDatabase.js +1 -0
  16. package/dist/esm/integrations/enableIntegrations.js +3 -0
  17. package/dist/esm/integrations/integrations.js +19 -0
  18. package/dist/esm/integrations/openai/OpenAIEmbeddingGenerator.js +23 -0
  19. package/dist/esm/model/DataValue.js +176 -0
  20. package/dist/esm/model/Dataset.js +1 -0
  21. package/dist/esm/model/EditorDefinition.js +1 -0
  22. package/dist/esm/model/GraphProcessor.js +1198 -0
  23. package/dist/esm/model/NodeBase.js +1 -0
  24. package/dist/esm/model/NodeBodySpec.js +1 -0
  25. package/dist/esm/model/NodeDefinition.js +12 -0
  26. package/dist/esm/model/NodeGraph.js +14 -0
  27. package/dist/esm/model/NodeImpl.js +49 -0
  28. package/dist/esm/model/NodeRegistration.js +144 -0
  29. package/dist/esm/model/Nodes.js +227 -0
  30. package/dist/esm/model/PluginLoadSpec.js +1 -0
  31. package/dist/esm/model/ProcessContext.js +1 -0
  32. package/dist/esm/model/Project.js +2 -0
  33. package/dist/esm/model/RivetPlugin.js +1 -0
  34. package/dist/esm/model/RivetUIContext.js +1 -0
  35. package/dist/esm/model/Settings.js +1 -0
  36. package/dist/esm/model/nodes/AbortGraphNode.js +100 -0
  37. package/dist/esm/model/nodes/AppendToDatasetNode.js +115 -0
  38. package/dist/esm/model/nodes/ArrayNode.js +144 -0
  39. package/dist/esm/model/nodes/AssembleMessageNode.js +199 -0
  40. package/dist/esm/model/nodes/AssemblePromptNode.js +129 -0
  41. package/dist/esm/model/nodes/AudioNode.js +101 -0
  42. package/dist/esm/model/nodes/BooleanNode.js +74 -0
  43. package/dist/esm/model/nodes/CallGraphNode.js +136 -0
  44. package/dist/esm/model/nodes/ChatNode.js +964 -0
  45. package/dist/esm/model/nodes/ChunkNode.js +166 -0
  46. package/dist/esm/model/nodes/CoalesceNode.js +104 -0
  47. package/dist/esm/model/nodes/CodeNode.js +136 -0
  48. package/dist/esm/model/nodes/CommentNode.js +69 -0
  49. package/dist/esm/model/nodes/CompareNode.js +138 -0
  50. package/dist/esm/model/nodes/ContextNode.js +99 -0
  51. package/dist/esm/model/nodes/CreateDatasetNode.js +71 -0
  52. package/dist/esm/model/nodes/DatasetNearestNeigborsNode.js +97 -0
  53. package/dist/esm/model/nodes/DelayNode.js +105 -0
  54. package/dist/esm/model/nodes/DelegateFunctionCallNode.js +136 -0
  55. package/dist/esm/model/nodes/DestructureNode.js +86 -0
  56. package/dist/esm/model/nodes/EvaluateNode.js +141 -0
  57. package/dist/esm/model/nodes/ExternalCallNode.js +162 -0
  58. package/dist/esm/model/nodes/ExtractJsonNode.js +122 -0
  59. package/dist/esm/model/nodes/ExtractMarkdownCodeBlocksNode.js +100 -0
  60. package/dist/esm/model/nodes/ExtractObjectPathNode.js +128 -0
  61. package/dist/esm/model/nodes/ExtractRegexNode.js +201 -0
  62. package/dist/esm/model/nodes/ExtractYamlNode.js +214 -0
  63. package/dist/esm/model/nodes/FilterNode.js +73 -0
  64. package/dist/esm/model/nodes/GetAllDatasetsNode.js +53 -0
  65. package/dist/esm/model/nodes/GetDatasetRowNode.js +99 -0
  66. package/dist/esm/model/nodes/GetEmbeddingNode.js +130 -0
  67. package/dist/esm/model/nodes/GetGlobalNode.js +139 -0
  68. package/dist/esm/model/nodes/GptFunctionNode.js +169 -0
  69. package/dist/esm/model/nodes/GraphInputNode.js +130 -0
  70. package/dist/esm/model/nodes/GraphOutputNode.js +104 -0
  71. package/dist/esm/model/nodes/GraphReferenceNode.js +128 -0
  72. package/dist/esm/model/nodes/HashNode.js +97 -0
  73. package/dist/esm/model/nodes/HttpCallNode.js +257 -0
  74. package/dist/esm/model/nodes/IfElseNode.js +138 -0
  75. package/dist/esm/model/nodes/IfNode.js +124 -0
  76. package/dist/esm/model/nodes/ImageNode.js +107 -0
  77. package/dist/esm/model/nodes/JoinNode.js +135 -0
  78. package/dist/esm/model/nodes/ListGraphsNode.js +61 -0
  79. package/dist/esm/model/nodes/LoadDatasetNode.js +83 -0
  80. package/dist/esm/model/nodes/LoopControllerNode.js +206 -0
  81. package/dist/esm/model/nodes/MatchNode.js +137 -0
  82. package/dist/esm/model/nodes/NumberNode.js +86 -0
  83. package/dist/esm/model/nodes/ObjectNode.js +121 -0
  84. package/dist/esm/model/nodes/PassthroughNode.js +78 -0
  85. package/dist/esm/model/nodes/PlayAudioNode.js +61 -0
  86. package/dist/esm/model/nodes/PopNode.js +89 -0
  87. package/dist/esm/model/nodes/PromptNode.js +227 -0
  88. package/dist/esm/model/nodes/RaceInputsNode.js +86 -0
  89. package/dist/esm/model/nodes/RaiseEventNode.js +84 -0
  90. package/dist/esm/model/nodes/RandomNumberNode.js +106 -0
  91. package/dist/esm/model/nodes/ReadDirectoryNode.js +165 -0
  92. package/dist/esm/model/nodes/ReadFileNode.js +114 -0
  93. package/dist/esm/model/nodes/ReplaceDatasetNode.js +118 -0
  94. package/dist/esm/model/nodes/SetGlobalNode.js +124 -0
  95. package/dist/esm/model/nodes/ShuffleNode.js +64 -0
  96. package/dist/esm/model/nodes/SliceNode.js +100 -0
  97. package/dist/esm/model/nodes/SplitNode.js +101 -0
  98. package/dist/esm/model/nodes/SubGraphNode.js +181 -0
  99. package/dist/esm/model/nodes/TextNode.js +97 -0
  100. package/dist/esm/model/nodes/ToJsonNode.js +78 -0
  101. package/dist/esm/model/nodes/ToYamlNode.js +68 -0
  102. package/dist/esm/model/nodes/TrimChatMessagesNode.js +120 -0
  103. package/dist/esm/model/nodes/URLReferenceNode.js +79 -0
  104. package/dist/esm/model/nodes/UserInputNode.js +111 -0
  105. package/dist/esm/model/nodes/VectorNearestNeighborsNode.js +127 -0
  106. package/dist/esm/model/nodes/VectorStoreNode.js +124 -0
  107. package/dist/esm/model/nodes/WaitForEventNode.js +88 -0
  108. package/dist/esm/native/BaseDir.js +32 -0
  109. package/dist/esm/native/BrowserNativeApi.js +19 -0
  110. package/dist/esm/native/NativeApi.js +1 -0
  111. package/dist/esm/plugins/aidon/index.js +2 -0
  112. package/dist/esm/plugins/aidon/nodes/ChatAidonNode.js +215 -0
  113. package/dist/esm/plugins/aidon/plugin.js +9 -0
  114. package/dist/esm/plugins/anthropic/anthropic.js +187 -0
  115. package/dist/esm/plugins/anthropic/fetchEventSource.js +106 -0
  116. package/dist/esm/plugins/anthropic/index.js +2 -0
  117. package/dist/esm/plugins/anthropic/nodes/ChatAnthropicNode.js +652 -0
  118. package/dist/esm/plugins/anthropic/plugin.js +18 -0
  119. package/dist/esm/plugins/assemblyAi/LemurActionItemsNode.js +75 -0
  120. package/dist/esm/plugins/assemblyAi/LemurQaNode.js +155 -0
  121. package/dist/esm/plugins/assemblyAi/LemurSummaryNode.js +79 -0
  122. package/dist/esm/plugins/assemblyAi/LemurTaskNode.js +82 -0
  123. package/dist/esm/plugins/assemblyAi/TranscribeAudioNode.js +125 -0
  124. package/dist/esm/plugins/assemblyAi/index.js +2 -0
  125. package/dist/esm/plugins/assemblyAi/lemurHelpers.js +114 -0
  126. package/dist/esm/plugins/assemblyAi/plugin.js +32 -0
  127. package/dist/esm/plugins/autoevals/AutoEvalsNode.js +223 -0
  128. package/dist/esm/plugins/autoevals/index.js +2 -0
  129. package/dist/esm/plugins/autoevals/plugin.js +8 -0
  130. package/dist/esm/plugins/gentrace/index.js +2 -0
  131. package/dist/esm/plugins/gentrace/plugin.js +192 -0
  132. package/dist/esm/plugins/google/google.js +60 -0
  133. package/dist/esm/plugins/google/index.js +2 -0
  134. package/dist/esm/plugins/google/nodes/ChatGoogleNode.js +364 -0
  135. package/dist/esm/plugins/google/plugin.js +32 -0
  136. package/dist/esm/plugins/huggingface/index.js +2 -0
  137. package/dist/esm/plugins/huggingface/nodes/ChatHuggingFace.js +243 -0
  138. package/dist/esm/plugins/huggingface/nodes/TextToImageHuggingFace.js +189 -0
  139. package/dist/esm/plugins/huggingface/plugin.js +26 -0
  140. package/dist/esm/plugins/openai/handleOpenaiError.js +17 -0
  141. package/dist/esm/plugins/openai/index.js +2 -0
  142. package/dist/esm/plugins/openai/nodes/AttachAssistantFileNode.js +123 -0
  143. package/dist/esm/plugins/openai/nodes/CreateAssistantNode.js +289 -0
  144. package/dist/esm/plugins/openai/nodes/CreateThreadMessageNode.js +176 -0
  145. package/dist/esm/plugins/openai/nodes/CreateThreadNode.js +157 -0
  146. package/dist/esm/plugins/openai/nodes/DeleteAssistantNode.js +104 -0
  147. package/dist/esm/plugins/openai/nodes/DeleteThreadNode.js +97 -0
  148. package/dist/esm/plugins/openai/nodes/GetAssistantNode.js +118 -0
  149. package/dist/esm/plugins/openai/nodes/GetOpenAIFileNode.js +100 -0
  150. package/dist/esm/plugins/openai/nodes/GetThreadNode.js +108 -0
  151. package/dist/esm/plugins/openai/nodes/ListAssistantsNode.js +202 -0
  152. package/dist/esm/plugins/openai/nodes/ListOpenAIFilesNode.js +94 -0
  153. package/dist/esm/plugins/openai/nodes/ListThreadMessagesNode.js +224 -0
  154. package/dist/esm/plugins/openai/nodes/RunThreadNode.js +630 -0
  155. package/dist/esm/plugins/openai/nodes/ThreadMessageNode.js +145 -0
  156. package/dist/esm/plugins/openai/nodes/UploadFileNode.js +121 -0
  157. package/dist/esm/plugins/openai/plugin.js +44 -0
  158. package/dist/esm/plugins/pinecone/PineconeVectorDatabase.js +88 -0
  159. package/dist/esm/plugins/pinecone/index.js +2 -0
  160. package/dist/esm/plugins/pinecone/plugin.js +19 -0
  161. package/dist/esm/plugins.js +21 -0
  162. package/dist/esm/recording/ExecutionRecorder.js +177 -0
  163. package/dist/esm/recording/RecordedEvents.js +1 -0
  164. package/dist/esm/utils/assertNever.js +3 -0
  165. package/dist/esm/utils/base64.js +25 -0
  166. package/dist/esm/utils/chatMessageToOpenAIChatCompletionMessage.js +60 -0
  167. package/dist/esm/utils/coerceType.js +322 -0
  168. package/dist/esm/utils/compatibility.js +27 -0
  169. package/dist/esm/utils/copyToClipboard.js +10 -0
  170. package/dist/esm/utils/defaults.js +2 -0
  171. package/dist/esm/utils/errors.js +7 -0
  172. package/dist/esm/utils/expectType.js +34 -0
  173. package/dist/esm/utils/fetchEventSource.js +120 -0
  174. package/dist/esm/utils/genericUtilFunctions.js +25 -0
  175. package/dist/esm/utils/getPluginConfig.js +23 -0
  176. package/dist/esm/utils/handleEscapeCharacters.js +11 -0
  177. package/dist/esm/utils/index.js +14 -0
  178. package/dist/esm/utils/inputs.js +16 -0
  179. package/dist/esm/utils/interpolation.js +6 -0
  180. package/dist/esm/utils/misc.js +1 -0
  181. package/dist/esm/utils/newId.js +4 -0
  182. package/dist/esm/utils/openai.js +219 -0
  183. package/dist/esm/utils/outputs.js +14 -0
  184. package/dist/esm/utils/serialization/serialization.js +86 -0
  185. package/dist/esm/utils/serialization/serializationUtils.js +13 -0
  186. package/dist/esm/utils/serialization/serialization_v1.js +19 -0
  187. package/dist/esm/utils/serialization/serialization_v2.js +24 -0
  188. package/dist/esm/utils/serialization/serialization_v3.js +145 -0
  189. package/dist/esm/utils/serialization/serialization_v4.js +200 -0
  190. package/dist/esm/utils/symbols.js +2 -0
  191. package/dist/esm/utils/time.js +14 -0
  192. package/dist/esm/utils/typeSafety.js +42 -0
  193. package/dist/types/api/createProcessor.d.ts +37 -0
  194. package/dist/types/api/streaming.d.ts +56 -0
  195. package/dist/types/exports.d.ts +33 -0
  196. package/dist/types/index.d.ts +4 -0
  197. package/dist/types/integrations/AudioProvider.d.ts +4 -0
  198. package/dist/types/integrations/DatasetProvider.d.ts +33 -0
  199. package/dist/types/integrations/EmbeddingGenerator.d.ts +3 -0
  200. package/dist/types/integrations/GptTokenizerTokenizer.d.ts +20 -0
  201. package/dist/types/integrations/LLMProvider.d.ts +7 -0
  202. package/dist/types/integrations/Tokenizer.d.ts +11 -0
  203. package/dist/types/integrations/VectorDatabase.d.ts +7 -0
  204. package/dist/types/integrations/enableIntegrations.d.ts +1 -0
  205. package/dist/types/integrations/integrations.d.ts +12 -0
  206. package/dist/types/integrations/openai/OpenAIEmbeddingGenerator.d.ts +10 -0
  207. package/dist/types/model/DataValue.d.ts +138 -0
  208. package/dist/types/model/Dataset.d.ts +19 -0
  209. package/dist/types/model/EditorDefinition.d.ts +142 -0
  210. package/dist/types/model/GraphProcessor.d.ts +192 -0
  211. package/dist/types/model/NodeBase.d.ts +110 -0
  212. package/dist/types/model/NodeBodySpec.d.ts +19 -0
  213. package/dist/types/model/NodeDefinition.d.ts +13 -0
  214. package/dist/types/model/NodeGraph.d.ts +15 -0
  215. package/dist/types/model/NodeImpl.d.ts +55 -0
  216. package/dist/types/model/NodeRegistration.d.ts +24 -0
  217. package/dist/types/model/Nodes.d.ts +84 -0
  218. package/dist/types/model/PluginLoadSpec.d.ts +17 -0
  219. package/dist/types/model/ProcessContext.d.ts +69 -0
  220. package/dist/types/model/Project.d.ts +17 -0
  221. package/dist/types/model/RivetPlugin.d.ts +45 -0
  222. package/dist/types/model/RivetUIContext.d.ts +18 -0
  223. package/dist/types/model/Settings.d.ts +15 -0
  224. package/dist/types/model/nodes/AbortGraphNode.d.ts +22 -0
  225. package/dist/types/model/nodes/AppendToDatasetNode.d.ts +21 -0
  226. package/dist/types/model/nodes/ArrayNode.d.ts +20 -0
  227. package/dist/types/model/nodes/AssembleMessageNode.d.ts +23 -0
  228. package/dist/types/model/nodes/AssemblePromptNode.d.ts +20 -0
  229. package/dist/types/model/nodes/AudioNode.d.ts +20 -0
  230. package/dist/types/model/nodes/BooleanNode.d.ts +19 -0
  231. package/dist/types/model/nodes/CallGraphNode.d.ts +16 -0
  232. package/dist/types/model/nodes/ChatNode.d.ts +77 -0
  233. package/dist/types/model/nodes/ChunkNode.d.ts +22 -0
  234. package/dist/types/model/nodes/CoalesceNode.d.ts +14 -0
  235. package/dist/types/model/nodes/CodeNode.d.ts +21 -0
  236. package/dist/types/model/nodes/CommentNode.d.ts +20 -0
  237. package/dist/types/model/nodes/CompareNode.d.ts +19 -0
  238. package/dist/types/model/nodes/ContextNode.d.ts +24 -0
  239. package/dist/types/model/nodes/CreateDatasetNode.d.ts +13 -0
  240. package/dist/types/model/nodes/DatasetNearestNeigborsNode.d.ts +19 -0
  241. package/dist/types/model/nodes/DelayNode.d.ts +20 -0
  242. package/dist/types/model/nodes/DelegateFunctionCallNode.d.ts +25 -0
  243. package/dist/types/model/nodes/DestructureNode.d.ts +18 -0
  244. package/dist/types/model/nodes/EvaluateNode.d.ts +19 -0
  245. package/dist/types/model/nodes/ExternalCallNode.d.ts +22 -0
  246. package/dist/types/model/nodes/ExtractJsonNode.d.ts +13 -0
  247. package/dist/types/model/nodes/ExtractMarkdownCodeBlocksNode.d.ts +12 -0
  248. package/dist/types/model/nodes/ExtractObjectPathNode.d.ts +19 -0
  249. package/dist/types/model/nodes/ExtractRegexNode.d.ts +22 -0
  250. package/dist/types/model/nodes/ExtractYamlNode.d.ts +21 -0
  251. package/dist/types/model/nodes/FilterNode.d.ts +13 -0
  252. package/dist/types/model/nodes/GetAllDatasetsNode.d.ts +14 -0
  253. package/dist/types/model/nodes/GetDatasetRowNode.d.ts +19 -0
  254. package/dist/types/model/nodes/GetEmbeddingNode.d.ts +24 -0
  255. package/dist/types/model/nodes/GetGlobalNode.d.ts +29 -0
  256. package/dist/types/model/nodes/GptFunctionNode.d.ts +25 -0
  257. package/dist/types/model/nodes/GraphInputNode.d.ts +24 -0
  258. package/dist/types/model/nodes/GraphOutputNode.d.ts +22 -0
  259. package/dist/types/model/nodes/GraphReferenceNode.d.ts +22 -0
  260. package/dist/types/model/nodes/HashNode.d.ts +17 -0
  261. package/dist/types/model/nodes/HttpCallNode.d.ts +27 -0
  262. package/dist/types/model/nodes/IfElseNode.d.ts +18 -0
  263. package/dist/types/model/nodes/IfNode.d.ts +17 -0
  264. package/dist/types/model/nodes/ImageNode.d.ts +20 -0
  265. package/dist/types/model/nodes/JoinNode.d.ts +21 -0
  266. package/dist/types/model/nodes/ListGraphsNode.d.ts +14 -0
  267. package/dist/types/model/nodes/LoadDatasetNode.d.ts +17 -0
  268. package/dist/types/model/nodes/LoopControllerNode.d.ts +20 -0
  269. package/dist/types/model/nodes/MatchNode.d.ts +19 -0
  270. package/dist/types/model/nodes/NumberNode.d.ts +21 -0
  271. package/dist/types/model/nodes/ObjectNode.d.ts +18 -0
  272. package/dist/types/model/nodes/PassthroughNode.d.ts +14 -0
  273. package/dist/types/model/nodes/PlayAudioNode.d.ts +15 -0
  274. package/dist/types/model/nodes/PopNode.d.ts +19 -0
  275. package/dist/types/model/nodes/PromptNode.d.ts +23 -0
  276. package/dist/types/model/nodes/RaceInputsNode.d.ts +17 -0
  277. package/dist/types/model/nodes/RaiseEventNode.d.ts +22 -0
  278. package/dist/types/model/nodes/RandomNumberNode.d.ts +23 -0
  279. package/dist/types/model/nodes/ReadDirectoryNode.d.ts +30 -0
  280. package/dist/types/model/nodes/ReadFileNode.d.ts +23 -0
  281. package/dist/types/model/nodes/ReplaceDatasetNode.d.ts +21 -0
  282. package/dist/types/model/nodes/SetGlobalNode.d.ts +23 -0
  283. package/dist/types/model/nodes/ShuffleNode.d.ts +12 -0
  284. package/dist/types/model/nodes/SliceNode.d.ts +22 -0
  285. package/dist/types/model/nodes/SplitNode.d.ts +19 -0
  286. package/dist/types/model/nodes/SubGraphNode.d.ts +29 -0
  287. package/dist/types/model/nodes/TextNode.d.ts +18 -0
  288. package/dist/types/model/nodes/ToJsonNode.d.ts +18 -0
  289. package/dist/types/model/nodes/ToYamlNode.d.ts +13 -0
  290. package/dist/types/model/nodes/TrimChatMessagesNode.d.ts +20 -0
  291. package/dist/types/model/nodes/URLReferenceNode.d.ts +19 -0
  292. package/dist/types/model/nodes/UserInputNode.d.ts +21 -0
  293. package/dist/types/model/nodes/VectorNearestNeighborsNode.d.ts +24 -0
  294. package/dist/types/model/nodes/VectorStoreNode.d.ts +22 -0
  295. package/dist/types/model/nodes/WaitForEventNode.d.ts +21 -0
  296. package/dist/types/native/BaseDir.d.ts +29 -0
  297. package/dist/types/native/BrowserNativeApi.d.ts +11 -0
  298. package/dist/types/native/NativeApi.d.ts +17 -0
  299. package/dist/types/plugins/aidon/index.d.ts +2 -0
  300. package/dist/types/plugins/aidon/nodes/ChatAidonNode.d.ts +3 -0
  301. package/dist/types/plugins/aidon/plugin.d.ts +2 -0
  302. package/dist/types/plugins/anthropic/anthropic.d.ts +216 -0
  303. package/dist/types/plugins/anthropic/fetchEventSource.d.ts +11 -0
  304. package/dist/types/plugins/anthropic/index.d.ts +2 -0
  305. package/dist/types/plugins/anthropic/nodes/ChatAnthropicNode.d.ts +30 -0
  306. package/dist/types/plugins/anthropic/plugin.d.ts +2 -0
  307. package/dist/types/plugins/assemblyAi/LemurActionItemsNode.d.ts +6 -0
  308. package/dist/types/plugins/assemblyAi/LemurQaNode.d.ts +22 -0
  309. package/dist/types/plugins/assemblyAi/LemurSummaryNode.d.ts +8 -0
  310. package/dist/types/plugins/assemblyAi/LemurTaskNode.d.ts +8 -0
  311. package/dist/types/plugins/assemblyAi/TranscribeAudioNode.d.ts +7 -0
  312. package/dist/types/plugins/assemblyAi/index.d.ts +2 -0
  313. package/dist/types/plugins/assemblyAi/lemurHelpers.d.ts +67 -0
  314. package/dist/types/plugins/assemblyAi/plugin.d.ts +2 -0
  315. package/dist/types/plugins/autoevals/AutoEvalsNode.d.ts +8 -0
  316. package/dist/types/plugins/autoevals/index.d.ts +2 -0
  317. package/dist/types/plugins/autoevals/plugin.d.ts +2 -0
  318. package/dist/types/plugins/gentrace/index.d.ts +2 -0
  319. package/dist/types/plugins/gentrace/plugin.d.ts +5 -0
  320. package/dist/types/plugins/google/google.d.ts +60 -0
  321. package/dist/types/plugins/google/index.d.ts +2 -0
  322. package/dist/types/plugins/google/nodes/ChatGoogleNode.d.ts +27 -0
  323. package/dist/types/plugins/google/plugin.d.ts +2 -0
  324. package/dist/types/plugins/huggingface/index.d.ts +2 -0
  325. package/dist/types/plugins/huggingface/nodes/ChatHuggingFace.d.ts +24 -0
  326. package/dist/types/plugins/huggingface/nodes/TextToImageHuggingFace.d.ts +20 -0
  327. package/dist/types/plugins/huggingface/plugin.d.ts +2 -0
  328. package/dist/types/plugins/openai/handleOpenaiError.d.ts +1 -0
  329. package/dist/types/plugins/openai/index.d.ts +2 -0
  330. package/dist/types/plugins/openai/nodes/AttachAssistantFileNode.d.ts +10 -0
  331. package/dist/types/plugins/openai/nodes/CreateAssistantNode.d.ts +26 -0
  332. package/dist/types/plugins/openai/nodes/CreateThreadMessageNode.d.ts +15 -0
  333. package/dist/types/plugins/openai/nodes/CreateThreadNode.d.ts +13 -0
  334. package/dist/types/plugins/openai/nodes/DeleteAssistantNode.d.ts +8 -0
  335. package/dist/types/plugins/openai/nodes/DeleteThreadNode.d.ts +8 -0
  336. package/dist/types/plugins/openai/nodes/GetAssistantNode.d.ts +8 -0
  337. package/dist/types/plugins/openai/nodes/GetOpenAIFileNode.d.ts +8 -0
  338. package/dist/types/plugins/openai/nodes/GetThreadNode.d.ts +8 -0
  339. package/dist/types/plugins/openai/nodes/ListAssistantsNode.d.ts +14 -0
  340. package/dist/types/plugins/openai/nodes/ListOpenAIFilesNode.d.ts +8 -0
  341. package/dist/types/plugins/openai/nodes/ListThreadMessagesNode.d.ts +16 -0
  342. package/dist/types/plugins/openai/nodes/RunThreadNode.d.ts +28 -0
  343. package/dist/types/plugins/openai/nodes/ThreadMessageNode.d.ts +14 -0
  344. package/dist/types/plugins/openai/nodes/UploadFileNode.d.ts +7 -0
  345. package/dist/types/plugins/openai/plugin.d.ts +2 -0
  346. package/dist/types/plugins/pinecone/PineconeVectorDatabase.d.ts +9 -0
  347. package/dist/types/plugins/pinecone/index.d.ts +2 -0
  348. package/dist/types/plugins/pinecone/plugin.d.ts +2 -0
  349. package/dist/types/plugins.d.ts +20 -0
  350. package/dist/types/recording/ExecutionRecorder.d.ts +25 -0
  351. package/dist/types/recording/RecordedEvents.d.ts +100 -0
  352. package/dist/types/utils/assertNever.d.ts +1 -0
  353. package/dist/types/utils/base64.d.ts +2 -0
  354. package/dist/types/utils/chatMessageToOpenAIChatCompletionMessage.d.ts +3 -0
  355. package/dist/types/utils/coerceType.d.ts +6 -0
  356. package/dist/types/utils/compatibility.d.ts +3 -0
  357. package/dist/types/utils/copyToClipboard.d.ts +1 -0
  358. package/dist/types/utils/defaults.d.ts +2 -0
  359. package/dist/types/utils/errors.d.ts +2 -0
  360. package/dist/types/utils/expectType.d.ts +3 -0
  361. package/dist/types/utils/fetchEventSource.d.ts +12 -0
  362. package/dist/types/utils/genericUtilFunctions.d.ts +21 -0
  363. package/dist/types/utils/getPluginConfig.d.ts +2 -0
  364. package/dist/types/utils/handleEscapeCharacters.d.ts +2 -0
  365. package/dist/types/utils/index.d.ts +14 -0
  366. package/dist/types/utils/inputs.d.ts +3 -0
  367. package/dist/types/utils/interpolation.d.ts +1 -0
  368. package/dist/types/utils/misc.d.ts +1 -0
  369. package/dist/types/utils/newId.d.ts +1 -0
  370. package/dist/types/utils/openai.d.ts +739 -0
  371. package/dist/types/utils/outputs.d.ts +3 -0
  372. package/dist/types/utils/serialization/serialization.d.ts +12 -0
  373. package/dist/types/utils/serialization/serializationUtils.d.ts +6 -0
  374. package/dist/types/utils/serialization/serialization_v1.d.ts +3 -0
  375. package/dist/types/utils/serialization/serialization_v2.d.ts +3 -0
  376. package/dist/types/utils/serialization/serialization_v3.d.ts +19 -0
  377. package/dist/types/utils/serialization/serialization_v4.d.ts +9 -0
  378. package/dist/types/utils/symbols.d.ts +3 -0
  379. package/dist/types/utils/time.d.ts +22 -0
  380. package/dist/types/utils/typeSafety.d.ts +37 -0
  381. package/package.json +97 -0
@@ -0,0 +1,630 @@
1
+ import { isArrayDataValue, arrayizeDataValue, unwrapDataValue, } from '../../../index.js';
2
+ import { openAiModelOptions, } from '../../../utils/openai.js';
3
+ import { dedent, newId, coerceTypeOptional, getInputOrData } from '../../../utils/index.js';
4
+ import { pluginNodeDefinition } from '../../../model/NodeDefinition.js';
5
+ import { handleOpenAIError } from '../handleOpenaiError.js';
6
+ import {} from '../../../model/DataValue.js';
7
+ import { match } from 'ts-pattern';
8
+ const POLL_FREQUENCY = 500;
9
+ export const RunThreadNodeImpl = {
10
+ create() {
11
+ return {
12
+ id: newId(),
13
+ type: 'openaiRunThread',
14
+ data: {
15
+ createThread: true,
16
+ threadId: '',
17
+ useThreadIdInput: false,
18
+ assistantId: '',
19
+ useAssistantIdInput: false,
20
+ model: '',
21
+ useModelInput: false,
22
+ instructions: '',
23
+ useInstructionsInput: false,
24
+ tools: [],
25
+ metadata: [],
26
+ useMetadataInput: false,
27
+ toolCallHandlers: [],
28
+ },
29
+ title: 'Run Thread',
30
+ visualData: {
31
+ x: 0,
32
+ y: 0,
33
+ width: 400,
34
+ },
35
+ };
36
+ },
37
+ getUIData() {
38
+ return {
39
+ group: 'OpenAI',
40
+ contextMenuTitle: 'Run Thread',
41
+ infoBoxTitle: 'Run Thread Node',
42
+ infoBoxBody: 'Run a thread for OpenAI.',
43
+ };
44
+ },
45
+ getInputDefinitions(data) {
46
+ const inputs = [];
47
+ if (!data.createThread && data.useThreadIdInput) {
48
+ inputs.push({
49
+ id: 'threadId',
50
+ dataType: 'string',
51
+ title: 'Thread ID',
52
+ coerced: true,
53
+ defaultValue: '',
54
+ description: 'The ID of the thread to run.',
55
+ required: true,
56
+ });
57
+ }
58
+ if (data.createThread) {
59
+ inputs.push({
60
+ id: 'messages',
61
+ dataType: 'object[]',
62
+ title: 'Messages',
63
+ coerced: true,
64
+ defaultValue: [],
65
+ description: 'A list of user messages to start the thread with.',
66
+ required: false,
67
+ });
68
+ }
69
+ if (data.useAssistantIdInput) {
70
+ inputs.push({
71
+ id: 'assistantId',
72
+ dataType: 'string',
73
+ title: 'Assistant ID',
74
+ coerced: true,
75
+ defaultValue: '',
76
+ description: 'The ID of the assistant to use.',
77
+ required: true,
78
+ });
79
+ }
80
+ if (data.useModelInput) {
81
+ inputs.push({
82
+ id: 'model',
83
+ dataType: 'string',
84
+ title: 'Model',
85
+ coerced: true,
86
+ defaultValue: '',
87
+ description: 'ID of the model to use.',
88
+ required: false,
89
+ });
90
+ }
91
+ if (data.useInstructionsInput) {
92
+ inputs.push({
93
+ id: 'instructions',
94
+ dataType: 'string',
95
+ title: 'Instructions',
96
+ coerced: true,
97
+ defaultValue: '',
98
+ description: 'The system instructions that the assistant uses.',
99
+ required: false,
100
+ });
101
+ }
102
+ inputs.push({
103
+ id: 'functions',
104
+ dataType: ['gpt-function[]', 'gpt-function'],
105
+ title: 'Functions',
106
+ coerced: true,
107
+ defaultValue: [],
108
+ description: 'A list of GPT functions enabled on the assistant.',
109
+ required: false,
110
+ });
111
+ if (data.useMetadataInput) {
112
+ inputs.push({
113
+ id: 'metadata',
114
+ dataType: 'object',
115
+ title: 'Metadata',
116
+ coerced: true,
117
+ defaultValue: {},
118
+ description: 'Metadata to attach to the run.',
119
+ required: false,
120
+ });
121
+ }
122
+ return inputs;
123
+ },
124
+ getOutputDefinitions() {
125
+ return [
126
+ {
127
+ id: 'runId',
128
+ dataType: 'string',
129
+ title: 'Run ID',
130
+ description: 'The ID of the run.',
131
+ },
132
+ {
133
+ id: 'run',
134
+ dataType: 'object',
135
+ title: 'Run',
136
+ description: 'The full run object.',
137
+ },
138
+ {
139
+ id: 'steps',
140
+ dataType: 'object[]',
141
+ title: 'Steps',
142
+ description: 'The list of steps for the run.',
143
+ },
144
+ {
145
+ id: 'last_step',
146
+ dataType: 'object',
147
+ title: 'Last Step',
148
+ description: 'The last step for the run.',
149
+ },
150
+ {
151
+ id: 'messages',
152
+ dataType: 'object[]',
153
+ title: 'Messages',
154
+ description: 'The list of messages for the thread.',
155
+ },
156
+ {
157
+ id: 'last_message',
158
+ dataType: 'object',
159
+ title: 'Last Message',
160
+ description: 'The last message on the thread.',
161
+ },
162
+ {
163
+ id: 'last_assistant_messages',
164
+ dataType: 'object[]',
165
+ title: 'Last Assistant Messages',
166
+ description: 'The last messages of type `assistant` for the thread.',
167
+ },
168
+ ];
169
+ },
170
+ getEditors() {
171
+ return [
172
+ {
173
+ type: 'toggle',
174
+ dataKey: 'createThread',
175
+ label: 'Create New Thread',
176
+ },
177
+ {
178
+ type: 'string',
179
+ dataKey: 'threadId',
180
+ useInputToggleDataKey: 'useThreadIdInput',
181
+ label: 'Thread ID',
182
+ placeholder: 'Enter thread ID',
183
+ helperMessage: 'The ID of the thread to run.',
184
+ hideIf: (data) => data.createThread,
185
+ },
186
+ {
187
+ type: 'string',
188
+ dataKey: 'assistantId',
189
+ useInputToggleDataKey: 'useAssistantIdInput',
190
+ label: 'Assistant ID',
191
+ placeholder: 'Enter assistant ID',
192
+ helperMessage: 'The ID of the assistant to use. Required.',
193
+ },
194
+ {
195
+ type: 'dropdown',
196
+ dataKey: 'model',
197
+ useInputToggleDataKey: 'useModelInput',
198
+ label: 'Model',
199
+ options: [
200
+ {
201
+ label: 'Default',
202
+ value: '',
203
+ },
204
+ ...openAiModelOptions,
205
+ ],
206
+ defaultValue: '',
207
+ helperMessage: 'The GPT model to use for the run. If default, the model of the assistant will be used.',
208
+ },
209
+ {
210
+ type: 'code',
211
+ dataKey: 'instructions',
212
+ useInputToggleDataKey: 'useInstructionsInput',
213
+ label: 'Instructions',
214
+ language: 'markdown',
215
+ helperMessage: 'The instructions for the assistant to use for the run. If empty, the instructions of the assistant will be used.',
216
+ },
217
+ {
218
+ type: 'toggle',
219
+ dataKey: 'useCodeInterpreterTool',
220
+ label: 'Code Interpreter Tool Enabled',
221
+ helperMessage: "Note: Only enabled if functions are provided. Otherwise, the assistant's settings will be used.",
222
+ },
223
+ {
224
+ type: 'toggle',
225
+ dataKey: 'useRetrievalTool',
226
+ label: 'Retrieval Tool Enabled',
227
+ helperMessage: "Note: Only enabled if functions are provided. Otherwise, the assistant's settings will be used.",
228
+ },
229
+ {
230
+ type: 'custom',
231
+ customEditorId: 'ToolCallHandlers',
232
+ label: 'Tool Call Handlers',
233
+ dataKey: 'toolCallHandlers',
234
+ helperMessage: 'Handles for each function tool call that the assistant has access to. Make sure you provide a subgraph handler for every possible tool call that can be performed. A special `unknown` handler can be used as a fallback for unconfigured tool calls.',
235
+ },
236
+ {
237
+ type: 'keyValuePair',
238
+ dataKey: 'metadata',
239
+ useInputToggleDataKey: 'useMetadataInput',
240
+ label: 'Metadata',
241
+ keyPlaceholder: 'Key',
242
+ valuePlaceholder: 'Value',
243
+ },
244
+ {
245
+ type: 'graphSelector',
246
+ dataKey: 'onMessageCreationSubgraphId',
247
+ label: 'On Message Creation Subgraph',
248
+ helperMessage: 'A subgraph to run when a message is created. The message will be available as `input` or `message` in the subgraph.',
249
+ },
250
+ ];
251
+ },
252
+ getBody(data, context) {
253
+ let body = dedent `
254
+ Assistant ID: ${data.useAssistantIdInput ? '(Assistant ID From Input)' : data.assistantId}
255
+ `;
256
+ const additional = [];
257
+ if (data.createThread) {
258
+ additional.push('Create New Thread');
259
+ }
260
+ else {
261
+ additional.push(`Thread ID: ${data.useThreadIdInput ? '(Thread ID From Input)' : data.threadId}`);
262
+ }
263
+ if (data.useModelInput || data.model) {
264
+ additional.push(`Model: ${data.useModelInput ? '(Model From Input)' : data.model}`);
265
+ }
266
+ if (data.useInstructionsInput || data.instructions?.trim()) {
267
+ additional.push(`Instructions: ${data.useInstructionsInput ? '(Instructions From Input)' : data.instructions}`);
268
+ }
269
+ if (data.useMetadataInput || data.metadata.length > 0) {
270
+ additional.push(`Metadata: ${data.useMetadataInput
271
+ ? '(Metadata From Input)'
272
+ : data.metadata.map(({ key, value }) => `${key}=${value}`).join(', ')}`);
273
+ }
274
+ if (data.useCodeInterpreterTool) {
275
+ additional.push('Code Interpreter Tool Enabled');
276
+ }
277
+ if (data.useRetrievalTool) {
278
+ additional.push('Retrieval Tool Enabled');
279
+ }
280
+ if (data.toolCallHandlers.length > 0) {
281
+ additional.push('Tool Call Handlers:');
282
+ data.toolCallHandlers.forEach(({ key, value }) => {
283
+ const subgraphName = context.project.graphs[value]?.metadata.name ?? 'Unknown Subgraph';
284
+ additional.push(` ${key || '(MISSING!)'} -> ${subgraphName}`);
285
+ });
286
+ }
287
+ if (data.onMessageCreationSubgraphId) {
288
+ const subgraphName = context.project.graphs[data.onMessageCreationSubgraphId]?.metadata.name ?? 'Unknown Subgraph';
289
+ additional.push(`On Message Creation Subgraph: ${subgraphName}`);
290
+ }
291
+ body = `${body}\n${additional.join('\n')}`;
292
+ return body;
293
+ },
294
+ async process(data, inputData, context) {
295
+ const threadId = getInputOrData(data, inputData, 'threadId');
296
+ const assistantId = getInputOrData(data, inputData, 'assistantId');
297
+ let metadata = data.metadata.reduce((acc, { key, value }) => {
298
+ acc[key] = value;
299
+ return acc;
300
+ }, {});
301
+ if (data.useMetadataInput && inputData['metadata']) {
302
+ metadata = coerceTypeOptional(inputData['metadata'], 'object');
303
+ }
304
+ const functionTools = coerceTypeOptional(inputData['functions'], 'gpt-function[]');
305
+ const tools = [...(functionTools?.map((f) => ({ type: 'function', function: f })) ?? [])];
306
+ if (tools.length) {
307
+ if (data.useCodeInterpreterTool) {
308
+ tools.push({ type: 'code_interpreter' });
309
+ }
310
+ if (data.useRetrievalTool) {
311
+ tools.push({ type: 'retrieval' });
312
+ }
313
+ }
314
+ const requestBody = {
315
+ assistant_id: assistantId,
316
+ model: getInputOrData(data, inputData, 'model'),
317
+ instructions: getInputOrData(data, inputData, 'instructions'),
318
+ tools: tools.length > 0 ? tools : undefined,
319
+ metadata,
320
+ };
321
+ if (!context.settings.openAiKey) {
322
+ throw new Error('OpenAI key is not set.');
323
+ }
324
+ let response;
325
+ const coerceToThreadMessage = (value) => {
326
+ if (!value?.value) {
327
+ return undefined;
328
+ }
329
+ if (value.type === 'string' || typeof value.value === 'string') {
330
+ return { role: 'user', content: value.value };
331
+ }
332
+ if (typeof value.value === 'object') {
333
+ if (!('role' in value.value)) {
334
+ throw new Error('Invalid message format - missing role.');
335
+ }
336
+ if (value.value.role !== 'user') {
337
+ throw new Error('Only user messages are supported.');
338
+ }
339
+ return value.value;
340
+ }
341
+ return { role: 'user', content: coerceTypeOptional(value, 'string') ?? '' };
342
+ };
343
+ if (data.createThread) {
344
+ const messagesInput = inputData['messages'];
345
+ const messages = messagesInput
346
+ ? arrayizeDataValue(unwrapDataValue(messagesInput)).map((message) => coerceToThreadMessage(message))
347
+ : [];
348
+ response = await fetch('https://api.openai.com/v1/threads/runs', {
349
+ method: 'POST',
350
+ headers: {
351
+ 'OpenAI-Beta': 'assistants=v1',
352
+ 'Content-Type': 'application/json',
353
+ Authorization: `Bearer ${context.settings.openAiKey}`,
354
+ 'OpenAI-Organization': context.settings.openAiOrganization ?? '',
355
+ },
356
+ body: JSON.stringify({
357
+ ...requestBody,
358
+ thread: {
359
+ messages,
360
+ // Thread metadata?
361
+ },
362
+ }),
363
+ });
364
+ }
365
+ else {
366
+ response = await fetch(`https://api.openai.com/v1/threads/${threadId}/runs`, {
367
+ method: 'POST',
368
+ headers: {
369
+ 'OpenAI-Beta': 'assistants=v1',
370
+ 'Content-Type': 'application/json',
371
+ Authorization: `Bearer ${context.settings.openAiKey}`,
372
+ 'OpenAI-Organization': context.settings.openAiOrganization ?? '',
373
+ },
374
+ body: JSON.stringify(requestBody),
375
+ });
376
+ }
377
+ await handleOpenAIError(response);
378
+ const body = (await response.json());
379
+ const pollController = new AbortController();
380
+ const pollRunSteps = async (onNewStepCompleted) => {
381
+ let lastCompletedAt = 0;
382
+ // On poll controller abort, continue so we get the final poll
383
+ const pollControllerAborted = new Promise((resolve) => pollController.signal.addEventListener('abort', () => resolve(undefined)));
384
+ // On main controller abort, reject
385
+ const mainGraphAborted = new Promise((_, reject) => context.signal.addEventListener('abort', () => reject(new Error('aborted'))));
386
+ while (!pollController.signal.aborted) {
387
+ // Delay at beginning because there won't be anything to start, and also this helps last poll get final data
388
+ await Promise.race([
389
+ // Poll frequency
390
+ new Promise((resolve) => setTimeout(resolve, POLL_FREQUENCY)),
391
+ pollControllerAborted,
392
+ mainGraphAborted,
393
+ ]);
394
+ const query = new URLSearchParams({
395
+ limit: '3',
396
+ order: 'desc',
397
+ });
398
+ const url = `https://api.openai.com/v1/threads/${body.thread_id}/runs/${body.id}/steps?${query.toString()}`;
399
+ const response = await fetch(url, {
400
+ method: 'GET',
401
+ headers: {
402
+ 'OpenAI-Beta': 'assistants=v1',
403
+ 'Content-Type': 'application/json',
404
+ Authorization: `Bearer ${context.settings.openAiKey}`,
405
+ 'OpenAI-Organization': context.settings.openAiOrganization ?? '',
406
+ },
407
+ });
408
+ await handleOpenAIError(response);
409
+ const stepListBody = (await response.json());
410
+ const newSteps = stepListBody.data.filter((step) => step.completed_at != null && step.completed_at > lastCompletedAt);
411
+ if (newSteps.length > 0) {
412
+ lastCompletedAt = newSteps[0].completed_at;
413
+ }
414
+ for (const newStep of newSteps) {
415
+ await onNewStepCompleted(newStep);
416
+ }
417
+ }
418
+ };
419
+ const pollRunStepsPromise = data.onMessageCreationSubgraphId
420
+ ? pollRunSteps(async (step) => {
421
+ if (step.step_details.type !== 'message_creation') {
422
+ return;
423
+ }
424
+ const messageId = step.step_details.message_creation.message_id;
425
+ const messageResponse = await fetch(`https://api.openai.com/v1/threads/${body.thread_id}/messages/${messageId}`, {
426
+ method: 'GET',
427
+ headers: {
428
+ 'OpenAI-Beta': 'assistants=v1',
429
+ 'Content-Type': 'application/json',
430
+ Authorization: `Bearer ${context.settings.openAiKey}`,
431
+ 'OpenAI-Organization': context.settings.openAiOrganization ?? '',
432
+ },
433
+ });
434
+ await handleOpenAIError(messageResponse);
435
+ const messageBody = (await messageResponse.json());
436
+ const inputs = {
437
+ input: {
438
+ type: 'object[]',
439
+ value: messageBody.content,
440
+ },
441
+ message: {
442
+ type: 'object',
443
+ value: messageBody,
444
+ },
445
+ message_id: {
446
+ type: 'string',
447
+ value: messageBody.id,
448
+ },
449
+ thread_id: {
450
+ type: 'string',
451
+ value: messageBody.thread_id,
452
+ },
453
+ };
454
+ const subprocessor = context.createSubProcessor(data.onMessageCreationSubgraphId, {
455
+ signal: context.signal,
456
+ });
457
+ await subprocessor.processGraph(context, inputs, context.contextValues);
458
+ })
459
+ : Promise.resolve();
460
+ let latestBody = body;
461
+ try {
462
+ while (latestBody.status === 'in_progress' ||
463
+ latestBody.status === 'queued' ||
464
+ latestBody.status === 'requires_action') {
465
+ const runResponse = await fetch(`https://api.openai.com/v1/threads/${body.thread_id}/runs/${body.id}`, {
466
+ method: 'GET',
467
+ headers: {
468
+ 'OpenAI-Beta': 'assistants=v1',
469
+ 'Content-Type': 'application/json',
470
+ Authorization: `Bearer ${context.settings.openAiKey}`,
471
+ 'OpenAI-Organization': context.settings.openAiOrganization ?? '',
472
+ },
473
+ });
474
+ await handleOpenAIError(runResponse);
475
+ latestBody = (await runResponse.json());
476
+ // Requires action, start calling subgraphs
477
+ if (latestBody.status === 'requires_action') {
478
+ const toolCalls = latestBody.required_action.submit_tool_outputs.tool_calls;
479
+ /** Run one subgraph per tool call requested */
480
+ const toolCallOutputs = await Promise.all(toolCalls.map(async (toolCall) => {
481
+ let inputArguments = {};
482
+ try {
483
+ inputArguments = JSON.parse(toolCall.function.arguments);
484
+ }
485
+ catch (err) {
486
+ // Ignore
487
+ }
488
+ const inputs = {
489
+ run_id: {
490
+ type: 'string',
491
+ value: latestBody.id,
492
+ },
493
+ run: {
494
+ type: 'object',
495
+ value: latestBody,
496
+ },
497
+ tool_call_id: {
498
+ type: 'string',
499
+ value: toolCall.id,
500
+ },
501
+ name: {
502
+ type: 'string',
503
+ value: toolCall.function.name,
504
+ },
505
+ arguments: {
506
+ type: 'object',
507
+ value: inputArguments,
508
+ },
509
+ input: {
510
+ type: 'object',
511
+ value: inputArguments,
512
+ },
513
+ };
514
+ let handlerSubgraphId = data.toolCallHandlers.find(({ key }) => key === toolCall.function.name)?.value;
515
+ // Fall back to "unknown" if it's present
516
+ if (!handlerSubgraphId) {
517
+ handlerSubgraphId = data.toolCallHandlers.find(({ key }) => key === 'unknown')?.value;
518
+ }
519
+ if (!handlerSubgraphId) {
520
+ throw new Error(`No handler found for tool call: ${toolCall.function.name}`);
521
+ }
522
+ const subprocessor = context.createSubProcessor(handlerSubgraphId, { signal: context.signal });
523
+ const outputs = await subprocessor.processGraph(context, inputs, context.contextValues);
524
+ const outputString = coerceTypeOptional(outputs.output, 'string');
525
+ return outputString ?? '';
526
+ }));
527
+ /** Collect all the subgraph outputs, then submit them. All outputs must be submitted in a single request, per documentation. */
528
+ const mappedToolCallOuptuts = toolCalls.map((toolCall, i) => ({
529
+ tool_call_id: toolCall.id,
530
+ output: toolCallOutputs[i],
531
+ }));
532
+ const submitResponse = await fetch(`https://api.openai.com/v1/threads/${body.thread_id}/runs/${body.id}/submit_tool_outputs`, {
533
+ method: 'POST',
534
+ headers: {
535
+ 'OpenAI-Beta': 'assistants=v1',
536
+ 'Content-Type': 'application/json',
537
+ Authorization: `Bearer ${context.settings.openAiKey}`,
538
+ 'OpenAI-Organization': context.settings.openAiOrganization ?? '',
539
+ },
540
+ body: JSON.stringify({
541
+ tool_outputs: mappedToolCallOuptuts,
542
+ }),
543
+ });
544
+ await handleOpenAIError(submitResponse);
545
+ }
546
+ await Promise.race([
547
+ new Promise((resolve) => setTimeout(resolve, POLL_FREQUENCY)),
548
+ new Promise((_, reject) => context.signal.addEventListener('abort', () => reject(new Error('aborted')))),
549
+ ]);
550
+ }
551
+ if (latestBody.status === 'cancelled' ||
552
+ latestBody.status === 'cancelling' ||
553
+ latestBody.status === 'expired' ||
554
+ latestBody.status === 'failed') {
555
+ throw new Error(`Run failed with status: ${latestBody.status}`);
556
+ }
557
+ const listStepsQuery = new URLSearchParams({
558
+ limit: '20',
559
+ order: 'desc',
560
+ });
561
+ const listStepsResponsePromise = await fetch(`https://api.openai.com/v1/threads/${body.thread_id}/runs/${body.id}/steps?${listStepsQuery.toString()}`, {
562
+ method: 'GET',
563
+ headers: {
564
+ 'OpenAI-Beta': 'assistants=v1',
565
+ 'Content-Type': 'application/json',
566
+ Authorization: `Bearer ${context.settings.openAiKey}`,
567
+ 'OpenAI-Organization': context.settings.openAiOrganization ?? '',
568
+ },
569
+ });
570
+ const getMessagesQuery = new URLSearchParams({
571
+ limit: '20',
572
+ order: 'desc',
573
+ });
574
+ const messagesResponsePromise = await fetch(`https://api.openai.com/v1/threads/${body.thread_id}/messages?${getMessagesQuery.toString()}`, {
575
+ method: 'GET',
576
+ headers: {
577
+ 'OpenAI-Beta': 'assistants=v1',
578
+ 'Content-Type': 'application/json',
579
+ Authorization: `Bearer ${context.settings.openAiKey}`,
580
+ 'OpenAI-Organization': context.settings.openAiOrganization ?? '',
581
+ },
582
+ });
583
+ const [listStepsResponse, messagesResponse] = await Promise.all([
584
+ listStepsResponsePromise,
585
+ messagesResponsePromise,
586
+ ]);
587
+ await handleOpenAIError(listStepsResponse);
588
+ await handleOpenAIError(messagesResponse);
589
+ const listStepsBody = (await listStepsResponse.json());
590
+ const messagesForThread = (await messagesResponse.json());
591
+ const lastUserMessageIndex = messagesForThread.data.findIndex((message) => message.role === 'user');
592
+ const lastAssistantMessages = messagesForThread.data.slice(0, lastUserMessageIndex);
593
+ return {
594
+ ['runId']: {
595
+ type: 'string',
596
+ value: latestBody.id,
597
+ },
598
+ ['run']: {
599
+ type: 'object',
600
+ value: latestBody,
601
+ },
602
+ ['steps']: {
603
+ type: 'object[]',
604
+ value: listStepsBody.data,
605
+ },
606
+ ['last_step']: {
607
+ type: 'object',
608
+ value: listStepsBody.data[0],
609
+ },
610
+ ['messages']: {
611
+ type: 'object[]',
612
+ value: messagesForThread.data,
613
+ },
614
+ ['last_message']: {
615
+ type: 'object',
616
+ value: messagesForThread.data[0],
617
+ },
618
+ ['last_assistant_messages']: {
619
+ type: 'object[]',
620
+ value: lastAssistantMessages,
621
+ },
622
+ };
623
+ }
624
+ finally {
625
+ pollController.abort();
626
+ await pollRunStepsPromise;
627
+ }
628
+ },
629
+ };
630
+ export const runThreadNode = pluginNodeDefinition(RunThreadNodeImpl, 'Run Thread');