@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,652 @@
1
+ import { uint8ArrayToBase64, } from '../../../index.js';
2
+ import { anthropicModelOptions, anthropicModels, streamChatCompletions, AnthropicError, streamMessageApi, callMessageApi, } from '../anthropic.js';
3
+ import { nanoid } from 'nanoid/non-secure';
4
+ import { dedent } from 'ts-dedent';
5
+ import retry from 'p-retry';
6
+ import { match } from 'ts-pattern';
7
+ import { coerceType, coerceTypeOptional } from '../../../utils/coerceType.js';
8
+ import { addWarning } from '../../../utils/outputs.js';
9
+ import { getError } from '../../../utils/errors.js';
10
+ import { pluginNodeDefinition } from '../../../model/NodeDefinition.js';
11
+ import { getScalarTypeOf, isArrayDataValue } from '../../../model/DataValue.js';
12
+ import { assertNever } from '../../../utils/assertNever.js';
13
+ import { isNotNull } from '../../../utils/genericUtilFunctions.js';
14
+ // Temporary
15
+ const cache = new Map();
16
+ export const ChatAnthropicNodeImpl = {
17
+ create() {
18
+ const chartNode = {
19
+ type: 'chatAnthropic',
20
+ title: 'Chat (Anthropic)',
21
+ id: nanoid(),
22
+ visualData: {
23
+ x: 0,
24
+ y: 0,
25
+ width: 275,
26
+ },
27
+ data: {
28
+ model: 'claude-3-5-sonnet-20240620',
29
+ useModelInput: false,
30
+ temperature: 0.5,
31
+ useTemperatureInput: false,
32
+ top_p: 1,
33
+ useTopPInput: false,
34
+ top_k: undefined,
35
+ useTopKInput: false,
36
+ useTopP: false,
37
+ useUseTopPInput: false,
38
+ maxTokens: 1024,
39
+ useMaxTokensInput: false,
40
+ useStop: false,
41
+ stop: '',
42
+ useStopInput: false,
43
+ cache: false,
44
+ useAsGraphPartialOutput: true,
45
+ enableToolUse: false,
46
+ },
47
+ };
48
+ return chartNode;
49
+ },
50
+ getInputDefinitions(data) {
51
+ const inputs = [];
52
+ if (data.model.startsWith('claude-3')) {
53
+ inputs.push({
54
+ dataType: 'string',
55
+ id: 'system',
56
+ title: 'System Prompt',
57
+ });
58
+ }
59
+ if (data.useModelInput) {
60
+ inputs.push({
61
+ id: 'model',
62
+ title: 'Model',
63
+ dataType: 'string',
64
+ required: false,
65
+ });
66
+ }
67
+ if (data.useTemperatureInput) {
68
+ inputs.push({
69
+ dataType: 'number',
70
+ id: 'temperature',
71
+ title: 'Temperature',
72
+ });
73
+ }
74
+ if (data.useTopPInput) {
75
+ inputs.push({
76
+ dataType: 'number',
77
+ id: 'top_p',
78
+ title: 'Top P',
79
+ });
80
+ }
81
+ if (data.useUseTopPInput) {
82
+ inputs.push({
83
+ dataType: 'boolean',
84
+ id: 'useTopP',
85
+ title: 'Use Top P',
86
+ });
87
+ }
88
+ if (data.useMaxTokensInput) {
89
+ inputs.push({
90
+ dataType: 'number',
91
+ id: 'maxTokens',
92
+ title: 'Max Tokens',
93
+ });
94
+ }
95
+ if (data.useStopInput) {
96
+ inputs.push({
97
+ dataType: 'string',
98
+ id: 'stop',
99
+ title: 'Stop',
100
+ });
101
+ }
102
+ inputs.push({
103
+ dataType: ['chat-message', 'chat-message[]'],
104
+ id: 'prompt',
105
+ title: 'Prompt',
106
+ });
107
+ if (data.enableToolUse) {
108
+ inputs.push({
109
+ dataType: ['gpt-function', 'gpt-function[]'],
110
+ id: 'tools',
111
+ title: 'Tools',
112
+ description: 'Tools to use in the model. To connect multiple tools, use an Array node.',
113
+ coerced: false,
114
+ });
115
+ }
116
+ return inputs;
117
+ },
118
+ getOutputDefinitions(data) {
119
+ const outputs = [];
120
+ outputs.push({
121
+ dataType: 'string',
122
+ id: 'response',
123
+ title: 'Response',
124
+ });
125
+ if (data.enableToolUse) {
126
+ outputs.push({
127
+ dataType: 'object[]',
128
+ id: 'function-calls',
129
+ title: 'Function Calls',
130
+ description: 'The function calls that were made, if any.',
131
+ });
132
+ }
133
+ outputs.push({
134
+ dataType: 'chat-message[]',
135
+ id: 'all-messages',
136
+ title: 'All Messages',
137
+ description: 'All messages, with the response appended.',
138
+ });
139
+ return outputs;
140
+ },
141
+ getBody(data) {
142
+ const modelName = anthropicModels[data.model]?.displayName ?? 'Unknown Model';
143
+ return dedent `
144
+ ${modelName}
145
+ ${data.useTopP
146
+ ? `Top P: ${data.useTopPInput ? '(Using Input)' : data.top_p}`
147
+ : `Temperature: ${data.useTemperatureInput ? '(Using Input)' : data.temperature}`}
148
+ Max Tokens: ${data.maxTokens}
149
+ ${data.useStop ? `Stop: ${data.useStopInput ? '(Using Input)' : data.stop}` : ''}
150
+ `;
151
+ },
152
+ getEditors() {
153
+ return [
154
+ {
155
+ type: 'dropdown',
156
+ label: 'Model',
157
+ dataKey: 'model',
158
+ useInputToggleDataKey: 'useModelInput',
159
+ options: anthropicModelOptions,
160
+ },
161
+ {
162
+ type: 'number',
163
+ label: 'Temperature',
164
+ dataKey: 'temperature',
165
+ useInputToggleDataKey: 'useTemperatureInput',
166
+ min: 0,
167
+ max: 2,
168
+ step: 0.1,
169
+ },
170
+ {
171
+ type: 'number',
172
+ label: 'Top P',
173
+ dataKey: 'top_p',
174
+ useInputToggleDataKey: 'useTopPInput',
175
+ min: 0,
176
+ max: 1,
177
+ step: 0.1,
178
+ },
179
+ {
180
+ type: 'toggle',
181
+ label: 'Use Top P',
182
+ dataKey: 'useTopP',
183
+ useInputToggleDataKey: 'useUseTopPInput',
184
+ },
185
+ {
186
+ type: 'number',
187
+ label: 'Max Tokens',
188
+ dataKey: 'maxTokens',
189
+ useInputToggleDataKey: 'useMaxTokensInput',
190
+ min: 0,
191
+ max: Number.MAX_SAFE_INTEGER,
192
+ step: 1,
193
+ },
194
+ {
195
+ type: 'string',
196
+ label: 'Stop',
197
+ dataKey: 'stop',
198
+ useInputToggleDataKey: 'useStopInput',
199
+ },
200
+ {
201
+ type: 'toggle',
202
+ label: 'Cache (same inputs, same outputs)',
203
+ dataKey: 'cache',
204
+ },
205
+ {
206
+ type: 'toggle',
207
+ label: 'Use for subgraph partial output',
208
+ dataKey: 'useAsGraphPartialOutput',
209
+ },
210
+ {
211
+ type: 'toggle',
212
+ label: 'Enable Tool Use (disables streaming)',
213
+ dataKey: 'enableToolUse',
214
+ },
215
+ ];
216
+ },
217
+ getUIData() {
218
+ return {
219
+ infoBoxBody: dedent `
220
+ Makes a call to an Anthropic chat model. The settings contains many options for tweaking the model's behavior.
221
+ `,
222
+ infoBoxTitle: 'Chat (Anthropic) Node',
223
+ contextMenuTitle: 'Chat (Anthropic)',
224
+ group: ['AI'],
225
+ };
226
+ },
227
+ async process(data, inputs, context) {
228
+ if (context.executor === 'browser') {
229
+ throw new Error('This node requires using the Node executor');
230
+ }
231
+ const output = {};
232
+ const rawModel = data.useModelInput
233
+ ? coerceTypeOptional(inputs['model'], 'string') ?? data.model
234
+ : data.model;
235
+ const model = rawModel;
236
+ const temperature = data.useTemperatureInput
237
+ ? coerceTypeOptional(inputs['temperature'], 'number') ?? data.temperature
238
+ : data.temperature;
239
+ const topP = data.useTopPInput ? coerceTypeOptional(inputs['top_p'], 'number') ?? data.top_p : data.top_p;
240
+ const useTopP = data.useUseTopPInput
241
+ ? coerceTypeOptional(inputs['useTopP'], 'boolean') ?? data.useTopP
242
+ : data.useTopP;
243
+ const stop = data.useStopInput
244
+ ? data.useStop
245
+ ? coerceTypeOptional(inputs['stop'], 'string') ?? data.stop
246
+ : undefined
247
+ : data.stop;
248
+ const tools = data.enableToolUse
249
+ ? coerceTypeOptional(inputs['tools'], 'gpt-function[]') ?? []
250
+ : undefined;
251
+ const rivetChatMessages = getChatMessages(inputs);
252
+ const messages = await chatMessagesToClaude3ChatMessages(rivetChatMessages);
253
+ let prompt = messages.reduce((acc, message) => {
254
+ const content = typeof message.content === 'string'
255
+ ? message.content
256
+ : message.content
257
+ .filter((c) => c.type === 'text')
258
+ .map((c) => c.text ?? '')
259
+ .join('');
260
+ if (message.role === 'user') {
261
+ return `${acc}\n\nHuman: ${content}`;
262
+ }
263
+ else if (message.role === 'assistant') {
264
+ return `${acc}\n\nAssistant: ${content}`;
265
+ }
266
+ return acc;
267
+ }, '');
268
+ prompt += '\n\nAssistant:';
269
+ // Get the "System" prompt input for Claude 3 models
270
+ const system = data.model.startsWith('claude-3') ? getSystemPrompt(inputs) : undefined;
271
+ let { maxTokens } = data;
272
+ const tokenizerInfo = {
273
+ node: context.node,
274
+ model,
275
+ endpoint: undefined,
276
+ };
277
+ const tokenCountEstimate = await context.tokenizer.getTokenCountForString(prompt, tokenizerInfo);
278
+ const modelInfo = anthropicModels[model] ?? {
279
+ maxTokens: Number.MAX_SAFE_INTEGER,
280
+ cost: {
281
+ prompt: 0,
282
+ completion: 0,
283
+ },
284
+ };
285
+ if (tokenCountEstimate >= modelInfo.maxTokens) {
286
+ throw new Error(`The model ${model} can only handle ${modelInfo.maxTokens} tokens, but ${tokenCountEstimate} were provided in the prompts alone.`);
287
+ }
288
+ if (tokenCountEstimate + maxTokens > modelInfo.maxTokens) {
289
+ const message = `The model can only handle a maximum of ${modelInfo.maxTokens} tokens, but the prompts and max tokens together exceed this limit. The max tokens has been reduced to ${modelInfo.maxTokens - tokenCountEstimate}.`;
290
+ addWarning(output, message);
291
+ maxTokens = Math.floor((modelInfo.maxTokens - tokenCountEstimate) * 0.95); // reduce max tokens by 5% to be safe, calculation is a little wrong.
292
+ }
293
+ try {
294
+ return await retry(async () => {
295
+ const completionOptions = {
296
+ model,
297
+ temperature: useTopP ? undefined : temperature,
298
+ top_p: useTopP ? topP : undefined,
299
+ max_tokens_to_sample: maxTokens ?? modelInfo.maxTokens,
300
+ stop_sequences: stop ? [stop] : undefined,
301
+ prompt,
302
+ };
303
+ const messageOptions = {
304
+ model,
305
+ temperature: useTopP ? undefined : temperature,
306
+ top_p: useTopP ? topP : undefined,
307
+ max_tokens: maxTokens ?? modelInfo.maxTokens,
308
+ stop_sequences: stop ? [stop] : undefined,
309
+ system: system,
310
+ messages,
311
+ tools: tools
312
+ ? tools.map((tool) => ({ name: tool.name, description: tool.description, input_schema: tool.parameters }))
313
+ : undefined,
314
+ };
315
+ const useMessageApi = model.startsWith('claude-3');
316
+ const cacheKey = JSON.stringify(useMessageApi ? messageOptions : completionOptions);
317
+ if (data.cache) {
318
+ const cached = cache.get(cacheKey);
319
+ if (cached) {
320
+ return cached;
321
+ }
322
+ }
323
+ const startTime = Date.now();
324
+ const apiKey = context.getPluginConfig('anthropicApiKey');
325
+ if (useMessageApi && data.enableToolUse) {
326
+ // Streaming is not supported with tool usage.
327
+ const response = await callMessageApi({
328
+ apiKey: apiKey ?? '',
329
+ ...messageOptions,
330
+ });
331
+ const { input_tokens: requestTokens, output_tokens: responseTokens } = response.usage;
332
+ const responseText = response.content
333
+ .map((c) => c.text)
334
+ .filter(isNotNull)
335
+ .join('');
336
+ output['response'] = {
337
+ type: 'string',
338
+ value: responseText,
339
+ };
340
+ const functionCalls = response.content
341
+ .filter((content) => content.name && content.id)
342
+ .map((functionCall) => ({
343
+ name: functionCall.name,
344
+ arguments: functionCall.input, // Matches OpenAI ChatNode
345
+ id: functionCall.id,
346
+ }));
347
+ if (functionCalls.length > 0) {
348
+ output['function-calls'] = {
349
+ type: 'object[]',
350
+ value: functionCalls,
351
+ };
352
+ }
353
+ output['all-messages'] = {
354
+ type: 'chat-message[]',
355
+ value: [
356
+ ...rivetChatMessages,
357
+ {
358
+ type: 'assistant',
359
+ message: responseText,
360
+ function_call: functionCalls.length > 0
361
+ ? functionCalls.map((toolCall) => ({
362
+ name: toolCall.name,
363
+ arguments: JSON.stringify(toolCall.arguments),
364
+ id: toolCall.id,
365
+ }))[0]
366
+ : undefined,
367
+ function_calls: functionCalls.map((toolCall) => ({
368
+ name: toolCall.name,
369
+ arguments: JSON.stringify(toolCall.arguments),
370
+ id: toolCall.id,
371
+ })),
372
+ },
373
+ ],
374
+ };
375
+ output['requestTokens'] = { type: 'number', value: requestTokens ?? tokenCountEstimate };
376
+ const responseTokenCount = responseTokens ?? context.tokenizer.getTokenCountForString(responseText, tokenizerInfo);
377
+ output['responseTokens'] = { type: 'number', value: responseTokenCount };
378
+ }
379
+ else if (useMessageApi) {
380
+ // Use the messages API for Claude 3 models
381
+ const chunks = streamMessageApi({
382
+ apiKey: apiKey ?? '',
383
+ signal: context.signal,
384
+ ...messageOptions,
385
+ });
386
+ // Process the response chunks and update the output
387
+ const responseParts = [];
388
+ let requestTokens = undefined, responseTokens = undefined;
389
+ for await (const chunk of chunks) {
390
+ let completion = '';
391
+ if (chunk.type === 'content_block_start') {
392
+ completion = chunk.content_block.text;
393
+ }
394
+ else if (chunk.type === 'content_block_delta') {
395
+ completion = chunk.delta.text;
396
+ }
397
+ else if (chunk.type === 'message_start' && chunk.message?.usage?.input_tokens) {
398
+ requestTokens = chunk.message.usage.input_tokens;
399
+ }
400
+ else if (chunk.type === 'message_delta' && chunk.delta?.usage?.output_tokens) {
401
+ responseTokens = chunk.delta.usage.output_tokens;
402
+ }
403
+ if (!completion) {
404
+ continue;
405
+ }
406
+ responseParts.push(completion);
407
+ output['response'] = {
408
+ type: 'string',
409
+ value: responseParts.join('').trim(),
410
+ };
411
+ output['all-messages'] = {
412
+ type: 'chat-message[]',
413
+ value: [
414
+ ...rivetChatMessages,
415
+ {
416
+ type: 'assistant',
417
+ message: responseParts.join('').trim(),
418
+ function_call: undefined,
419
+ function_calls: undefined,
420
+ },
421
+ ],
422
+ };
423
+ context.onPartialOutputs?.(output);
424
+ }
425
+ if (responseParts.length === 0) {
426
+ throw new Error('No response from Anthropic');
427
+ }
428
+ output['requestTokens'] = { type: 'number', value: requestTokens ?? tokenCountEstimate };
429
+ const responseTokenCount = responseTokens ?? (await context.tokenizer.getTokenCountForString(responseParts.join(''), tokenizerInfo));
430
+ output['responseTokens'] = { type: 'number', value: responseTokenCount };
431
+ }
432
+ else {
433
+ // Use the normal chat completion method for non-Claude 3 models
434
+ const chunks = streamChatCompletions({
435
+ apiKey: apiKey ?? '',
436
+ signal: context.signal,
437
+ ...completionOptions,
438
+ });
439
+ // Process the response chunks and update the output
440
+ const responseParts = [];
441
+ for await (const chunk of chunks) {
442
+ if (!chunk.completion) {
443
+ continue;
444
+ }
445
+ responseParts.push(chunk.completion);
446
+ output['response'] = {
447
+ type: 'string',
448
+ value: responseParts.join('').trim(),
449
+ };
450
+ context.onPartialOutputs?.(output);
451
+ }
452
+ if (responseParts.length === 0) {
453
+ throw new Error('No response from Anthropic');
454
+ }
455
+ output['all-messages'] = {
456
+ type: 'chat-message[]',
457
+ value: [
458
+ ...rivetChatMessages,
459
+ {
460
+ type: 'assistant',
461
+ message: responseParts.join('').trim(),
462
+ function_call: undefined,
463
+ function_calls: undefined,
464
+ },
465
+ ],
466
+ };
467
+ output['requestTokens'] = { type: 'number', value: tokenCountEstimate };
468
+ const responseTokenCount = await context.tokenizer.getTokenCountForString(responseParts.join(''), tokenizerInfo);
469
+ output['responseTokens'] = { type: 'number', value: responseTokenCount };
470
+ }
471
+ const cost = getCostForTokens({
472
+ requestTokens: output['requestTokens']?.value,
473
+ responseTokens: output['responseTokens']?.value,
474
+ }, model);
475
+ if (cost != null) {
476
+ output['cost'] = { type: 'number', value: cost };
477
+ }
478
+ const endTime = Date.now();
479
+ const duration = endTime - startTime;
480
+ output['duration'] = { type: 'number', value: duration };
481
+ Object.freeze(output);
482
+ cache.set(cacheKey, output);
483
+ return output;
484
+ }, {
485
+ forever: true,
486
+ retries: 10000,
487
+ maxRetryTime: 1000 * 60 * 5,
488
+ factor: 2.5,
489
+ minTimeout: 500,
490
+ maxTimeout: 5000,
491
+ randomize: true,
492
+ signal: context.signal,
493
+ onFailedAttempt(err) {
494
+ context.trace(`ChatAnthropicNode failed, retrying: ${err.toString()}`);
495
+ if (context.signal.aborted) {
496
+ throw new Error('Aborted');
497
+ }
498
+ if (err instanceof AnthropicError) {
499
+ if (err.response.status >= 400 && err.response.status < 500) {
500
+ if (err.responseJson.error?.message) {
501
+ throw new Error(err.responseJson.error.message);
502
+ }
503
+ }
504
+ }
505
+ },
506
+ });
507
+ }
508
+ catch (error) {
509
+ context.trace(getError(error).stack ?? 'Missing stack');
510
+ throw new Error(`Error processing ChatAnthropicNode: ${error.message}`);
511
+ }
512
+ },
513
+ };
514
+ export const chatAnthropicNode = pluginNodeDefinition(ChatAnthropicNodeImpl, 'Chat');
515
+ export function getSystemPrompt(inputs) {
516
+ const system = coerceTypeOptional(inputs['system'], 'string');
517
+ if (system) {
518
+ return system;
519
+ }
520
+ const prompt = inputs['prompt'];
521
+ if (prompt && prompt.type === 'chat-message[]') {
522
+ const systemMessage = prompt.value.find((message) => message.type === 'system');
523
+ if (systemMessage) {
524
+ if (typeof systemMessage.message === 'string') {
525
+ return systemMessage.message;
526
+ }
527
+ else if (Array.isArray(systemMessage.message)) {
528
+ return systemMessage.message.filter((p) => typeof p === 'string').join('');
529
+ }
530
+ }
531
+ }
532
+ }
533
+ function getChatMessages(inputs) {
534
+ const prompt = inputs['prompt'];
535
+ if (!prompt) {
536
+ throw new Error('Prompt is required');
537
+ }
538
+ const chatMessages = match(prompt)
539
+ .with({ type: 'chat-message' }, (p) => [p.value])
540
+ .with({ type: 'chat-message[]' }, (p) => p.value)
541
+ .with({ type: 'string' }, (p) => [{ type: 'user', message: p.value }])
542
+ .with({ type: 'string[]' }, (p) => p.value.map((v) => ({ type: 'user', message: v })))
543
+ .otherwise((p) => {
544
+ if (isArrayDataValue(p)) {
545
+ const stringValues = p.value.map((v) => coerceType({
546
+ type: getScalarTypeOf(p.type),
547
+ value: v,
548
+ }, 'string'));
549
+ return stringValues.filter((v) => v != null).map((v) => ({ type: 'user', message: v }));
550
+ }
551
+ const coercedMessage = coerceType(p, 'chat-message');
552
+ if (coercedMessage != null) {
553
+ return [coercedMessage];
554
+ }
555
+ const coercedString = coerceType(p, 'string');
556
+ return coercedString != null ? [{ type: 'user', message: coerceType(p, 'string') }] : [];
557
+ });
558
+ return chatMessages;
559
+ }
560
+ export async function chatMessagesToClaude3ChatMessages(chatMessages) {
561
+ const messages = (await Promise.all(chatMessages.map(chatMessageToClaude3ChatMessage))).filter(isNotNull);
562
+ // Combine sequential tool_result messages into a single user message with multiple content items
563
+ const combinedMessages = messages.reduce((acc, message) => {
564
+ if (message.role === 'user' &&
565
+ Array.isArray(message.content) &&
566
+ message.content.length === 1 &&
567
+ message.content[0].type === 'tool_result') {
568
+ const last = acc.at(-1);
569
+ if (last?.role === 'user' && Array.isArray(last.content) && last.content.every((c) => c.type === 'tool_result')) {
570
+ const mc = message.content;
571
+ const content = last.content.concat(mc);
572
+ return [...acc.slice(0, -1), { ...last, content }];
573
+ }
574
+ }
575
+ return [...acc, message];
576
+ }, []);
577
+ return combinedMessages;
578
+ }
579
+ async function chatMessageToClaude3ChatMessage(message) {
580
+ if (message.type === 'system') {
581
+ return undefined;
582
+ }
583
+ if (message.type === 'function') {
584
+ // Interpret function messages as user messages with tool_result content items (making Claude API more similar to OpenAI's)
585
+ const content = (Array.isArray(message.message) ? message.message : [message.message])
586
+ .map((m) => (typeof m === 'string' ? { type: 'text', text: m } : undefined))
587
+ .filter(isNotNull);
588
+ return {
589
+ role: 'user',
590
+ content: [
591
+ {
592
+ type: 'tool_result',
593
+ tool_use_id: message.name,
594
+ content: content.length === 1 ? content[0].text : content,
595
+ },
596
+ ],
597
+ };
598
+ }
599
+ const content = Array.isArray(message.message)
600
+ ? await Promise.all(message.message.map(chatMessageContentToClaude3ChatMessage))
601
+ : [await chatMessageContentToClaude3ChatMessage(message.message)];
602
+ if (message.type === 'assistant' && message.function_calls) {
603
+ content.push(...message.function_calls.map((fc) => ({
604
+ type: 'tool_use',
605
+ id: fc.id,
606
+ name: fc.name,
607
+ input: JSON.parse(fc.arguments),
608
+ })));
609
+ }
610
+ else if (message.type === 'assistant' && message.function_call) {
611
+ content.push({
612
+ type: 'tool_use',
613
+ id: message.function_call.id,
614
+ name: message.function_call.name,
615
+ input: JSON.parse(message.function_call.arguments),
616
+ });
617
+ }
618
+ return {
619
+ role: message.type,
620
+ content,
621
+ };
622
+ }
623
+ async function chatMessageContentToClaude3ChatMessage(content) {
624
+ if (typeof content === 'string') {
625
+ return {
626
+ type: 'text',
627
+ text: content,
628
+ };
629
+ }
630
+ switch (content.type) {
631
+ case 'image':
632
+ return {
633
+ type: 'image',
634
+ source: {
635
+ type: 'base64',
636
+ media_type: content.mediaType,
637
+ data: (await uint8ArrayToBase64(content.data)) ?? '',
638
+ },
639
+ };
640
+ case 'url':
641
+ throw new Error('unable to convert urls for Claude');
642
+ default:
643
+ assertNever(content);
644
+ }
645
+ }
646
+ function getCostForTokens(tokenCounts, model) {
647
+ const modelInfo = anthropicModels[model];
648
+ if (modelInfo == null) {
649
+ return undefined;
650
+ }
651
+ return modelInfo.cost.prompt * tokenCounts.requestTokens + modelInfo.cost.completion * tokenCounts.responseTokens;
652
+ }
@@ -0,0 +1,18 @@
1
+ import {} from '../../index.js';
2
+ import { chatAnthropicNode } from './nodes/ChatAnthropicNode.js';
3
+ export const anthropicPlugin = {
4
+ id: 'anthropic',
5
+ name: 'Anthropic',
6
+ register: (register) => {
7
+ register(chatAnthropicNode);
8
+ },
9
+ configSpec: {
10
+ anthropicApiKey: {
11
+ type: 'string',
12
+ label: 'Anthropic API Key',
13
+ description: 'The API key for the Anthropic service.',
14
+ pullEnvironmentVariable: 'ANTHROPIC_API_KEY',
15
+ helperText: 'You may also set the ANTHROPIC_API_KEY environment variable.',
16
+ },
17
+ },
18
+ };