@smythos/sre 1.5.44 → 1.5.45

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 (227) hide show
  1. package/CHANGELOG +90 -90
  2. package/LICENSE +18 -18
  3. package/README.md +135 -135
  4. package/dist/index.js +3 -3
  5. package/dist/index.js.map +1 -1
  6. package/dist/types/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.d.ts +13 -1
  7. package/dist/types/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ResponsesApiInterface.d.ts +46 -27
  8. package/dist/types/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.d.ts +4 -2
  9. package/dist/types/subsystems/LLMManager/LLM.service/connectors/openai/types.d.ts +0 -4
  10. package/dist/types/subsystems/LLMManager/ModelsProvider.service/connectors/SmythModelsProvider.class.d.ts +39 -0
  11. package/dist/types/types/LLM.types.d.ts +1 -0
  12. package/package.json +1 -1
  13. package/src/Components/APICall/APICall.class.ts +156 -156
  14. package/src/Components/APICall/AccessTokenManager.ts +130 -130
  15. package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -58
  16. package/src/Components/APICall/OAuth.helper.ts +294 -294
  17. package/src/Components/APICall/mimeTypeCategories.ts +46 -46
  18. package/src/Components/APICall/parseData.ts +167 -167
  19. package/src/Components/APICall/parseHeaders.ts +41 -41
  20. package/src/Components/APICall/parseProxy.ts +68 -68
  21. package/src/Components/APICall/parseUrl.ts +91 -91
  22. package/src/Components/APIEndpoint.class.ts +234 -234
  23. package/src/Components/APIOutput.class.ts +58 -58
  24. package/src/Components/AgentPlugin.class.ts +102 -102
  25. package/src/Components/Async.class.ts +155 -155
  26. package/src/Components/Await.class.ts +90 -90
  27. package/src/Components/Classifier.class.ts +158 -158
  28. package/src/Components/Component.class.ts +132 -132
  29. package/src/Components/ComponentHost.class.ts +38 -38
  30. package/src/Components/DataSourceCleaner.class.ts +92 -92
  31. package/src/Components/DataSourceIndexer.class.ts +181 -181
  32. package/src/Components/DataSourceLookup.class.ts +161 -161
  33. package/src/Components/ECMASandbox.class.ts +71 -71
  34. package/src/Components/FEncDec.class.ts +29 -29
  35. package/src/Components/FHash.class.ts +33 -33
  36. package/src/Components/FSign.class.ts +80 -80
  37. package/src/Components/FSleep.class.ts +25 -25
  38. package/src/Components/FTimestamp.class.ts +25 -25
  39. package/src/Components/FileStore.class.ts +78 -78
  40. package/src/Components/ForEach.class.ts +97 -97
  41. package/src/Components/GPTPlugin.class.ts +70 -70
  42. package/src/Components/GenAILLM.class.ts +586 -586
  43. package/src/Components/HuggingFace.class.ts +314 -314
  44. package/src/Components/Image/imageSettings.config.ts +70 -70
  45. package/src/Components/ImageGenerator.class.ts +502 -502
  46. package/src/Components/JSONFilter.class.ts +54 -54
  47. package/src/Components/LLMAssistant.class.ts +213 -213
  48. package/src/Components/LogicAND.class.ts +28 -28
  49. package/src/Components/LogicAtLeast.class.ts +85 -85
  50. package/src/Components/LogicAtMost.class.ts +86 -86
  51. package/src/Components/LogicOR.class.ts +29 -29
  52. package/src/Components/LogicXOR.class.ts +34 -34
  53. package/src/Components/MCPClient.class.ts +112 -112
  54. package/src/Components/MemoryDeleteKeyVal.class.ts +70 -70
  55. package/src/Components/MemoryReadKeyVal.class.ts +66 -66
  56. package/src/Components/MemoryWriteKeyVal.class.ts +62 -62
  57. package/src/Components/MemoryWriteObject.class.ts +97 -97
  58. package/src/Components/MultimodalLLM.class.ts +128 -128
  59. package/src/Components/OpenAPI.class.ts +72 -72
  60. package/src/Components/PromptGenerator.class.ts +122 -122
  61. package/src/Components/ScrapflyWebScrape.class.ts +159 -159
  62. package/src/Components/ServerlessCode.class.ts +123 -123
  63. package/src/Components/TavilyWebSearch.class.ts +98 -98
  64. package/src/Components/VisionLLM.class.ts +104 -104
  65. package/src/Components/ZapierAction.class.ts +127 -127
  66. package/src/Components/index.ts +97 -97
  67. package/src/Core/AgentProcess.helper.ts +240 -240
  68. package/src/Core/Connector.class.ts +123 -123
  69. package/src/Core/ConnectorsService.ts +197 -197
  70. package/src/Core/DummyConnector.ts +49 -49
  71. package/src/Core/HookService.ts +105 -105
  72. package/src/Core/SmythRuntime.class.ts +235 -235
  73. package/src/Core/SystemEvents.ts +16 -16
  74. package/src/Core/boot.ts +56 -56
  75. package/src/config.ts +15 -15
  76. package/src/constants.ts +126 -126
  77. package/src/data/hugging-face.params.json +579 -579
  78. package/src/helpers/AWSLambdaCode.helper.ts +587 -587
  79. package/src/helpers/BinaryInput.helper.ts +331 -331
  80. package/src/helpers/Conversation.helper.ts +1119 -1119
  81. package/src/helpers/ECMASandbox.helper.ts +54 -54
  82. package/src/helpers/JsonContent.helper.ts +97 -97
  83. package/src/helpers/LocalCache.helper.ts +97 -97
  84. package/src/helpers/Log.helper.ts +274 -274
  85. package/src/helpers/OpenApiParser.helper.ts +150 -150
  86. package/src/helpers/S3Cache.helper.ts +147 -147
  87. package/src/helpers/SmythURI.helper.ts +5 -5
  88. package/src/helpers/Sysconfig.helper.ts +77 -77
  89. package/src/helpers/TemplateString.helper.ts +243 -243
  90. package/src/helpers/TypeChecker.helper.ts +329 -329
  91. package/src/index.ts +196 -196
  92. package/src/index.ts.bak +196 -196
  93. package/src/subsystems/AgentManager/Agent.class.ts +1114 -1114
  94. package/src/subsystems/AgentManager/Agent.helper.ts +3 -3
  95. package/src/subsystems/AgentManager/AgentData.service/AgentDataConnector.ts +230 -230
  96. package/src/subsystems/AgentManager/AgentData.service/connectors/CLIAgentDataConnector.class.ts +66 -66
  97. package/src/subsystems/AgentManager/AgentData.service/connectors/LocalAgentDataConnector.class.ts +142 -142
  98. package/src/subsystems/AgentManager/AgentData.service/connectors/NullAgentData.class.ts +39 -39
  99. package/src/subsystems/AgentManager/AgentData.service/index.ts +18 -18
  100. package/src/subsystems/AgentManager/AgentLogger.class.ts +297 -297
  101. package/src/subsystems/AgentManager/AgentRequest.class.ts +51 -51
  102. package/src/subsystems/AgentManager/AgentRuntime.class.ts +559 -559
  103. package/src/subsystems/AgentManager/AgentSSE.class.ts +101 -101
  104. package/src/subsystems/AgentManager/AgentSettings.class.ts +52 -52
  105. package/src/subsystems/AgentManager/Component.service/ComponentConnector.ts +32 -32
  106. package/src/subsystems/AgentManager/Component.service/connectors/LocalComponentConnector.class.ts +60 -60
  107. package/src/subsystems/AgentManager/Component.service/index.ts +11 -11
  108. package/src/subsystems/AgentManager/EmbodimentSettings.class.ts +47 -47
  109. package/src/subsystems/AgentManager/ForkedAgent.class.ts +154 -154
  110. package/src/subsystems/AgentManager/OSResourceMonitor.ts +77 -77
  111. package/src/subsystems/ComputeManager/Code.service/CodeConnector.ts +98 -98
  112. package/src/subsystems/ComputeManager/Code.service/connectors/AWSLambdaCode.class.ts +172 -172
  113. package/src/subsystems/ComputeManager/Code.service/connectors/ECMASandbox.class.ts +131 -131
  114. package/src/subsystems/ComputeManager/Code.service/index.ts +13 -13
  115. package/src/subsystems/IO/CLI.service/CLIConnector.ts +47 -47
  116. package/src/subsystems/IO/CLI.service/index.ts +9 -9
  117. package/src/subsystems/IO/Log.service/LogConnector.ts +32 -32
  118. package/src/subsystems/IO/Log.service/connectors/ConsoleLog.class.ts +28 -28
  119. package/src/subsystems/IO/Log.service/index.ts +13 -13
  120. package/src/subsystems/IO/NKV.service/NKVConnector.ts +43 -43
  121. package/src/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.ts +234 -234
  122. package/src/subsystems/IO/NKV.service/connectors/NKVRAM.class.ts +204 -204
  123. package/src/subsystems/IO/NKV.service/connectors/NKVRedis.class.ts +182 -182
  124. package/src/subsystems/IO/NKV.service/index.ts +14 -14
  125. package/src/subsystems/IO/Router.service/RouterConnector.ts +21 -21
  126. package/src/subsystems/IO/Router.service/connectors/ExpressRouter.class.ts +48 -48
  127. package/src/subsystems/IO/Router.service/connectors/NullRouter.class.ts +40 -40
  128. package/src/subsystems/IO/Router.service/index.ts +11 -11
  129. package/src/subsystems/IO/Storage.service/SmythFS.class.ts +489 -489
  130. package/src/subsystems/IO/Storage.service/StorageConnector.ts +66 -66
  131. package/src/subsystems/IO/Storage.service/connectors/LocalStorage.class.ts +327 -327
  132. package/src/subsystems/IO/Storage.service/connectors/S3Storage.class.ts +482 -482
  133. package/src/subsystems/IO/Storage.service/index.ts +13 -13
  134. package/src/subsystems/IO/VectorDB.service/VectorDBConnector.ts +108 -108
  135. package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +454 -454
  136. package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +384 -384
  137. package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +421 -421
  138. package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +107 -107
  139. package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +109 -109
  140. package/src/subsystems/IO/VectorDB.service/embed/index.ts +21 -21
  141. package/src/subsystems/IO/VectorDB.service/index.ts +14 -14
  142. package/src/subsystems/LLMManager/LLM.helper.ts +251 -251
  143. package/src/subsystems/LLMManager/LLM.inference.ts +339 -339
  144. package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +489 -489
  145. package/src/subsystems/LLMManager/LLM.service/LLMCredentials.helper.ts +171 -171
  146. package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +659 -659
  147. package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +400 -400
  148. package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +77 -77
  149. package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +757 -757
  150. package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +304 -304
  151. package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +250 -250
  152. package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +423 -423
  153. package/src/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.ts +488 -455
  154. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ChatCompletionsApiInterface.ts +528 -528
  155. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterface.ts +100 -100
  156. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterfaceFactory.ts +81 -81
  157. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ResponsesApiInterface.ts +1168 -862
  158. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.ts +13 -37
  159. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/index.ts +4 -4
  160. package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/utils.ts +11 -11
  161. package/src/subsystems/LLMManager/LLM.service/connectors/openai/types.ts +32 -37
  162. package/src/subsystems/LLMManager/LLM.service/connectors/xAI.class.ts +471 -471
  163. package/src/subsystems/LLMManager/LLM.service/index.ts +44 -44
  164. package/src/subsystems/LLMManager/ModelsProvider.service/ModelsProviderConnector.ts +300 -300
  165. package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts +252 -252
  166. package/src/subsystems/LLMManager/ModelsProvider.service/index.ts +11 -11
  167. package/src/subsystems/LLMManager/custom-models.ts +854 -854
  168. package/src/subsystems/LLMManager/models.ts +2540 -2540
  169. package/src/subsystems/LLMManager/paramMappings.ts +69 -69
  170. package/src/subsystems/MemoryManager/Cache.service/CacheConnector.ts +86 -86
  171. package/src/subsystems/MemoryManager/Cache.service/connectors/LocalStorageCache.class.ts +297 -297
  172. package/src/subsystems/MemoryManager/Cache.service/connectors/RAMCache.class.ts +201 -201
  173. package/src/subsystems/MemoryManager/Cache.service/connectors/RedisCache.class.ts +252 -252
  174. package/src/subsystems/MemoryManager/Cache.service/connectors/S3Cache.class.ts +373 -373
  175. package/src/subsystems/MemoryManager/Cache.service/index.ts +15 -15
  176. package/src/subsystems/MemoryManager/LLMCache.ts +72 -72
  177. package/src/subsystems/MemoryManager/LLMContext.ts +124 -124
  178. package/src/subsystems/MemoryManager/LLMMemory.service/LLMMemoryConnector.ts +26 -26
  179. package/src/subsystems/MemoryManager/RuntimeContext.ts +266 -266
  180. package/src/subsystems/Security/AccessControl/ACL.class.ts +208 -208
  181. package/src/subsystems/Security/AccessControl/AccessCandidate.class.ts +82 -82
  182. package/src/subsystems/Security/AccessControl/AccessRequest.class.ts +52 -52
  183. package/src/subsystems/Security/Account.service/AccountConnector.ts +44 -44
  184. package/src/subsystems/Security/Account.service/connectors/AWSAccount.class.ts +76 -76
  185. package/src/subsystems/Security/Account.service/connectors/DummyAccount.class.ts +130 -130
  186. package/src/subsystems/Security/Account.service/connectors/JSONFileAccount.class.ts +159 -159
  187. package/src/subsystems/Security/Account.service/index.ts +14 -14
  188. package/src/subsystems/Security/Credentials.helper.ts +62 -62
  189. package/src/subsystems/Security/ManagedVault.service/ManagedVaultConnector.ts +38 -38
  190. package/src/subsystems/Security/ManagedVault.service/connectors/NullManagedVault.class.ts +53 -53
  191. package/src/subsystems/Security/ManagedVault.service/connectors/SecretManagerManagedVault.ts +154 -154
  192. package/src/subsystems/Security/ManagedVault.service/index.ts +12 -12
  193. package/src/subsystems/Security/SecureConnector.class.ts +110 -110
  194. package/src/subsystems/Security/Vault.service/Vault.helper.ts +30 -30
  195. package/src/subsystems/Security/Vault.service/VaultConnector.ts +29 -29
  196. package/src/subsystems/Security/Vault.service/connectors/HashicorpVault.class.ts +46 -46
  197. package/src/subsystems/Security/Vault.service/connectors/JSONFileVault.class.ts +221 -221
  198. package/src/subsystems/Security/Vault.service/connectors/NullVault.class.ts +54 -54
  199. package/src/subsystems/Security/Vault.service/connectors/SecretsManager.class.ts +140 -140
  200. package/src/subsystems/Security/Vault.service/index.ts +12 -12
  201. package/src/types/ACL.types.ts +104 -104
  202. package/src/types/AWS.types.ts +10 -10
  203. package/src/types/Agent.types.ts +61 -61
  204. package/src/types/AgentLogger.types.ts +17 -17
  205. package/src/types/Cache.types.ts +1 -1
  206. package/src/types/Common.types.ts +2 -2
  207. package/src/types/LLM.types.ts +496 -495
  208. package/src/types/Redis.types.ts +8 -8
  209. package/src/types/SRE.types.ts +64 -64
  210. package/src/types/Security.types.ts +14 -14
  211. package/src/types/Storage.types.ts +5 -5
  212. package/src/types/VectorDB.types.ts +86 -86
  213. package/src/utils/base64.utils.ts +275 -275
  214. package/src/utils/cli.utils.ts +68 -68
  215. package/src/utils/data.utils.ts +322 -322
  216. package/src/utils/date-time.utils.ts +22 -22
  217. package/src/utils/general.utils.ts +238 -238
  218. package/src/utils/index.ts +12 -12
  219. package/src/utils/lazy-client.ts +261 -261
  220. package/src/utils/numbers.utils.ts +13 -13
  221. package/src/utils/oauth.utils.ts +35 -35
  222. package/src/utils/string.utils.ts +414 -414
  223. package/src/utils/url.utils.ts +19 -19
  224. package/src/utils/validation.utils.ts +74 -74
  225. package/dist/bundle-analysis-lazy.html +0 -4949
  226. package/dist/bundle-analysis.html +0 -4949
  227. package/dist/types/utils/package-manager.utils.d.ts +0 -26
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import dotenv from"dotenv";import Joi from"joi";import"dotenv/config";import winston from"winston";import Transport from"winston-transport";import pLimit from"p-limit";import axios,{AxiosHeaders}from"axios";import*as fs from"fs";import fs__default,{existsSync,mkdirSync,writeFileSync,readFileSync,unlinkSync}from"fs";import*as FileType from"file-type";import{fileTypeFromBuffer}from"file-type";import{isBinaryFileSync}from"isbinaryfile";import EventEmitter$1,{EventEmitter}from"events";import crypto$1,{createHash,randomUUID}from"crypto";import{encode,encodeChat}from"gpt-tokenizer";import path from"path";import os from"os";import"process";import mime from"mime";import{Readable}from"stream";import xxhash from"xxhashjs";import{jsonrepair}from"jsonrepair";import yaml from"js-yaml";import{EventSource}from"eventsource";import*as acorn from"acorn";import dayjs from"dayjs";import querystring from"querystring";import{HfInference}from"@huggingface/inference";import{Runware}from"@runware/sdk-js";import FormData from"form-data";import{SocksProxyAgent}from"socks-proxy-agent";import OAuth from"oauth-1.0a";import zl from"zip-lib";import{LambdaClient,GetFunctionCommand,UpdateFunctionCodeCommand,Runtime,CreateFunctionCommand,InvokeCommand,UpdateFunctionConfigurationCommand}from"@aws-sdk/client-lambda";import{IAMClient,GetRoleCommand,CreateRoleCommand}from"@aws-sdk/client-iam";import{Client}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport}from"@modelcontextprotocol/sdk/client/sse.js";import{GetBucketLifecycleConfigurationCommand,PutBucketLifecycleConfigurationCommand,S3Client,HeadObjectCommand,DeleteObjectCommand,GetObjectCommand,PutObjectCommand,PutObjectTaggingCommand,GetObjectTaggingCommand,CopyObjectCommand}from"@aws-sdk/client-s3";import"ses";import imageSize from"image-size";import{execSync}from"child_process";import{Pinecone}from"@pinecone-database/pinecone";import OpenAI,{toFile,OpenAI as OpenAI$1}from"openai";import{MilvusClient,DataType,ErrorCode}from"@zilliz/milvus2-sdk-node";import{GoogleGenerativeAI,FunctionCallingMode}from"@google/generative-ai";import{GoogleAIFileManager,FileState}from"@google/generative-ai/server";import{GoogleGenAI}from"@google/genai";import Anthropic from"@anthropic-ai/sdk";import Groq from"groq-sdk";import{BedrockRuntimeClient,ConverseCommand,ConverseStreamCommand}from"@aws-sdk/client-bedrock-runtime";import{VertexAI}from"@google-cloud/vertexai";import*as chokidar from"chokidar";import chokidar__default from"chokidar";import fs$1 from"fs/promises";import IORedis from"ioredis";import mysql from"mysql2/promise";import{SecretsManagerClient,ListSecretsCommand,GetSecretValueCommand,PutSecretValueCommand,CreateSecretCommand,DeleteSecretCommand}from"@aws-sdk/client-secrets-manager";import*as readlineSync from"readline-sync";var version="1.5.44";dotenv.config();const config={env:{LOG_LEVEL:process.env.LOG_LEVEL||"none",LOG_FILTER:process.env.LOG_FILTER||"",NODE_ENV:process.env?.NODE_ENV}},REQUEST_METHODS=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],REQUEST_CONTENT_TYPES={none:"none",urlEncodedFormData:"application/x-www-form-urlencoded",multipartFormData:"multipart/form-data",json:"application/json",text:"text/plain",xml:"application/xml",binary:"binary"};var EMBODIMENT_TYPES=(EMBODIMENT_TYPES2=>(EMBODIMENT_TYPES2.ChatBot="chatBot",EMBODIMENT_TYPES2.ChatGPT="chatGPT",EMBODIMENT_TYPES2))(EMBODIMENT_TYPES||{});const ERR_MSG_INVALID_IMAGE_SOURCE="Please provide a valid Image Source. Supported image sources are: HTTP(S) URL, Base64 string, Data URL, Output Image from other component(s).",ERR_MSG_INVALID_BINARY="Please provide a valid data that is either a Blob, SmythFileObject (Binary Output from any Component), ArrayBuffer, Buffer, Base64 string, Data URL, or HTTP(s) URL",ERR_MSG_MAX_DEPTH="The maximum depth has been exceeded for the provided array or object.",ERR_MSG_MAX_ARRAY_SIZE="The maximum array size has been exceeded for the provided array.",ERR_MSG_MAX_OBJECT_SIZE="The maximum object size has been exceeded for the provided object.",MAX_DEPTH=10,MAX_OBJECT_SIZE=1e3,MAX_ARRAY_SIZE=1e3,MAX_FILE_SIZE=10*1024*1024,MAX_FILE_COUNT=10,DEFAULT_MAX_TOKENS_FOR_LLM=2048,S3_DAILY_PURGE_LIFECYCLE_TAG="ExpirationPolicy=DeleteDaily",S3_WEEKLY_PURGE_LIFECYCLE_TAG="ExpirationPolicy=DeleteWeekly",S3_MONTHLY_PURGE_LIFECYCLE_TAG="ExpirationPolicy=DeleteMonthly",TOOL_USE_DEFAULT_MODEL="gpt-4o-mini",COMP_NAMES={apiCall:"APICall",code:"Code",llmPrompt:"PromptGenerator",visionLLM:"VisionLLM"},JSON_RESPONSE_INSTRUCTION=`
1
+ import dotenv from"dotenv";import Joi from"joi";import"dotenv/config";import winston from"winston";import Transport from"winston-transport";import pLimit from"p-limit";import axios,{AxiosHeaders}from"axios";import*as fs from"fs";import fs__default,{existsSync,mkdirSync,writeFileSync,readFileSync,unlinkSync}from"fs";import*as FileType from"file-type";import{fileTypeFromBuffer}from"file-type";import{isBinaryFileSync}from"isbinaryfile";import EventEmitter$1,{EventEmitter}from"events";import crypto$1,{createHash,randomUUID}from"crypto";import{encode,encodeChat}from"gpt-tokenizer";import path from"path";import os from"os";import"process";import mime from"mime";import{Readable}from"stream";import xxhash from"xxhashjs";import{jsonrepair}from"jsonrepair";import yaml from"js-yaml";import{EventSource}from"eventsource";import*as acorn from"acorn";import dayjs from"dayjs";import querystring from"querystring";import{HfInference}from"@huggingface/inference";import{Runware}from"@runware/sdk-js";import FormData from"form-data";import{SocksProxyAgent}from"socks-proxy-agent";import OAuth from"oauth-1.0a";import zl from"zip-lib";import{LambdaClient,GetFunctionCommand,UpdateFunctionCodeCommand,Runtime,CreateFunctionCommand,InvokeCommand,UpdateFunctionConfigurationCommand}from"@aws-sdk/client-lambda";import{IAMClient,GetRoleCommand,CreateRoleCommand}from"@aws-sdk/client-iam";import{Client}from"@modelcontextprotocol/sdk/client/index.js";import{SSEClientTransport}from"@modelcontextprotocol/sdk/client/sse.js";import{GetBucketLifecycleConfigurationCommand,PutBucketLifecycleConfigurationCommand,S3Client,HeadObjectCommand,DeleteObjectCommand,GetObjectCommand,PutObjectCommand,PutObjectTaggingCommand,GetObjectTaggingCommand,CopyObjectCommand}from"@aws-sdk/client-s3";import"ses";import imageSize from"image-size";import{execSync}from"child_process";import{Pinecone}from"@pinecone-database/pinecone";import OpenAI,{toFile,OpenAI as OpenAI$1}from"openai";import{MilvusClient,DataType,ErrorCode}from"@zilliz/milvus2-sdk-node";import{GoogleGenerativeAI,FunctionCallingMode}from"@google/generative-ai";import{GoogleAIFileManager,FileState}from"@google/generative-ai/server";import{GoogleGenAI}from"@google/genai";import Anthropic from"@anthropic-ai/sdk";import Groq from"groq-sdk";import{BedrockRuntimeClient,ConverseCommand,ConverseStreamCommand}from"@aws-sdk/client-bedrock-runtime";import{VertexAI}from"@google-cloud/vertexai";import*as chokidar from"chokidar";import chokidar__default from"chokidar";import fs$1 from"fs/promises";import IORedis from"ioredis";import mysql from"mysql2/promise";import{SecretsManagerClient,ListSecretsCommand,GetSecretValueCommand,PutSecretValueCommand,CreateSecretCommand,DeleteSecretCommand}from"@aws-sdk/client-secrets-manager";import*as readlineSync from"readline-sync";var version="1.5.45";dotenv.config();const config={env:{LOG_LEVEL:process.env.LOG_LEVEL||"none",LOG_FILTER:process.env.LOG_FILTER||"",NODE_ENV:process.env?.NODE_ENV}},REQUEST_METHODS=["GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS"],REQUEST_CONTENT_TYPES={none:"none",urlEncodedFormData:"application/x-www-form-urlencoded",multipartFormData:"multipart/form-data",json:"application/json",text:"text/plain",xml:"application/xml",binary:"binary"};var EMBODIMENT_TYPES=(EMBODIMENT_TYPES2=>(EMBODIMENT_TYPES2.ChatBot="chatBot",EMBODIMENT_TYPES2.ChatGPT="chatGPT",EMBODIMENT_TYPES2))(EMBODIMENT_TYPES||{});const ERR_MSG_INVALID_IMAGE_SOURCE="Please provide a valid Image Source. Supported image sources are: HTTP(S) URL, Base64 string, Data URL, Output Image from other component(s).",ERR_MSG_INVALID_BINARY="Please provide a valid data that is either a Blob, SmythFileObject (Binary Output from any Component), ArrayBuffer, Buffer, Base64 string, Data URL, or HTTP(s) URL",ERR_MSG_MAX_DEPTH="The maximum depth has been exceeded for the provided array or object.",ERR_MSG_MAX_ARRAY_SIZE="The maximum array size has been exceeded for the provided array.",ERR_MSG_MAX_OBJECT_SIZE="The maximum object size has been exceeded for the provided object.",MAX_DEPTH=10,MAX_OBJECT_SIZE=1e3,MAX_ARRAY_SIZE=1e3,MAX_FILE_SIZE=10*1024*1024,MAX_FILE_COUNT=10,DEFAULT_MAX_TOKENS_FOR_LLM=2048,S3_DAILY_PURGE_LIFECYCLE_TAG="ExpirationPolicy=DeleteDaily",S3_WEEKLY_PURGE_LIFECYCLE_TAG="ExpirationPolicy=DeleteWeekly",S3_MONTHLY_PURGE_LIFECYCLE_TAG="ExpirationPolicy=DeleteMonthly",TOOL_USE_DEFAULT_MODEL="gpt-4o-mini",COMP_NAMES={apiCall:"APICall",code:"Code",llmPrompt:"PromptGenerator",visionLLM:"VisionLLM"},JSON_RESPONSE_INSTRUCTION=`
2
2
  Respond ONLY with a valid, parsable JSON object. Follow these strict guidelines:
3
3
  1. The response must begin with '{' and end with '}'.
4
4
  2. Use double quotes for all keys and string values.
@@ -185,13 +185,13 @@ ${_error}
185
185
  `;return input_vars}};var __defProp$S=Object.defineProperty,__defNormalProp$S=(obj,key,value)=>key in obj?__defProp$S(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$S=(obj,key,value)=>__defNormalProp$S(obj,key+"",value);class MemoryWriteKeyVal extends Component{constructor(){super(),__publicField$S(this,"configSchema",Joi.object({memoryName:Joi.string().max(255).allow("").label("Memory Name"),key:Joi.string().max(255).allow("").label("Key"),value:Joi.string().max(1e5).allow("").label("Value"),scope:Joi.string().max(20).allow("").label("Scope"),ttl:Joi.number().min(300).max(604800).allow("").label("TTL")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const connectorRequester=ConnectorService.getCacheConnector().agent(agent.id),teamId=agent.teamId,agentId=agent.id,memoryName=config2.data.memoryName,key=TemplateString(config2.data.key).parse(input).result,value=TemplateString(config2.data.value).parse(input).result,scope=config2.data.scope,ttl=scope==="ttl"?config2?.data?.ttl:3*60*60,sessionId=agent.sessionId,workflowId=agent.agentRuntime.workflowReqId;let scopeKey="";scope==="session"?scopeKey=sessionId:scope==="request"?scopeKey=workflowId:scope==="ttl"&&(scopeKey="ttl");const scopeKeyId=`${agentId}:${memoryName}:${key}_scope`;await connectorRequester.set(scopeKeyId,JSON.stringify({scope,value:scopeKey}),null,null,ttl);const fullKey=`${agentId}:${scopeKey}:${memoryName}:${key}`;return await connectorRequester.set(fullKey,value,null,null,ttl),{Key:key,_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}}}var __defProp$R=Object.defineProperty,__defNormalProp$R=(obj,key,value)=>key in obj?__defProp$R(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$R=(obj,key,value)=>__defNormalProp$R(obj,key+"",value);class MemoryReadKeyVal extends Component{constructor(){super(),__publicField$R(this,"configSchema",Joi.object({memoryName:Joi.string().max(255).allow("").label("Memory Name")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const connectorRequester=ConnectorService.getCacheConnector().agent(agent.id),teamId=agent.teamId,agentId=agent.id,memoryName=config2.data.memoryName,key=input.Key,sessionId=agent.sessionId,workflowId=agent.agentRuntime.workflowReqId;logger2.debug("Reading Scope Data");const scopeKeyId=`${agentId}:${memoryName}:${key}_scope`,scopeStrData=await connectorRequester.get(scopeKeyId);if(!scopeStrData)return{_error:"key not found",_debug:logger2.output};logger2.debug("Checking Scope");const scopeData=JSON.parse(scopeStrData),scopeKey=scopeData.value;if(scopeData.scope==="session"&&scopeKey!==sessionId)return{_error:"key not found",_debug:logger2.output};if(scopeData.scope==="request"&&scopeKey!==workflowId)return{_error:"key not found",_debug:logger2.output};logger2.debug("Reading Value");const fullKey=`${agentId}:${scopeKey}:${memoryName}:${key}`;return{Value:await connectorRequester.get(fullKey),_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}}}var __defProp$Q=Object.defineProperty,__defNormalProp$Q=(obj,key,value)=>key in obj?__defProp$Q(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$Q=(obj,key,value)=>__defNormalProp$Q(obj,key+"",value);class MemoryDeleteKeyVal extends Component{constructor(){super(),__publicField$Q(this,"configSchema",Joi.object({memoryName:Joi.string().max(255).allow("").label("Memory Name"),key:Joi.string().max(255).allow("").label("Key")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const connectorRequester=ConnectorService.getCacheConnector().agent(agent.id),teamId=agent.teamId,agentId=agent.id,memoryName=config2.data.memoryName,key=TemplateString(config2.data.key).parse(input).result,sessionId=agent.sessionId,workflowId=agent.agentRuntime.workflowReqId;logger2.debug("Reading Scope Data for deletion");const scopeKeyId=`${agentId}:${memoryName}:${key}_scope`,scopeStrData=await connectorRequester.get(scopeKeyId);if(!scopeStrData)return{_error:"key not found",_debug:logger2.output};logger2.debug("Checking Scope for deletion");const scopeData=JSON.parse(scopeStrData),scopeKey=scopeData.value;if(scopeData.scope==="session"&&scopeKey!==sessionId)return{_error:"key not found",_debug:logger2.output};if(scopeData.scope==="request"&&scopeKey!==workflowId)return{_error:"key not found",_debug:logger2.output};logger2.debug("Deleting memory value and scope data");const fullKey=`${agentId}:${scopeKey}:${memoryName}:${key}`;return await connectorRequester.delete(fullKey),await connectorRequester.delete(scopeKeyId),{Key:key,deleted:!0,_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}}}var __defProp$P=Object.defineProperty,__defNormalProp$P=(obj,key,value)=>key in obj?__defProp$P(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$P=(obj,key,value)=>__defNormalProp$P(obj,key+"",value);class MemoryWriteObject extends Component{constructor(){super(),__publicField$P(this,"configSchema",Joi.object({memoryName:Joi.string().max(255).allow("").label("Memory Name"),scope:Joi.string().max(20).allow("").label("Scope"),ttl:Joi.number().min(300).max(604800).allow("").label("TTL")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{const connectorRequester=ConnectorService.getCacheConnector().agent(agent.id),teamId=agent.teamId,agentId=agent.id,memoryName=config2.data.memoryName,dataString=input.Data,scope=config2.data.scope,ttl=scope==="ttl"?config2?.data?.ttl:3*60*60;let dataObject;try{dataObject=JSON.parse(dataString)}catch{return{_error:"Invalid JSON data provided",_debug:logger2.output}}if(typeof dataObject!="object"||dataObject===null||Array.isArray(dataObject))return{_error:"Data must be a valid JSON object",_debug:logger2.output};const sessionId=agent.sessionId,workflowId=agent.agentRuntime.workflowReqId;let scopeKey="";scope==="session"?scopeKey=sessionId:scope==="request"?scopeKey=workflowId:scope==="ttl"&&(scopeKey="ttl");const keys=Object.keys(dataObject);logger2.debug(`Writing ${keys.length} key-value pairs to memory`);const writePromises=keys.map(async key=>{const value=String(dataObject[key]),scopeKeyId=`${agentId}:${memoryName}:${key}_scope`,scopePromise=connectorRequester.set(scopeKeyId,JSON.stringify({scope,value:scopeKey}),null,null,ttl),fullKey=`${agentId}:${scopeKey}:${memoryName}:${key}`,valuePromise=connectorRequester.set(fullKey,value,null,null,ttl);return await Promise.all([scopePromise,valuePromise]),{key,success:!0}}),successfulKeys=(await Promise.all(writePromises)).filter(result=>result.success).map(result=>result.key);return logger2.debug(`Successfully wrote ${successfulKeys.length} keys to memory`),{Keys:successfulKeys,Count:successfulKeys.length,_debug:logger2.output}}catch(error){return{_error:error.message,_debug:logger2.output}}}}const components={Component:new Component,Note:new Component,APIEndpoint:new APIEndpoint,APIOutput:new APIOutput,PromptGenerator:new PromptGenerator,LLMPrompt:new PromptGenerator,APICall:new APICall,VisionLLM:new VisionLLM,FSleep:new FSleep,FHash:new FHash,FEncDec:new FEncDec,FSign:new FSign,FTimestamp:new FTimestamp,DataSourceLookup:new DataSourceLookup,DataSourceIndexer:new DataSourceIndexer,DataSourceCleaner:new DataSourceCleaner,JSONFilter:new JSONFilter,LogicAND:new LogicAND,LogicOR:new LogicOR,LogicXOR:new LogicXOR,LogicAtLeast:new LogicAtLeast,LogicAtMost:new LogicAtMost,AgentPlugin:new AgentPlugin,LLMAssistant:new LLMAssistant,Async:new Async,Await:new Await,ForEach:new ForEach,HuggingFace:new HuggingFace,ZapierAction:new ZapierAction,GPTPlugin:new GPTPlugin,Classifier:new Classifier,MultimodalLLM:new MultimodalLLM,GenAILLM:new GenAILLM,FileStore:new FileStore,WebSearch:new TavilyWebSearch,WebScrape:new ScrapflyWebScrape,TavilyWebSearch:new TavilyWebSearch,ScrapflyWebScrape:new ScrapflyWebScrape,ComponentHost:new ComponentHost,ServerlessCode:new ServerlessCode,ImageGenerator:new ImageGenerator,MCPClient:new MCPClient,OpenAPI:new OpenAPI,ECMASandbox:new ECMASandbox$1,MemoryWriteKeyVal:new MemoryWriteKeyVal,MemoryReadKeyVal:new MemoryReadKeyVal,MemoryDeleteKeyVal:new MemoryDeleteKeyVal,MemoryWriteObject:new MemoryWriteObject},ComponentInstances=components,console$o=Logger("S3Cache");function generateLifecycleRules(){const rules=[];for(let i=1;i<100;i++)rules.push({ID:`ExpireAfter${i}Days`,Filter:{Tag:{Key:"Expiry",Value:"ExpireAfter"+i+"Days"}},Status:"Enabled",Expiration:{Days:i}});for(let i=100;i<1e3;i+=10)rules.push({ID:`ExpireAfter${i}Days`,Filter:{Tag:{Key:"Expiry",Value:"ExpireAfter"+i+"Days"}},Status:"Enabled",Expiration:{Days:i}});for(let i=1e3;i<=1e4;i+=100)rules.push({ID:`ExpireAfter${i}Days`,Filter:{Tag:{Key:"Expiry",Value:"ExpireAfter"+i+"Days"}},Status:"Enabled",Expiration:{Days:i}});return rules}function generateExpiryMetadata(expiryDays){let metadataValue;if(expiryDays>=1&&expiryDays<100)metadataValue=`ExpireAfter${expiryDays}Days`;else if(expiryDays>=100&&expiryDays<1e3)metadataValue=`ExpireAfter${Math.ceil(expiryDays/10)*10}Days`;else if(expiryDays>=1e3&&expiryDays<=1e4)metadataValue=`ExpireAfter${Math.ceil(expiryDays/100)*100}Days`;else throw new Error("Invalid expiry days. Please provide a valid expiry days value.");return{Key:"Expiry",Value:metadataValue}}function getNonExistingRules(existingRules,newRules){return newRules.filter(rule=>!existingRules.some(existingRule=>existingRule.ID===rule.ID))}function ttlToExpiryDays(ttl){return Math.ceil(ttl/(60*60*24))}async function checkAndInstallLifecycleRules(bucketName,s3Client){if(!bucketName||bucketName.trim()==="")throw new Error("Bucket name is required and cannot be empty");if(!s3Client)throw new Error("S3Client is required");console$o.log(`Checking lifecycle rules for bucket: ${bucketName}`);try{const getLifecycleCommand=new GetBucketLifecycleConfigurationCommand({Bucket:bucketName}),existingRules=(await s3Client.send(getLifecycleCommand)).Rules,newRules=generateLifecycleRules(),nonExistingNewRules=getNonExistingRules(existingRules,newRules);if(nonExistingNewRules.length>0){const params={Bucket:bucketName,LifecycleConfiguration:{Rules:[...existingRules,...nonExistingNewRules]}},putLifecycleCommand=new PutBucketLifecycleConfigurationCommand(params);await s3Client.send(putLifecycleCommand),console$o.log(`Added ${nonExistingNewRules.length} new lifecycle rules to bucket: ${bucketName}`)}else console$o.log("Lifecycle configuration already exists")}catch(error){if(error.code==="NoSuchLifecycleConfiguration"){console$o.log("No lifecycle configuration found. Creating new configuration...");const lifecycleRules=generateLifecycleRules(),params={Bucket:bucketName,LifecycleConfiguration:{Rules:lifecycleRules}},putLifecycleCommand=new PutBucketLifecycleConfigurationCommand(params);await s3Client.send(putLifecycleCommand),console$o.log("Lifecycle configuration created successfully.")}else console$o.error("Error checking lifecycle configuration:",error),console$o.error("Bucket name provided:",bucketName),console$o.error("Error details:",{name:error.name,message:error.message,code:error.code})}}var __defProp$O=Object.defineProperty,__getOwnPropDesc$j=Object.getOwnPropertyDescriptor,__defNormalProp$O=(obj,key,value)=>key in obj?__defProp$O(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$j=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$j(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$O(target,key,result),result},__publicField$O=(obj,key,value)=>__defNormalProp$O(obj,typeof key!="symbol"?key+"":key,value);Object.defineProperty(global,"crypto",{value:{getRandomValues:arr=>crypto$1.randomBytes(arr.length)}});const console$n=Logger("S3Storage");class S3Storage extends StorageConnector{constructor(_settings){if(super(_settings),this._settings=_settings,__publicField$O(this,"name","S3Storage"),__publicField$O(this,"client"),__publicField$O(this,"bucket"),__publicField$O(this,"isInitialized",!1),__publicField$O(this,"initializationPromise",null),!_settings.bucket||_settings.bucket.trim()===""){console$n.warn("S3 bucket name is required and cannot be empty, connector not initialized");return}this.bucket=_settings.bucket;const clientConfig={};_settings.region&&(clientConfig.region=_settings.region),_settings.accessKeyId&&_settings.secretAccessKey&&(clientConfig.credentials={accessKeyId:_settings.accessKeyId,secretAccessKey:_settings.secretAccessKey}),this.client=new S3Client(clientConfig)}async ensureInitialized(){if(!this.isInitialized)return this.initializationPromise?this.initializationPromise:(this.initializationPromise=this.initialize(),this.initializationPromise)}async initialize(){if(!this.client){console$n.warn("S3 client not initialized");return}if(!this.isInitialized)try{await checkAndInstallLifecycleRules(this.bucket,this.client),this.isInitialized=!0}catch(error){throw console$n.error("Failed to initialize S3Storage:",error),this.initializationPromise=null,error}}async read(acRequest,resourceId){await this.ensureInitialized();const params={Bucket:this.bucket,Key:resourceId},s3HeadCommand=new HeadObjectCommand(params),expirationHeader=(await this.client.send(s3HeadCommand))?.Expiration;if(expirationHeader){const expirationDateMatch=expirationHeader.match(/expiry-date="([^"]+)"/);if(expirationDateMatch){const expirationDate=new Date(expirationDateMatch[1]);if(new Date>expirationDate){const s3DeleteCommand=new DeleteObjectCommand(params);await this.client.send(s3DeleteCommand);return}}}const command=new GetObjectCommand(params);try{const response=await this.client.send(command);return await streamToBuffer(response.Body)}catch(error){if(error.name==="NotFound"||error.name==="NoSuchKey")return;throw console$n.error("Error reading object from S3",error.name,error.message),error}}async getMetadata(acRequest,resourceId){await this.ensureInitialized();try{return await this.getS3Metadata(resourceId)}catch(error){throw console$n.error("Error getting access rights in S3",error.name,error.message),error}}async setMetadata(acRequest,resourceId,metadata){await this.ensureInitialized();try{let s3Metadata=await this.getS3Metadata(resourceId);s3Metadata||(s3Metadata={}),s3Metadata={...s3Metadata,...metadata},await this.setS3Metadata(resourceId,s3Metadata)}catch(error){throw console$n.error("Error setting access rights in S3",error),error}}async write(acRequest,resourceId,value,acl,metadata){await this.ensureInitialized();const accessCandidate=acRequest.candidate;let amzACL=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL,s3Metadata={...metadata,"x-amz-meta-acl":amzACL};const command=new PutObjectCommand({Bucket:this.bucket,Key:resourceId,Body:value,Metadata:this.serializeS3Metadata(s3Metadata),ContentType:s3Metadata.ContentType});try{const result=await this.client.send(command)}catch(error){throw console$n.error("Error writing object to S3",error.name,error.message),error}}async delete(acRequest,resourceId){await this.ensureInitialized();const command=new DeleteObjectCommand({Bucket:this.bucket,Key:resourceId});try{await this.client.send(command)}catch(error){throw console$n.error("Error deleting object from S3",error.name,error.message),error}}async exists(acRequest,resourceId){await this.ensureInitialized();const command=new HeadObjectCommand({Bucket:this.bucket,Key:resourceId});try{return await this.client.send(command),!0}catch(error){if(error.name==="NotFound"||error.name==="NoSuchKey")return!1;throw console$n.error("Error checking object existence in S3",error.name,error.message),error}}async getResourceACL(resourceId,candidate){await this.ensureInitialized();const s3Metadata=await this.getS3Metadata(resourceId);return s3Metadata!==void 0?ACL.from(s3Metadata?.["x-amz-meta-acl"]):new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner)}async getACL(acRequest,resourceId){await this.ensureInitialized();try{const s3Metadata=await this.getS3Metadata(resourceId);return ACL.from(s3Metadata?.["x-amz-meta-acl"])}catch(error){throw console$n.error("Error getting access rights in S3",error.name,error.message),error}}async setACL(acRequest,resourceId,acl){await this.ensureInitialized();try{let s3Metadata=await this.getS3Metadata(resourceId);s3Metadata||(s3Metadata={}),s3Metadata["x-amz-meta-acl"]=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setS3Metadata(resourceId,s3Metadata)}catch(error){throw console$n.error("Error setting access rights in S3",error),error}}async expire(acRequest,resourceId,ttl){await this.ensureInitialized();const expiryMetadata=generateExpiryMetadata(ttlToExpiryDays(ttl)),s3PutObjectTaggingCommand=new PutObjectTaggingCommand({Bucket:this.bucket,Key:resourceId,Tagging:{TagSet:[{Key:expiryMetadata.Key,Value:expiryMetadata.Value}]}});await this.client.send(s3PutObjectTaggingCommand)}migrateMetadata(metadata){if(!metadata.agentid&&!metadata.teamid&&!metadata.userid)return metadata;{const convertibleItems=["agentid","teamid","userid"],aclHelper=new ACL;for(let key of convertibleItems){if(!metadata[key])continue;const role=key==="agentid"?TAccessRole.Agent:key==="teamid"?TAccessRole.Team:TAccessRole.User;aclHelper.addAccess(role,metadata[key].toString(),[TAccessLevel.Owner,TAccessLevel.Read,TAccessLevel.Write]),delete metadata[key]}aclHelper.migrated=!0;const newMetadata={"x-amz-meta-acl":aclHelper.ACL};for(let key in metadata)newMetadata[key]=metadata[key];return newMetadata}}serializeS3Metadata(s3Metadata){let amzMetadata={};s3Metadata["x-amz-meta-acl"]&&(s3Metadata["x-amz-meta-acl"]&&(amzMetadata["x-amz-meta-acl"]=typeof s3Metadata["x-amz-meta-acl"]=="string"?s3Metadata["x-amz-meta-acl"]:ACL.from(s3Metadata["x-amz-meta-acl"]).serializedACL),delete s3Metadata["x-amz-meta-acl"]);for(let key in s3Metadata)key!="ContentType"&&(amzMetadata[key]=typeof s3Metadata[key]=="string"?s3Metadata[key]:JSON.stringify(s3Metadata[key]));return amzMetadata}deserializeS3Metadata(amzMetadata){let metadata={};for(let key in amzMetadata){if(key==="x-amz-meta-acl"){metadata[key]=ACL.from(amzMetadata[key]).ACL;continue}try{metadata[key]=JSON.parse(amzMetadata[key])}catch{metadata[key]=amzMetadata[key]}}return metadata=this.migrateMetadata(metadata),metadata}async getS3Metadata(resourceId){try{const command=new HeadObjectCommand({Bucket:this.bucket,Key:resourceId}),response=await this.client.send(command),s3RawMetadata=response.Metadata;if(!s3RawMetadata||Object.keys(s3RawMetadata).length===0)return{};let metadata=this.deserializeS3Metadata(s3RawMetadata);return metadata.ContentType||(metadata.ContentType=response.ContentType?response.ContentType:"application/octet-stream"),metadata}catch(error){if(error.name==="NotFound"||error.name==="NoSuchKey")return;throw console$n.error("Error reading object metadata from S3",error.name,error.message),error}}async setS3Metadata(resourceId,metadata){try{const getObjectCommand=new GetObjectCommand({Bucket:this.bucket,Key:resourceId}),objectData=await this.client.send(getObjectCommand),bufferBody=await streamToBuffer(objectData.Body),amzMetadata=this.serializeS3Metadata(metadata),putObjectCommand=new PutObjectCommand({Bucket:this.bucket,Key:resourceId,Body:bufferBody,Metadata:amzMetadata});await this.client.send(putObjectCommand)}catch(error){throw console$n.error("Error setting object metadata in S3",error.name,error.message),error}}}__decorateClass$j([SecureConnector.AccessControl],S3Storage.prototype,"read"),__decorateClass$j([SecureConnector.AccessControl],S3Storage.prototype,"getMetadata"),__decorateClass$j([SecureConnector.AccessControl],S3Storage.prototype,"setMetadata"),__decorateClass$j([SecureConnector.AccessControl],S3Storage.prototype,"write"),__decorateClass$j([SecureConnector.AccessControl],S3Storage.prototype,"delete"),__decorateClass$j([SecureConnector.AccessControl],S3Storage.prototype,"exists"),__decorateClass$j([SecureConnector.AccessControl],S3Storage.prototype,"getACL"),__decorateClass$j([SecureConnector.AccessControl],S3Storage.prototype,"setACL"),__decorateClass$j([SecureConnector.AccessControl],S3Storage.prototype,"expire");var __defProp$N=Object.defineProperty,__getOwnPropDesc$i=Object.getOwnPropertyDescriptor,__defNormalProp$N=(obj,key,value)=>key in obj?__defProp$N(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__decorateClass$i=(decorators,target,key,kind)=>{for(var result=__getOwnPropDesc$i(target,key),i=decorators.length-1,decorator;i>=0;i--)(decorator=decorators[i])&&(result=decorator(target,key,result)||result);return result&&__defProp$N(target,key,result),result},__publicField$N=(obj,key,value)=>__defNormalProp$N(obj,typeof key!="symbol"?key+"":key,value);const console$m=Logger("LocalStorage");class LocalStorage extends StorageConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$N(this,"name","LocalStorage"),__publicField$N(this,"folder"),__publicField$N(this,"storagePrefix","local"),__publicField$N(this,"metadataPrefix",".local.metadata"),__publicField$N(this,"isInitialized",!1),this.folder=this.findStorageFolder(_settings?.folder),this.initialize(),fs__default.existsSync(this.folder)||console$m.error(`Invalid folder provided: ${this.folder}`)}findStorageFolder(folder){let _storageFolder=folder;return fs__default.existsSync(_storageFolder)?_storageFolder:(_storageFolder=findSmythPath("storage"),fs__default.existsSync(_storageFolder)?(console$m.warn("Using alternative storage folder found in : ",_storageFolder),_storageFolder):(console$m.warn("!!! All attempts to find an existing storage folder failed !!!"),console$m.warn("!!! I will use this folder: ",_storageFolder),_storageFolder))}async read(acRequest,resourceId){this.isInitialized||await this.initialize();try{const filePath=this.getStorageFilePath(acRequest.candidate.id,resourceId);return fs__default.existsSync(filePath)?fs__default.readFileSync(filePath,null):void 0}catch(error){throw console$m.error("Error reading object from local storage",error.name,error.message),error}}async getMetadata(acRequest,resourceId){try{const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,resourceId);if(!fs__default.existsSync(metadataFilePath))return;const data=fs__default.readFileSync(metadataFilePath,"utf-8");return this.deserializeMetadata(JSON.parse(data))}catch(error){throw console$m.error("Error reading metadata from LocalStorage",error.name,error.message),error}}async setMetadata(acRequest,resourceId,metadata){try{let fileMetadata=await this.getMetadata(acRequest,resourceId);fileMetadata||(fileMetadata={}),fileMetadata={...fileMetadata,...metadata};const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,resourceId,!0),serializedMetadata=this.serializeMetadata(fileMetadata);fs__default.writeFileSync(metadataFilePath,JSON.stringify(serializedMetadata))}catch(error){throw console$m.error("Error setting metadata in local storage",error.name,error.message),error}}async write(acRequest,resourceId,value,acl,metadata){this.isInitialized||await this.initialize();const accessCandidate=acRequest.candidate;let localACL=ACL.from(acl).addAccess(accessCandidate.role,accessCandidate.id,TAccessLevel.Owner).ACL,fileMetadata={...metadata,acl:localACL};const filePath=this.getStorageFilePath(acRequest.candidate.id,resourceId,!0);fs__default.writeFileSync(filePath,value),await this.setMetadata(acRequest,resourceId,fileMetadata)}async delete(acRequest,resourceId){try{const filePath=this.getStorageFilePath(acRequest.candidate.id,resourceId);fs__default.existsSync(filePath)&&fs__default.unlinkSync(filePath);const metadataFilePath=this.getMetadataFilePath(acRequest.candidate.id,resourceId);fs__default.existsSync(metadataFilePath)&&fs__default.unlinkSync(metadataFilePath)}catch(error){throw console$m.error("Error deleting object from local storage",error.name,error.message),error}}async exists(acRequest,resourceId){this.isInitialized||await this.initialize();const filePath=this.getStorageFilePath(acRequest.candidate.id,resourceId);return!!fs__default.existsSync(filePath)}async getResourceACL(resourceId,candidate){this.isInitialized||await this.initialize();const metadataFilePath=this.getMetadataFilePath(candidate.id,resourceId);if(!fs__default.existsSync(metadataFilePath))return new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner);const metadata=fs__default.readFileSync(metadataFilePath,"utf-8");if(metadata===void 0)return new ACL().addAccess(candidate.role,candidate.id,TAccessLevel.Owner);try{let metadataObject=JSON.parse(metadata);return ACL.from(metadataObject?.acl)}catch(error){throw console$m.error("Error parsing metadata in local storage",error.name,error.message),error}}async getACL(acRequest,resourceId){try{const fileMetadata=await this.getMetadata(acRequest,resourceId);return ACL.from(fileMetadata?.acl)}catch(error){throw console$m.error("Error getting access rights in local storage",error.name,error.message),error}}async setACL(acRequest,resourceId,acl){try{let fileMetadata=await this.getMetadata(acRequest,resourceId);fileMetadata||(fileMetadata={}),fileMetadata.acl=ACL.from(acl).addAccess(acRequest.candidate.role,acRequest.candidate.id,TAccessLevel.Owner).ACL,await this.setMetadata(acRequest,resourceId,fileMetadata)}catch(error){throw console$m.error("Error setting access rights in local storage",error),error}}async expire(acRequest,resourceId,ttl){console$m.warn(`LocalStorage.expire is not implemented, request will be ignored for resource ${resourceId} and ttl ${ttl}`)}async initialize(){const storageFolderPath=path.join(this.folder,this.storagePrefix);existsSync(storageFolderPath)||fs__default.mkdirSync(storageFolderPath,{recursive:!0});const metadataFolderPath=path.join(this.folder,this.metadataPrefix);existsSync(metadataFolderPath)||(fs__default.mkdirSync(metadataFolderPath,{recursive:!0}),fs__default.writeFileSync(path.join(metadataFolderPath,"README_IMPORTANT.txt"),"This folder is used for smythOS metadata, do not delete it, it will break SmythOS local filesystem")),this.isInitialized=!0}getStorageFilePath(candidateId,resourceId,createFoldersIfNotExists=!1){const fullPath=path.join(this.folder,this.storagePrefix,resourceId),folder=path.dirname(fullPath);return createFoldersIfNotExists&&!fs__default.existsSync(folder)&&fs__default.mkdirSync(folder,{recursive:!0}),fullPath}getMetadataFilePath(candidateId,resourceId,createFoldersIfNotExists=!1){const fullPath=path.join(this.folder,this.metadataPrefix,resourceId),folder=path.dirname(fullPath);return createFoldersIfNotExists&&!fs__default.existsSync(folder)&&fs__default.mkdirSync(folder,{recursive:!0}),fullPath}serializeMetadata(metadata){let updatedMetadata={};metadata.acl&&(metadata.acl&&(updatedMetadata.acl=typeof metadata.acl=="string"?metadata.acl:ACL.from(metadata.acl).serializedACL),delete metadata.acl);for(let key in metadata)updatedMetadata[key]=typeof metadata[key]=="string"?metadata[key]:JSON.stringify(metadata[key]);return updatedMetadata}deserializeMetadata(metadata){let deserializedMetadata={};for(let key in metadata){if(key==="acl"){deserializedMetadata[key]=ACL.from(metadata[key]).ACL;continue}try{deserializedMetadata[key]=JSON.parse(metadata[key])}catch{deserializedMetadata[key]=metadata[key]}}return deserializedMetadata}}__decorateClass$i([SecureConnector.AccessControl],LocalStorage.prototype,"read"),__decorateClass$i([SecureConnector.AccessControl],LocalStorage.prototype,"getMetadata"),__decorateClass$i([SecureConnector.AccessControl],LocalStorage.prototype,"setMetadata"),__decorateClass$i([SecureConnector.AccessControl],LocalStorage.prototype,"write"),__decorateClass$i([SecureConnector.AccessControl],LocalStorage.prototype,"delete"),__decorateClass$i([SecureConnector.AccessControl],LocalStorage.prototype,"exists"),__decorateClass$i([SecureConnector.AccessControl],LocalStorage.prototype,"getACL"),__decorateClass$i([SecureConnector.AccessControl],LocalStorage.prototype,"setACL"),__decorateClass$i([SecureConnector.AccessControl],LocalStorage.prototype,"expire");class StorageService extends ConnectorServiceProvider{register(){ConnectorService.register(TConnectorService.Storage,"S3",S3Storage),ConnectorService.register(TConnectorService.Storage,"LocalStorage",LocalStorage)}}async function getLLMCredentials(candidate,modelInfo){const credentialsList=Array.isArray(modelInfo.credentials)?modelInfo.credentials||[TLLMCredentials.Internal]:[modelInfo.credentials||TLLMCredentials.Internal];for(let credentialsMode of credentialsList){if(typeof credentialsMode=="object")return credentialsMode;switch(credentialsMode){case TLLMCredentials.None:return{apiKey:""};case TLLMCredentials.Internal:{const credentials=await getEnvCredentials(candidate,modelInfo);if(credentials)return credentials;break}case TLLMCredentials.Vault:{const credentials=await getStandardLLMCredentials(candidate,modelInfo);if(credentials)return credentials;break}case TLLMCredentials.BedrockVault:{const credentials=await getBedrockCredentials(candidate,modelInfo);if(credentials)return credentials;break}case TLLMCredentials.VertexAIVault:{const credentials=await getVertexAICredentials(candidate,modelInfo);if(credentials)return credentials;break}}}return{}}const SMYTHOS_API_KEYS={echo:"",openai:process.env.OPENAI_API_KEY,anthropic:process.env.ANTHROPIC_API_KEY,googleai:process.env.GOOGLE_AI_API_KEY,togetherai:process.env.TOGETHER_AI_API_KEY,groq:process.env.GROQ_API_KEY,xai:process.env.XAI_API_KEY,perplexity:process.env.PERPLEXITY_API_KEY};async function getEnvCredentials(candidate,modelInfo){const provider=(modelInfo.provider||modelInfo.llm)?.toLowerCase(),apiKey=SMYTHOS_API_KEYS?.[provider]||"";return apiKey?{apiKey}:null}async function getStandardLLMCredentials(candidate,modelInfo){const provider=(modelInfo.provider||modelInfo.llm)?.toLowerCase(),apiKey=await ConnectorService.getVaultConnector().requester(candidate).get(provider).catch(()=>"");return apiKey?{apiKey,isUserKey:!0}:null}async function getBedrockCredentials(candidate,modelInfo){const keyIdName=modelInfo.settings?.keyIDName,secretKeyName=modelInfo.settings?.secretKeyName,sessionKeyName=modelInfo.settings?.sessionKeyName,vaultConnector=ConnectorService.getVaultConnector(),[accessKeyId,secretAccessKey,sessionToken]=await Promise.all([vaultConnector.requester(candidate).get(keyIdName).catch(()=>""),vaultConnector.requester(candidate).get(secretKeyName).catch(()=>""),vaultConnector.requester(candidate).get(sessionKeyName).catch(()=>"")]);let credentials={accessKeyId,secretAccessKey,isUserKey:!0};return sessionToken&&(credentials.sessionToken=sessionToken),!accessKeyId||!secretAccessKey?null:credentials}async function getVertexAICredentials(candidate,modelInfo){const jsonCredentialsName=modelInfo.settings?.jsonCredentialsName;let jsonCredentials=await ConnectorService.getVaultConnector().requester(candidate).get(jsonCredentialsName).catch(()=>"");const credentials=JSON.parse(jsonCredentials);return credentials?{...credentials,isUserKey:!0}:null}var __defProp$M=Object.defineProperty,__defNormalProp$M=(obj,key,value)=>key in obj?__defProp$M(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$M=(obj,key,value)=>__defNormalProp$M(obj,typeof key!="symbol"?key+"":key,value);const console$l=Logger("LLMConnector");class LLMStream extends Readable{constructor(options){super(options),__publicField$M(this,"dataQueue"),__publicField$M(this,"isReading"),this.dataQueue=[],this.isReading=!0}_read(size){if(this.dataQueue.length>0)for(;this.dataQueue.length>0;){const chunk=this.dataQueue.shift();if(!this.push(chunk))break}else this.push(null)}enqueueData(data){this.dataQueue.push(data),this.read(0)}endStream(){this.isReading=!1,this.push(null)}}class LLMConnector extends Connector{constructor(){super(...arguments),__publicField$M(this,"vaultConnector")}imageGenRequest({acRequest,body,context}){return Promise.reject(new Error("Image edit not supported by this model"))}imageEditRequest({acRequest,body,context}){return Promise.reject(new Error("Image edit not supported by this model"))}requester(candidate){return this.vaultConnector=ConnectorService.getVaultConnector(),(!this.vaultConnector||!this.vaultConnector.valid)&&console$l.warn(`Vault Connector unavailable for ${candidate.id} `),{request:async params=>{const preparedParams=await this.prepareParams(candidate,params),provider=preparedParams.modelInfo.provider;return await this.request({acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,agentId:preparedParams.agentId,teamId:preparedParams.teamId,isUserKey:preparedParams.credentials?.isUserKey||preparedParams.isUserKey,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials,toolsInfo:{[provider]:preparedParams.toolsInfo[provider]}}})},streamRequest:async params=>{const preparedParams=await this.prepareParams(candidate,params),provider=preparedParams.modelInfo.provider?.toLowerCase(),requestParams={acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,agentId:preparedParams.agentId,teamId:preparedParams.teamId,isUserKey:preparedParams.credentials?.isUserKey||preparedParams.isUserKey,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials,toolsInfo:{[provider]:preparedParams.toolsInfo[provider]}}};return await this.streamRequest(requestParams)},imageGenRequest:async params=>{const preparedParams=await this.prepareParams(candidate,params);return await this.imageGenRequest({acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,isUserKey:preparedParams.credentials?.isUserKey||preparedParams.isUserKey,agentId:preparedParams.agentId,teamId:preparedParams.teamId,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials}})},imageEditRequest:async params=>{const preparedParams=await this.prepareParams(candidate,params);return await this.imageEditRequest({acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,isUserKey:preparedParams.credentials?.isUserKey||preparedParams.isUserKey,agentId:preparedParams.agentId,teamId:preparedParams.teamId,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials}})}}}enhancePrompt(prompt,config2){if(!prompt)return prompt;let newPrompt=prompt;const outputs={};if(config2?.outputs)for(let con of config2.outputs)con.default||(outputs[con.name]=con?.description?` (${con?.description})`:"");const excludedKeys=["_debug","_error"],outputKeys=Object.keys(outputs).filter(key=>!excludedKeys.includes(key));if(outputKeys.length>0){const outputFormat={};outputKeys.forEach(key=>outputFormat[key]=(config2.name==="Classifier"?"<Boolean|String>":"<value>")+(outputs[key]||"")),newPrompt+=`
186
186
  ##
187
187
  Expected output format = `+JSON.stringify(outputFormat)+`
188
- The output JSON should only use the entries from the output format.`}return newPrompt}postProcess(response){try{return JSONContent(response).tryParse()}catch{return{error:"Invalid JSON response",data:response,details:"The response from the model is not a valid JSON object. Please check the model output and try again."}}}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto",modelInfo=null}){throw new Error("This model does not support tools")}transformToolMessageBlocks({messageBlock,toolsData}){throw new Error("This model does not support tools")}getConsistentMessages(messages){return messages}async prepareParams(candidate,params){const modelsProvider=ConnectorService.getModelsProviderConnector(),files=params?.files;delete params?.files;const clonedParams=JSON.parse(JSON.stringify(params)),_params=this.formatParamValues(clonedParams),model=_params.model,teamId=await this.getTeamId(candidate);_params.modelEntryName=typeof model=="string"?model:model.modelId,_params.teamId=teamId;const modelProviderCandidate=modelsProvider.requester(candidate),modelInfo=await modelProviderCandidate.getModelInfo(model);if(modelInfo.params)for(let key in modelInfo.params)typeof _params[key]>"u"&&(_params[key]=modelInfo.params[key]);_params.credentials=await getLLMCredentials(candidate,modelInfo),_params.baseURL=modelInfo?.baseURL,_params.modelInfo=modelInfo,_params.maxTokens?_params.maxTokens=await modelProviderCandidate.adjustMaxCompletionTokens(model,_params.maxTokens,_params?.isUserKey):_params.maxTokens=await modelProviderCandidate.getMaxCompletionTokens(model,_params?.isUserKey),_params.model=await modelProviderCandidate.getModelId(model),_params.files=files;const features=modelInfo?.features||[];_params.capabilities={search:features.includes("search"),reasoning:features.includes("reasoning"),imageGeneration:features.includes("image-generation")},_params.toolsInfo={openai:await this.prepareOpenAIToolsInfo(_params),xai:await this.prepareXAIToolsInfo(_params)},_params.agentId=candidate.id;const body=await this.reqBodyAdapter(_params);return{..._params,body}}async prepareOpenAIToolsInfo(params){const openAIToolsInfo={webSearch:{enabled:params?.useWebSearch&&params.capabilities.search===!0,contextSize:params?.webSearchContextSize||"medium"}};return params?.webSearchCity&&(openAIToolsInfo.webSearch.city=params?.webSearchCity),params?.webSearchCountry&&(openAIToolsInfo.webSearch.country=params?.webSearchCountry),params?.webSearchRegion&&(openAIToolsInfo.webSearch.region=params?.webSearchRegion),params?.webSearchTimezone&&(openAIToolsInfo.webSearch.timezone=params?.webSearchTimezone),openAIToolsInfo}async prepareXAIToolsInfo(params){const xaiToolsInfo={search:{enabled:params?.useSearch===!0&&params.capabilities.search===!0}};return params?.searchMode&&(xaiToolsInfo.search.mode=params?.searchMode),params?.returnCitations&&(xaiToolsInfo.search.returnCitations=params?.returnCitations),params?.maxSearchResults&&(xaiToolsInfo.search.maxResults=params?.maxSearchResults),params?.searchDataSources&&(xaiToolsInfo.search.dataSources=params?.searchDataSources),params?.searchCountry&&(xaiToolsInfo.search.country=params?.searchCountry),params?.excludedWebsites&&(xaiToolsInfo.search.excludedWebsites=params?.excludedWebsites),params?.allowedWebsites&&(xaiToolsInfo.search.allowedWebsites=params?.allowedWebsites),params?.includedXHandles&&(xaiToolsInfo.search.includedXHandles=params?.includedXHandles),params?.excludedXHandles&&(xaiToolsInfo.search.excludedXHandles=params?.excludedXHandles),params?.postFavoriteCount&&(xaiToolsInfo.search.postFavoriteCount=params?.postFavoriteCount),params?.postViewCount&&(xaiToolsInfo.search.postViewCount=params?.postViewCount),params?.rssLinks&&(xaiToolsInfo.search.rssLinks=params?.rssLinks),params?.safeSearch&&(xaiToolsInfo.search.safeSearch=params?.safeSearch),params?.fromDate&&(xaiToolsInfo.search.fromDate=params?.fromDate),params?.toDate&&(xaiToolsInfo.search.toDate=params?.toDate),xaiToolsInfo}formatParamValues(params){let _params={};for(const[key,value]of Object.entries(params)){let _value=value;["stopSequences","excludedWebsites","allowedWebsites","includedXHandles","excludedXHandles","rssLinks"].includes(key)&&(_value&&typeof _value=="string"?_value=_value.split(/[,\n]/).map(item=>item.trim()).filter(item=>item.length>0):Array.isArray(_value)?_value=_value:_value=_value?[_value]:null),typeof _value=="string"&&_value.trim()!==""&&!isNaN(Number(_value))&&(_value=+_value),key==="messages"&&(_value=this.getConsistentMessages(_value)),_params[key]=_value}return _params}async getTeamId(candidate){const accountConnector=ConnectorService.getAccountConnector();if(!accountConnector)throw new Error("Account Connector unavailable, cannot proceed");return await accountConnector.getCandidateTeam(candidate)}}var __defProp$L=Object.defineProperty,__defNormalProp$L=(obj,key,value)=>key in obj?__defProp$L(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$L=(obj,key,value)=>__defNormalProp$L(obj,key+"",value);class EchoConnector extends LLMConnector{constructor(){super(...arguments),__publicField$L(this,"name","LLM:Echo")}async request({acRequest,body,context}){const content=body?.messages?.[0]?.content;return{content,finishReason:"stop",useTool:!1,toolsData:[],message:{content,role:"assistant"},usage:{}}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1;let content="";return Array.isArray(body?.messages)&&(content=body?.messages?.filter(m=>m.role==="user").pop()?.content),(async()=>{const chunks=content.split(" ");for(let i=0;i<chunks.length;i++){await new Promise(resolve=>setTimeout(resolve,50));const isLastChunk=i===chunks.length-1,delta={content:chunks[i]+(isLastChunk?"":" ")};emitter.emit("data",delta),emitter.emit("content",delta.content)}setTimeout(()=>{emitter.emit("end",[],[])},100)})(),emitter}async reqBodyAdapter(params){return params}enhancePrompt(prompt,config2){return prompt}postProcess(response){try{const result=JSONContent(response).tryFullParse();return result?.error?response:result}catch{return response}}reportUsage(usage,metadata){}}class LLMHelper{static hasSystemMessage(messages){return Array.isArray(messages)?messages?.some(message=>message.role==="system"):!1}static separateSystemMessages(messages){const systemMessage=messages.find(message=>message.role==="system")||{},otherMessages=messages.filter(message=>message.role!=="system");return{systemMessage,otherMessages}}static async countVisionPromptTokens(prompt){let tokens=0;const textObj=prompt?.filter(item=>["text","input_text"].includes(item.type)),textTokens=encode(textObj?.[0]?.text).length,images=prompt?.filter(item=>["image_url","input_image"].includes(item.type));let imageTokens=0;for(const image of images){const imageUrl=image?.image_url?.url||image?.image_url,{width,height}=await this.getImageDimensions(imageUrl),tokens2=this.countImageTokens(width,height);imageTokens+=tokens2}return tokens=textTokens+imageTokens,tokens}static async getImageDimensions(imageUrl){try{let buffer;if(isBase64FileUrl(imageUrl)){const base64Data=imageUrl.replace(/^data:image\/\w+;base64,/,"");buffer=Buffer.from(base64Data,"base64")}else if(isUrl(imageUrl)){const response=await axios.get(imageUrl,{responseType:"arraybuffer"});buffer=Buffer.from(response.data)}else throw new Error("Please provide a valid image url!");const dimensions=imageSize(buffer);return{width:dimensions?.width||0,height:dimensions?.height||0}}catch(error){throw console.error("Error getting image dimensions",error),new Error("Please provide a valid image url!")}}static countImageTokens(width,height,detailMode="auto"){if(detailMode==="low")return 85;if(width>2048||height>2048){const aspectRatio=width/height;aspectRatio>1?(width=2048,height=Math.floor(2048/aspectRatio)):(height=2048,width=Math.floor(2048*aspectRatio))}if(width>768&&height>768){const aspectRatio=width/height;aspectRatio>1?(height=768,width=Math.floor(768*aspectRatio)):(width=768,height=Math.floor(768/aspectRatio))}const tilesWidth=Math.ceil(width/512),tilesHeight=Math.ceil(height/512);return 85+170*(tilesWidth*tilesHeight)}static removeDuplicateUserMessages(messages){const _messages=JSON.parse(JSON.stringify(messages));return _messages.length>1&&_messages[0].role===TLLMMessageRole.User&&_messages[1].role===TLLMMessageRole.User&&_messages.shift(),_messages.length>1&&_messages[_messages.length-1].role===TLLMMessageRole.User&&_messages[_messages.length-2].role===TLLMMessageRole.User&&_messages.pop(),_messages}}var __defProp$K=Object.defineProperty,__defNormalProp$K=(obj,key,value)=>key in obj?__defProp$K(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$K=(obj,key,value)=>__defNormalProp$K(obj,key+"",value);class OpenAIApiInterface{constructor(context){__publicField$K(this,"context"),this.context=context}}var TToolType=(TToolType2=>(TToolType2.WebSearch="web_search_preview",TToolType2))(TToolType||{});const MODELS_WITHOUT_TEMPERATURE_SUPPORT=["o3-pro","o4-mini"],MODELS_WITHOUT_PRESENCE_PENALTY_SUPPORT=["o4-mini"],MODELS_WITHOUT_JSON_RESPONSE_SUPPORT=["o1-preview"],MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT=["o1-mini","o1-preview"],SEARCH_TOOL_COSTS={normalModels:{"gpt-4.1":{low:30/1e3,medium:35/1e3,high:50/1e3},"gpt-4o":{low:30/1e3,medium:35/1e3,high:50/1e3}},miniModels:{"gpt-4.1-mini":{low:25/1e3,medium:27.5/1e3,high:30/1e3},"gpt-4o-mini":{low:25/1e3,medium:27.5/1e3,high:30/1e3}}};function isValidOpenAIReasoningEffort(value){return["minimal","low","medium","high"].includes(value)}var __defProp$J=Object.defineProperty,__defNormalProp$J=(obj,key,value)=>key in obj?__defProp$J(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$J=(obj,key,value)=>__defNormalProp$J(obj,typeof key!="symbol"?key+"":key,value);const MAX_IMAGE_SIZE$1=20*1024*1024,MAX_DOCUMENT_SIZE$1=25*1024*1024;class ResponsesApiInterface extends OpenAIApiInterface{constructor(context,deps){super(context),__publicField$J(this,"deps"),__publicField$J(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.image),__publicField$J(this,"validDocumentMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.document),this.deps=deps}async createRequest(body,context){return await(await this.deps.getClient(context)).responses.create({...body,stream:!1})}async createStream(body,context){return await(await this.deps.getClient(context)).responses.create({...body,stream:!0})}handleStream(stream,context){const emitter=new EventEmitter$1;return(async()=>{let finalToolsData=[];try{const streamResult=await this.processStream(stream,emitter);finalToolsData=streamResult.toolsData;const finishReason=streamResult.finishReason||"stop",usageData=streamResult.usageData,reportedUsage=this.reportUsageStatistics(usageData,context);this.emitFinalEvents(emitter,finalToolsData,reportedUsage,finishReason)}catch(error){emitter.emit("error",error)}})(),emitter}async processStream(stream,emitter){let toolsData=[],finishReason="stop";const usageData=[];for await(const part of stream){if("type"in part){const event=part.type;switch(event){case"response.output_text.delta":{if("delta"in part&&part.delta){const deltaMsg={role:"assistant",content:part.delta};emitter.emit("data",deltaMsg),emitter.emit("content",part.delta,"assistant")}break}case"response.function_call_arguments.delta":{const partAny=part;if(partAny?.delta&&partAny?.call_id){let toolIndex=toolsData.findIndex(t=>t.id===partAny.call_id);toolIndex===-1&&(toolIndex=toolsData.length,toolsData.push({index:toolIndex,id:partAny.call_id,type:"function",name:partAny?.name||"",arguments:"",role:"tool"})),toolsData[toolIndex].arguments+=partAny.delta}break}case"response.web_search_call.started":case"response.web_search_call.completed":{const partAny=part;if(partAny?.id){let toolIndex=toolsData.findIndex(t=>t.id===partAny.id);toolIndex===-1?(toolIndex=toolsData.length,toolsData.push({index:toolIndex,id:partAny.id,type:TToolType.WebSearch,name:"web_search",arguments:partAny?.query||"",role:"tool"})):partAny?.query&&(toolsData[toolIndex].arguments=partAny.query)}break}default:{event.includes("done")&&(finishReason="stop");break}}}part?.type==="response.completed"&&part?.response?.usage&&usageData.push(part.response.usage)}return{toolsData:this.extractToolCalls(toolsData),finishReason,usageData}}extractToolCalls(output){return output.map(tool=>({index:tool.index,name:tool.name,arguments:tool.arguments,id:tool.id,type:tool.type,role:tool.role}))}reportUsageStatistics(usage_data,context){const reportedUsage=[];if(usage_data.forEach(usage=>{const convertedUsage={completion_tokens:usage.completion_tokens||0,prompt_tokens:usage.prompt_tokens||0,total_tokens:usage.total_tokens||0,...usage},reported=this.deps.reportUsage(convertedUsage,this.buildUsageContext(context));reportedUsage.push(reported)}),context.toolsInfo?.openai?.webSearch?.enabled){const searchUsage=this.calculateSearchToolUsage(context),reported=this.deps.reportUsage(searchUsage,this.buildUsageContext(context));reportedUsage.push(reported)}return reportedUsage}emitFinalEvents(emitter,toolsData,reportedUsage,finishReason){toolsData.length>0&&emitter.emit(TLLMEvent.ToolInfo,toolsData),finishReason!=="stop"&&emitter.emit("interrupted",finishReason),setImmediate(()=>{emitter.emit("end",toolsData,reportedUsage,finishReason)})}buildUsageContext(context){return{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}}calculateSearchToolUsage(context){const modelName=context.modelEntryName?.replace("smythos/","");return{cost:this.getSearchToolCost(modelName,context.toolsInfo?.openai?.webSearch?.contextSize),completion_tokens:0,prompt_tokens:0,total_tokens:0}}async prepareRequestBody(params){let input=await this.prepareInputMessages(params);input=this.applyToolMessageTransformation(input);const body={model:params.model,input};params?.maxTokens!==void 0&&(body.max_output_tokens=params.maxTokens),params?.temperature!==void 0&&!MODELS_WITHOUT_TEMPERATURE_SUPPORT.includes(params.modelEntryName)&&(body.temperature=params.temperature),params?.topP!==void 0&&(body.top_p=params.topP);const isGPT5ReasoningModels=params.modelEntryName?.includes("gpt-5")&&params?.capabilities?.reasoning;isGPT5ReasoningModels&&params?.verbosity&&(body.text={verbosity:params.verbosity}),isGPT5ReasoningModels&&isValidOpenAIReasoningEffort(params.reasoningEffort)&&(body.reasoning={effort:params.reasoningEffort});let tools=[];if(params?.toolsConfig?.tools&&params?.toolsConfig?.tools?.length>0&&(tools=await this.prepareFunctionTools(params)),params.toolsInfo?.openai?.webSearch?.enabled){const searchTool=this.prepareWebSearchTool(params);tools.push(searchTool)}return tools.length>0&&(body.tools=tools,params?.toolsConfig?.tool_choice&&(body.tool_choice=params?.toolsConfig?.tool_choice)),body}transformToolsConfig(config2){return config2.toolDefinitions.map(tool=>"parameters"in tool?{type:"function",name:tool.name,description:tool.description,parameters:tool.parameters,strict:!1}:{type:"function",name:tool.name,description:tool.description,parameters:{type:"object",properties:tool.properties||{},required:tool.requiredFields||[]},strict:!1})}transformAssistantMessageBlock(messageBlock){const transformedMessageBlock={...messageBlock,content:this.normalizeContent(messageBlock.content)};return transformedMessageBlock.tool_calls&&(transformedMessageBlock.tool_calls=this.transformToolCalls(transformedMessageBlock.tool_calls)),transformedMessageBlock}transformToolCalls(toolCalls){return toolCalls.map(toolCall=>({...toolCall,function:{...toolCall.function,arguments:this.normalizeToolArguments(toolCall.function?.arguments||toolCall.arguments)},arguments:this.normalizeToolArguments(toolCall.arguments)}))}transformToolResults(toolsData){return toolsData.filter(toolData=>this.isValidToolData(toolData)).map(toolData=>this.createToolResultMessage(toolData))}createToolResultMessage(toolData){const baseMessage={tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:this.formatToolResult(toolData)};return toolData.error&&(baseMessage.content=this.formatToolError(toolData)),baseMessage}formatToolResult(toolData){const result=toolData.result;if(typeof result=="string")return result;if(typeof result=="object"&&result!==null)try{return JSON.stringify(result,null,2)}catch(error){return`[Error serializing result: ${error instanceof Error?error.message:"Unknown error"}]`}return this.isWebSearchTool(toolData)?this.formatWebSearchResult(result):result==null?`[Tool ${toolData.name} completed with no result]`:String(result)}formatToolError(toolData){const errorMessage=toolData.error||"Unknown error occurred";return`[Tool Error in ${toolData.name}]: ${errorMessage}`}normalizeContent(content){if(typeof content=="string")return content;if(Array.isArray(content))return content.map(item=>typeof item=="string"?item:item?.text||item?.type==="text"&&item?.text?item.text:JSON.stringify(item)).join(" ");if(typeof content=="object"&&content!==null)try{return JSON.stringify(content)}catch{return"[Error serializing content]"}return String(content||"")}normalizeToolArguments(args){if(typeof args=="string")try{return JSON.parse(args),args}catch{return JSON.stringify(args)}if(typeof args=="object"&&args!==null)try{return JSON.stringify(args)}catch{return"{}"}return args==null?"{}":JSON.stringify(args)}isValidToolData(toolData){return!!(toolData&&toolData.id&&toolData.name&&(toolData.result!==void 0||toolData.error!==void 0))}isWebSearchTool(toolData){return toolData.type===TToolType.WebSearch||toolData.name?.toLowerCase().includes("search")||toolData.name?.toLowerCase().includes("web")}formatWebSearchResult(result){if(!result)return"[Web search completed with no results]";if(typeof result=="string")return result;if(typeof result=="object")try{return result.results||result.items||result.data,JSON.stringify(result,null,2)}catch{return"[Error formatting web search results]"}return String(result)}async handleFileAttachments(files,agentId,messages){if(files.length===0)return messages;const uploadedFiles=await this.uploadFiles(files,agentId),validImageFiles=this.getValidImageFiles(uploadedFiles),validDocumentFiles=this.getValidDocumentFiles(uploadedFiles),imageData=await this.processImageData(validImageFiles,agentId),documentData=await this.processDocumentData(validDocumentFiles,agentId);for(let i=messages.length-1;i>=0;i--)if(messages[i].role==="user"){typeof messages[i].content=="string"?messages[i].content=[{type:"input_text",text:messages[i].content}]:Array.isArray(messages[i].content)||(messages[i].content=[]),messages[i].content.push(...imageData,...documentData);break}return messages.some(item=>item.role==="user")||messages.push({role:"user",content:[...imageData,...documentData]}),messages}getValidImageFiles(files){return files.filter(file=>this.validImageMimeTypes.includes(file?.mimetype))}getValidDocumentFiles(files){return files.filter(file=>this.validDocumentMimeTypes.includes(file?.mimetype))}async uploadFiles(files,agentId){const promises=files.map(file=>{const binaryInput=BinaryInput.from(file);return binaryInput.upload(AccessCandidate.agent(agentId)).then(()=>binaryInput)});return Promise.all(promises)}async processImageData(files,agentId){if(files.length===0)return[];const imageData=[];for(const file of files){await this.validateFileSize(file,MAX_IMAGE_SIZE$1,"Image");const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),url=`data:${file.mimetype};base64,${base64Data}`;imageData.push({type:"input_image",image_url:url})}return imageData}async processDocumentData(files,agentId){if(files.length===0)return[];const documentData=[];for(const file of files){await this.validateFileSize(file,MAX_DOCUMENT_SIZE$1,"Document");const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),fileData=`data:${file.mimetype};base64,${base64Data}`,filename=await file.getName();documentData.push({type:"input_file",file:{file_data:fileData,filename}})}return documentData}async validateFileSize(file,maxSize,fileType){await file.ready();const fileInfo=await file.getJsonData(AccessCandidate.agent("temp"));if(fileInfo.size>maxSize)throw new Error(`${fileType} file size (${fileInfo.size} bytes) exceeds maximum allowed size of ${maxSize} bytes`)}getInterfaceName(){return"responses"}validateParameters(params){return!!params.model}async prepareInputMessages(params){const messages=params?.messages||[],files=params?.files||[];let input=[...messages];return files.length>0&&(input=await this.handleFileAttachments(files,params.agentId,input)),input}async prepareFunctionTools(params){const tools=[];if(params?.toolsConfig?.tools&&params?.toolsConfig?.tools?.length>0){const toolsConfig=this.transformToolsConfig({type:"function",toolDefinitions:params.toolsConfig.tools,toolChoice:"auto",modelInfo:params.modelInfo||null});tools.push(...toolsConfig)}return tools}prepareWebSearchTool(params){const webSearch=params?.toolsInfo?.openai?.webSearch,contextSize=webSearch?.contextSize,searchCity=webSearch?.city,searchCountry=webSearch?.country,searchRegion=webSearch?.region,searchTimezone=webSearch?.timezone,userLocation={type:"approximate"};searchCity&&(userLocation.city=searchCity),searchCountry&&(userLocation.country=searchCountry),searchRegion&&(userLocation.region=searchRegion),searchTimezone&&(userLocation.timezone=searchTimezone);const hasLocationData=searchCity||searchCountry||searchRegion||searchTimezone,searchTool={type:"web_search_preview"},webSearchConfig={};return contextSize&&(webSearchConfig.search_context_size=contextSize),hasLocationData&&(webSearchConfig.user_location=userLocation),{...searchTool,...webSearchConfig}}applyToolMessageTransformation(input){const transformedMessages=[];return input.forEach(message=>{message.role==="assistant"&&message.tool_calls?(message.content&&transformedMessages.push({role:"assistant",content:typeof message.content=="object"?JSON.stringify(message.content):message.content}),message.tool_calls.forEach(toolCall=>{transformedMessages.push({type:"function_call",name:toolCall.function.name,arguments:typeof toolCall.function.arguments=="object"?JSON.stringify(toolCall.function.arguments):toolCall.function.arguments,call_id:toolCall.id})})):message.role==="tool"?transformedMessages.push({type:"function_call_output",call_id:message.tool_call_id,output:typeof message.content=="string"?message.content:JSON.stringify(message.content)}):transformedMessages.push(message)}),transformedMessages}getSearchToolCost(modelName,contextSize){const normalizedModelName=modelName?.replace("smythos/","");return SEARCH_TOOL_COSTS.normalModels[normalizedModelName]?SEARCH_TOOL_COSTS.normalModels[normalizedModelName][contextSize]||0:SEARCH_TOOL_COSTS.miniModels[normalizedModelName]&&SEARCH_TOOL_COSTS.miniModels[normalizedModelName][contextSize]||0}}var __defProp$I=Object.defineProperty,__defNormalProp$I=(obj,key,value)=>key in obj?__defProp$I(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$I=(obj,key,value)=>__defNormalProp$I(obj,typeof key!="symbol"?key+"":key,value);const MAX_IMAGE_SIZE=20*1024*1024,MAX_DOCUMENT_SIZE=25*1024*1024;class ChatCompletionsApiInterface extends OpenAIApiInterface{constructor(context,deps){super(context),__publicField$I(this,"deps"),__publicField$I(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.image),__publicField$I(this,"validDocumentMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.document),this.deps=deps}async createRequest(body,context){return await(await this.deps.getClient(context)).chat.completions.create({...body,stream:!1})}async createStream(body,context){return await(await this.deps.getClient(context)).chat.completions.create({...body,stream:!0,stream_options:{include_usage:!0}})}handleStream(stream,context){const emitter=new EventEmitter$1;return(async()=>{let finalToolsData=[];try{const streamResult=await this.processStream(stream,emitter);finalToolsData=streamResult.toolsData;const finishReason=streamResult.finishReason||"stop",usageData=streamResult.usageData,reportedUsage=this.reportUsageStatistics(usageData,context);this.emitFinalEvents(emitter,finalToolsData,reportedUsage,finishReason)}catch(error){emitter.emit("error",error)}})(),emitter}async prepareRequestBody(params){let messages=await this.prepareMessages(params);if(MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT.includes(params.modelEntryName)&&(messages=this.convertSystemMessagesToUserMessages(messages)),params.responseFormat==="json"){if(!MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT.includes(params.modelEntryName))messages?.[0]?.role===TLLMMessageRole.System?messages[0]={...messages[0],content:messages[0].content+JSON_RESPONSE_INSTRUCTION}:messages.unshift({role:TLLMMessageRole.System,content:JSON_RESPONSE_INSTRUCTION});else{const firstUserMessageIndex=messages.findIndex(msg=>msg.role===TLLMMessageRole.User);if(firstUserMessageIndex!==-1){const userMessage=messages[firstUserMessageIndex],content=typeof userMessage.content=="string"?userMessage.content:"";messages[firstUserMessageIndex]={...userMessage,content:JSON_RESPONSE_INSTRUCTION+`
188
+ The output JSON should only use the entries from the output format.`}return newPrompt}postProcess(response){try{return JSONContent(response).tryParse()}catch{return{error:"Invalid JSON response",data:response,details:"The response from the model is not a valid JSON object. Please check the model output and try again."}}}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto",modelInfo=null}){throw new Error("This model does not support tools")}transformToolMessageBlocks({messageBlock,toolsData}){throw new Error("This model does not support tools")}getConsistentMessages(messages){return messages}async prepareParams(candidate,params){const modelsProvider=ConnectorService.getModelsProviderConnector(),files=params?.files;delete params?.files;const clonedParams=JSON.parse(JSON.stringify(params)),_params=this.formatParamValues(clonedParams),model=_params.model,teamId=await this.getTeamId(candidate);_params.modelEntryName=typeof model=="string"?model:model.modelId,_params.teamId=teamId;const modelProviderCandidate=modelsProvider.requester(candidate),modelInfo=await modelProviderCandidate.getModelInfo(model);if(modelInfo.params)for(let key in modelInfo.params)typeof _params[key]>"u"&&(_params[key]=modelInfo.params[key]);_params.credentials=await getLLMCredentials(candidate,modelInfo),_params.baseURL=modelInfo?.baseURL,_params.modelInfo=modelInfo,_params.maxTokens?_params.maxTokens=await modelProviderCandidate.adjustMaxCompletionTokens(model,_params.maxTokens,_params?.isUserKey):_params.maxTokens=await modelProviderCandidate.getMaxCompletionTokens(model,_params?.isUserKey),_params.model=await modelProviderCandidate.getModelId(model),_params.files=files;const features=modelInfo?.features||[];_params.capabilities={search:features.includes("search"),reasoning:features.includes("reasoning"),imageGeneration:features.includes("image-generation")},_params.toolsInfo={openai:await this.prepareOpenAIToolsInfo(_params),xai:await this.prepareXAIToolsInfo(_params)},_params.agentId=candidate.id;const body=await this.reqBodyAdapter(_params);return{..._params,body}}async prepareOpenAIToolsInfo(params){const openAIToolsInfo={webSearch:{enabled:params?.useWebSearch&&params.capabilities.search===!0,contextSize:params?.webSearchContextSize||"medium"}};return params?.webSearchCity&&(openAIToolsInfo.webSearch.city=params?.webSearchCity),params?.webSearchCountry&&(openAIToolsInfo.webSearch.country=params?.webSearchCountry),params?.webSearchRegion&&(openAIToolsInfo.webSearch.region=params?.webSearchRegion),params?.webSearchTimezone&&(openAIToolsInfo.webSearch.timezone=params?.webSearchTimezone),openAIToolsInfo}async prepareXAIToolsInfo(params){const xaiToolsInfo={search:{enabled:params?.useSearch===!0&&params.capabilities.search===!0}};return params?.searchMode&&(xaiToolsInfo.search.mode=params?.searchMode),params?.returnCitations&&(xaiToolsInfo.search.returnCitations=params?.returnCitations),params?.maxSearchResults&&(xaiToolsInfo.search.maxResults=params?.maxSearchResults),params?.searchDataSources&&(xaiToolsInfo.search.dataSources=params?.searchDataSources),params?.searchCountry&&(xaiToolsInfo.search.country=params?.searchCountry),params?.excludedWebsites&&(xaiToolsInfo.search.excludedWebsites=params?.excludedWebsites),params?.allowedWebsites&&(xaiToolsInfo.search.allowedWebsites=params?.allowedWebsites),params?.includedXHandles&&(xaiToolsInfo.search.includedXHandles=params?.includedXHandles),params?.excludedXHandles&&(xaiToolsInfo.search.excludedXHandles=params?.excludedXHandles),params?.postFavoriteCount&&(xaiToolsInfo.search.postFavoriteCount=params?.postFavoriteCount),params?.postViewCount&&(xaiToolsInfo.search.postViewCount=params?.postViewCount),params?.rssLinks&&(xaiToolsInfo.search.rssLinks=params?.rssLinks),params?.safeSearch&&(xaiToolsInfo.search.safeSearch=params?.safeSearch),params?.fromDate&&(xaiToolsInfo.search.fromDate=params?.fromDate),params?.toDate&&(xaiToolsInfo.search.toDate=params?.toDate),xaiToolsInfo}formatParamValues(params){let _params={};for(const[key,value]of Object.entries(params)){let _value=value;["stopSequences","excludedWebsites","allowedWebsites","includedXHandles","excludedXHandles","rssLinks"].includes(key)&&(_value&&typeof _value=="string"?_value=_value.split(/[,\n]/).map(item=>item.trim()).filter(item=>item.length>0):Array.isArray(_value)?_value=_value:_value=_value?[_value]:null),typeof _value=="string"&&_value.trim()!==""&&!isNaN(Number(_value))&&(_value=+_value),key==="messages"&&(_value=this.getConsistentMessages(_value)),_params[key]=_value}return _params}async getTeamId(candidate){const accountConnector=ConnectorService.getAccountConnector();if(!accountConnector)throw new Error("Account Connector unavailable, cannot proceed");return await accountConnector.getCandidateTeam(candidate)}}var __defProp$L=Object.defineProperty,__defNormalProp$L=(obj,key,value)=>key in obj?__defProp$L(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$L=(obj,key,value)=>__defNormalProp$L(obj,key+"",value);class EchoConnector extends LLMConnector{constructor(){super(...arguments),__publicField$L(this,"name","LLM:Echo")}async request({acRequest,body,context}){const content=body?.messages?.[0]?.content;return{content,finishReason:"stop",useTool:!1,toolsData:[],message:{content,role:"assistant"},usage:{}}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1;let content="";return Array.isArray(body?.messages)&&(content=body?.messages?.filter(m=>m.role==="user").pop()?.content),(async()=>{const chunks=content.split(" ");for(let i=0;i<chunks.length;i++){await new Promise(resolve=>setTimeout(resolve,50));const isLastChunk=i===chunks.length-1,delta={content:chunks[i]+(isLastChunk?"":" ")};emitter.emit("data",delta),emitter.emit("content",delta.content)}setTimeout(()=>{emitter.emit("end",[],[])},100)})(),emitter}async reqBodyAdapter(params){return params}enhancePrompt(prompt,config2){return prompt}postProcess(response){try{const result=JSONContent(response).tryFullParse();return result?.error?response:result}catch{return response}}reportUsage(usage,metadata){}}class LLMHelper{static hasSystemMessage(messages){return Array.isArray(messages)?messages?.some(message=>message.role==="system"):!1}static separateSystemMessages(messages){const systemMessage=messages.find(message=>message.role==="system")||{},otherMessages=messages.filter(message=>message.role!=="system");return{systemMessage,otherMessages}}static async countVisionPromptTokens(prompt){let tokens=0;const textObj=prompt?.filter(item=>["text","input_text"].includes(item.type)),textTokens=encode(textObj?.[0]?.text).length,images=prompt?.filter(item=>["image_url","input_image"].includes(item.type));let imageTokens=0;for(const image of images){const imageUrl=image?.image_url?.url||image?.image_url,{width,height}=await this.getImageDimensions(imageUrl),tokens2=this.countImageTokens(width,height);imageTokens+=tokens2}return tokens=textTokens+imageTokens,tokens}static async getImageDimensions(imageUrl){try{let buffer;if(isBase64FileUrl(imageUrl)){const base64Data=imageUrl.replace(/^data:image\/\w+;base64,/,"");buffer=Buffer.from(base64Data,"base64")}else if(isUrl(imageUrl)){const response=await axios.get(imageUrl,{responseType:"arraybuffer"});buffer=Buffer.from(response.data)}else throw new Error("Please provide a valid image url!");const dimensions=imageSize(buffer);return{width:dimensions?.width||0,height:dimensions?.height||0}}catch(error){throw console.error("Error getting image dimensions",error),new Error("Please provide a valid image url!")}}static countImageTokens(width,height,detailMode="auto"){if(detailMode==="low")return 85;if(width>2048||height>2048){const aspectRatio=width/height;aspectRatio>1?(width=2048,height=Math.floor(2048/aspectRatio)):(height=2048,width=Math.floor(2048*aspectRatio))}if(width>768&&height>768){const aspectRatio=width/height;aspectRatio>1?(height=768,width=Math.floor(768*aspectRatio)):(width=768,height=Math.floor(768/aspectRatio))}const tilesWidth=Math.ceil(width/512),tilesHeight=Math.ceil(height/512);return 85+170*(tilesWidth*tilesHeight)}static removeDuplicateUserMessages(messages){const _messages=JSON.parse(JSON.stringify(messages));return _messages.length>1&&_messages[0].role===TLLMMessageRole.User&&_messages[1].role===TLLMMessageRole.User&&_messages.shift(),_messages.length>1&&_messages[_messages.length-1].role===TLLMMessageRole.User&&_messages[_messages.length-2].role===TLLMMessageRole.User&&_messages.pop(),_messages}}var __defProp$K=Object.defineProperty,__defNormalProp$K=(obj,key,value)=>key in obj?__defProp$K(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$K=(obj,key,value)=>__defNormalProp$K(obj,key+"",value);class OpenAIApiInterface{constructor(context){__publicField$K(this,"context"),this.context=context}}var TToolType=(TToolType2=>(TToolType2.WebSearch="web_search_preview",TToolType2))(TToolType||{});const MODELS_WITHOUT_TEMPERATURE_SUPPORT=["o3-pro","o4-mini"],MODELS_WITHOUT_PRESENCE_PENALTY_SUPPORT=["o4-mini"],MODELS_WITHOUT_JSON_RESPONSE_SUPPORT=["o1-preview"],MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT=["o1-mini","o1-preview"],SEARCH_TOOL_COSTS={"gpt-4":.025,"gpt-5":.01};function isValidOpenAIReasoningEffort(value){return["minimal","low","medium","high"].includes(value)}var __defProp$J=Object.defineProperty,__defNormalProp$J=(obj,key,value)=>key in obj?__defProp$J(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$J=(obj,key,value)=>__defNormalProp$J(obj,typeof key!="symbol"?key+"":key,value);const MAX_IMAGE_SIZE$1=20*1024*1024,MAX_DOCUMENT_SIZE$1=25*1024*1024,EVENT_TYPES={WEB_SEARCH_IN_PROGRESS:"response.web_search_call.in_progress",WEB_SEARCH_SEARCHING:"response.web_search_call.searching",WEB_SEARCH_COMPLETED:"response.web_search_call.completed",WEB_SEARCH_STARTED:"response.web_search_call.started",RESPONSE_COMPLETED:"response.completed",OUTPUT_TEXT_DELTA:"response.output_text.delta",OUTPUT_ITEM_ADDED:"response.output_item.added",FUNCTION_CALL_ARGUMENTS_DELTA:"response.function_call_arguments.delta",FUNCTION_CALL_ARGUMENTS_DONE:"response.function_call_arguments.done",OUTPUT_ITEM_DONE:"response.output_item.done"};class ResponsesApiInterface extends OpenAIApiInterface{constructor(context,deps){super(context),__publicField$J(this,"deps"),__publicField$J(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.image),__publicField$J(this,"validDocumentMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.document),this.deps=deps}async createRequest(body,context){return await(await this.deps.getClient(context)).responses.create({...body,stream:!1})}async createStream(body,context){return await(await this.deps.getClient(context)).responses.create({...body,stream:!0})}handleStream(stream,context){const emitter=new EventEmitter$1;return(async()=>{let finalToolsData=[];try{const streamResult=await this.processStream(stream,emitter);finalToolsData=streamResult.toolsData;const finishReason=streamResult.finishReason||"stop",usageData=streamResult.usageData,reportedUsage=this.reportUsageStatistics(usageData,context);this.emitFinalEvents(emitter,finalToolsData,reportedUsage,finishReason)}catch(error){emitter.emit("error",error)}})(),emitter}async processStream(stream,emitter){let toolsData=[],finishReason="stop";const usageData=[];for await(const part of stream)try{if("type"in part)switch(part.type){case EVENT_TYPES.WEB_SEARCH_IN_PROGRESS:toolsData=this.handleWebSearchInProgress(part,toolsData);break;case EVENT_TYPES.WEB_SEARCH_SEARCHING:toolsData=this.handleWebSearchSearching(part,toolsData);break;case EVENT_TYPES.WEB_SEARCH_COMPLETED:toolsData=this.handleWebSearchCompleted(part,toolsData);break;case EVENT_TYPES.OUTPUT_TEXT_DELTA:this.handleOutputTextDelta(part,emitter);break;case EVENT_TYPES.OUTPUT_ITEM_ADDED:toolsData=this.handleOutputItemAdded(part,toolsData,emitter);break;case EVENT_TYPES.FUNCTION_CALL_ARGUMENTS_DELTA:toolsData=this.handleFunctionCallArgumentsDelta(part,toolsData,emitter);break;case EVENT_TYPES.FUNCTION_CALL_ARGUMENTS_DONE:toolsData=this.handleFunctionCallArgumentsDone(part,toolsData,emitter);break;case EVENT_TYPES.OUTPUT_ITEM_DONE:toolsData=this.handleOutputItemDone(part,toolsData);break;case EVENT_TYPES.RESPONSE_COMPLETED:{finishReason="stop";const responseData=part?.response;responseData?.usage&&usageData.push(responseData.usage);break}default:{const eventType=String(part.type);if(eventType===EVENT_TYPES.WEB_SEARCH_STARTED){const legacyId=part?.id;typeof legacyId=="string"&&(toolsData=this.upsertWebSearchToolImmutable(toolsData,legacyId).toolsData);break}finishReason=this.handleCompletionEvent(eventType);break}}}catch(error){console.warn("Error processing stream event:",error,"Event:",part)}return{toolsData:this.extractToolCalls(toolsData),finishReason,usageData}}extractToolCalls(output){return output.map(tool=>({index:tool.index,name:tool.name,arguments:tool.arguments,id:tool.callId||tool.id,type:tool.type,role:tool.role,callId:tool.callId}))}reportUsageStatistics(usage_data,context){const reportedUsage=[];if(usage_data.forEach(usage=>{const convertedUsage={completion_tokens:usage.completion_tokens||0,prompt_tokens:usage.prompt_tokens||0,total_tokens:usage.total_tokens||0,...usage},reported=this.deps.reportUsage(convertedUsage,this.buildUsageContext(context));reportedUsage.push(reported)}),context.toolsInfo?.openai?.webSearch?.enabled){const searchUsage=this.calculateSearchToolUsage(context),reported=this.deps.reportUsage(searchUsage,this.buildUsageContext(context));reportedUsage.push(reported)}return reportedUsage}emitFinalEvents(emitter,toolsData,reportedUsage,finishReason){toolsData.length>0&&emitter.emit(TLLMEvent.ToolInfo,toolsData),finishReason!=="stop"&&emitter.emit("interrupted",finishReason),setImmediate(()=>{emitter.emit("end",toolsData,reportedUsage,finishReason)})}buildUsageContext(context){return{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}}calculateSearchToolUsage(context){const modelName=context.modelEntryName?.replace("smythos/","");return{cost:this.getSearchToolCost(modelName),completion_tokens:0,prompt_tokens:0,total_tokens:0}}handleWebSearchCompleted(event,toolsData){try{const{item_id:itemId}=event;return this.upsertWebSearchToolImmutable(toolsData,itemId).toolsData}catch(error){return console.warn("Error handling web search completed event:",error),toolsData}}handleWebSearchInProgress(event,toolsData){try{const{item_id:itemId}=event;return this.upsertWebSearchToolImmutable(toolsData,itemId).toolsData}catch(error){return console.warn("Error handling web search in_progress event:",error),toolsData}}handleWebSearchSearching(event,toolsData){try{const{item_id:itemId}=event;return this.upsertWebSearchToolImmutable(toolsData,itemId).toolsData}catch(error){return console.warn("Error handling web search searching event:",error),toolsData}}handleOutputTextDelta(part,emitter){try{if("delta"in part&&part.delta){const deltaMsg={role:"assistant",content:part.delta};emitter.emit("data",deltaMsg),emitter.emit("content",part.delta,"assistant")}}catch(error){console.warn("Error handling output text delta:",error)}}handleOutputItemAdded(part,toolsData,emitter){try{const partAny=part;if(partAny.item&&partAny.item.type==="function_call"){const item=partAny.item,callId=item.call_id,functionName=item.name,itemId=item.id;if(callId&&itemId){const existingIndex=toolsData.findIndex(t=>t.id===itemId||t.id===callId),addingNew=existingIndex===-1,nextIndex=addingNew?toolsData.length:existingIndex;let updated;if(addingNew){const newItem={index:nextIndex,id:itemId,callId,type:"function",name:functionName||"",arguments:item.arguments||"",role:"tool"};updated=[...toolsData,newItem]}else updated=toolsData.map((t,idx)=>idx!==existingIndex?t:{...t,name:functionName||t.name,arguments:item.arguments!==void 0?item.arguments:t.arguments,callId:t.callId||callId});return addingNew&&emitter.emit("tool_call_started",{id:callId,name:functionName||"",type:"function"}),updated}}return toolsData}catch(error){return console.warn("Error handling output item added:",error),toolsData}}handleFunctionCallArgumentsDelta(part,toolsData,emitter){try{if("delta"in part&&"item_id"in part&&typeof part.delta=="string"&&typeof part.item_id=="string"){const delta=part.delta,itemId=part.item_id,existingIndex=toolsData.findIndex(t=>t.id===itemId);let updated,finalIndex;if(existingIndex===-1){finalIndex=toolsData.length;const newItem={index:finalIndex,id:itemId,type:"function",name:"",arguments:delta,role:"tool"};updated=[...toolsData,newItem]}else finalIndex=existingIndex,updated=toolsData.map((t,idx)=>idx===existingIndex?{...t,arguments:String(t.arguments||"")+delta}:t);const entry=updated[finalIndex];return emitter.emit("tool_call_progress",{id:entry.callId||itemId,name:entry.name,arguments:entry.arguments,delta}),updated}return toolsData}catch(error){return console.warn("Error handling function call arguments delta:",error),toolsData}}handleFunctionCallArgumentsDone(part,toolsData,emitter){try{const partAny=part;if(partAny.item_id&&partAny.arguments){const itemId=partAny.item_id,finalArguments=partAny.arguments,toolIndex=toolsData.findIndex(t=>t.id===itemId);if(toolIndex!==-1){const updated=toolsData.map((t,idx)=>idx===toolIndex?{...t,arguments:finalArguments}:t),updatedEntry=updated[toolIndex];return emitter.emit("tool_call_completed",{id:updatedEntry.callId||itemId,name:updatedEntry.name,arguments:finalArguments}),updated}}return toolsData}catch(error){return console.warn("Error handling function call arguments done:",error),toolsData}}handleOutputItemDone(part,toolsData){try{const partAny=part;if(partAny.item&&partAny.item.type==="function_call"&&partAny.item.status==="completed"){const item=partAny.item,callId=item.call_id,itemId=item.id,toolIndex=toolsData.findIndex(t=>t.id===itemId||t.id===callId);if(toolIndex!==-1&&item.arguments)return toolsData.map((t,idx)=>idx===toolIndex?{...t,arguments:item.arguments,callId:t.callId||callId}:t)}return toolsData}catch(error){return console.warn("Error handling output item done:",error),toolsData}}handleCompletionEvent(eventType){return eventType===EVENT_TYPES.RESPONSE_COMPLETED||eventType.includes("done"),"stop"}async prepareRequestBody(params){let input=await this.prepareInputMessages(params);input=this.applyToolMessageTransformation(input);const body={model:params.model,input};params?.maxTokens!==void 0&&(body.max_output_tokens=params.maxTokens),params?.temperature!==void 0&&!MODELS_WITHOUT_TEMPERATURE_SUPPORT.includes(params.modelEntryName)&&(body.temperature=params.temperature),params?.topP!==void 0&&(body.top_p=params.topP);const isGPT5ReasoningModels=params.modelEntryName?.includes("gpt-5")&&params?.capabilities?.reasoning;isGPT5ReasoningModels&&params?.verbosity&&(body.text={verbosity:params.verbosity}),isGPT5ReasoningModels&&isValidOpenAIReasoningEffort(params.reasoningEffort)&&(body.reasoning={effort:params.reasoningEffort});let tools=[];if(params?.toolsConfig?.tools&&params?.toolsConfig?.tools?.length>0&&(tools=await this.prepareFunctionTools(params)),params.toolsInfo?.openai?.webSearch?.enabled){const searchTool=this.prepareWebSearchTool(params);tools.push(searchTool)}if(tools.length>0)if(body.tools=tools,params?.toolsConfig?.tool_choice){const toolChoice=params.toolsConfig.tool_choice;this.validateToolChoice(toolChoice,tools)?typeof toolChoice=="string"?body.tool_choice=toolChoice:typeof toolChoice=="object"&&toolChoice!==null&&("type"in toolChoice&&toolChoice.type==="function"&&"function"in toolChoice&&"name"in toolChoice.function?body.tool_choice={type:"function",name:toolChoice.function.name}:body.tool_choice=toolChoice):body.tool_choice="auto"}else body.tool_choice="auto";return body}transformToolsConfig(config2){return!config2?.toolDefinitions||!Array.isArray(config2.toolDefinitions)?[]:config2.toolDefinitions.map((tool,index)=>{if(!tool||typeof tool!="object")return{type:"function",name:void 0,description:void 0,parameters:{type:"object",properties:void 0,required:void 0},strict:!1};if("function"in tool&&tool.function&&typeof tool.function=="object"&&tool.function!==null){const funcTool=tool.function;return!funcTool.name||typeof funcTool.name!="string"?{type:"function",name:void 0,description:tool.description||"",parameters:{type:"object",properties:void 0,required:void 0},strict:!1}:{type:"function",name:funcTool.name,description:funcTool.description||tool.description||"",parameters:funcTool.parameters||{type:"object",properties:{},required:[]},strict:!1}}if("parameters"in tool)return{type:"function",name:tool.name,description:tool.description||"",parameters:tool.parameters||{type:"object",properties:{},required:[]},strict:!1};const legacyTool=tool;return{type:"function",name:tool.name,description:tool.description||legacyTool.desc,parameters:{type:"object",properties:legacyTool.properties,required:legacyTool.requiredFields||legacyTool.required},strict:!1}}).filter(Boolean)}normalizeToolArguments(args){if(typeof args=="string")try{return JSON.parse(args),args}catch{return JSON.stringify(args)}if(typeof args=="object"&&args!==null)try{return JSON.stringify(args)}catch{return"{}"}return args==null?"{}":JSON.stringify(args)}isValidToolData(toolData){return!!(toolData&&toolData.id&&toolData.name&&(toolData.result!==void 0||toolData.error!==void 0))}async handleFileAttachments(files,agentId,messages){if(files.length===0)return messages;const uploadedFiles=await this.uploadFiles(files,agentId),validImageFiles=this.getValidImageFiles(uploadedFiles),validDocumentFiles=this.getValidDocumentFiles(uploadedFiles),imageData=await this.processImageData(validImageFiles,agentId),documentData=await this.processDocumentData(validDocumentFiles,agentId);for(let i=messages.length-1;i>=0;i--)if(messages[i].role==="user"){typeof messages[i].content=="string"?messages[i].content=[{type:"input_text",text:messages[i].content}]:Array.isArray(messages[i].content)||(messages[i].content=[]),messages[i].content.push(...imageData,...documentData);break}return messages.some(item=>item.role==="user")||messages.push({role:"user",content:[...imageData,...documentData]}),messages}getValidImageFiles(files){return files.filter(file=>this.validImageMimeTypes.includes(file?.mimetype))}getValidDocumentFiles(files){return files.filter(file=>this.validDocumentMimeTypes.includes(file?.mimetype))}async uploadFiles(files,agentId){const promises=files.map(file=>{const binaryInput=BinaryInput.from(file);return binaryInput.upload(AccessCandidate.agent(agentId)).then(()=>binaryInput)});return Promise.all(promises)}async processImageData(files,agentId){if(files.length===0)return[];const imageData=[];for(const file of files){await this.validateFileSize(file,MAX_IMAGE_SIZE$1,"Image");const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),url=`data:${file.mimetype};base64,${base64Data}`;imageData.push({type:"input_image",image_url:url})}return imageData}async processDocumentData(files,agentId){if(files.length===0)return[];const documentData=[];for(const file of files){await this.validateFileSize(file,MAX_DOCUMENT_SIZE$1,"Document");const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),fileData=`data:${file.mimetype};base64,${base64Data}`,filename=await file.getName();documentData.push({type:"input_file",file:{file_data:fileData,filename}})}return documentData}async validateFileSize(file,maxSize,fileType){await file.ready();const fileInfo=await file.getJsonData(AccessCandidate.agent("temp"));if(fileInfo.size>maxSize)throw new Error(`${fileType} file size (${fileInfo.size} bytes) exceeds maximum allowed size of ${maxSize} bytes`)}getInterfaceName(){return"responses"}validateParameters(params){return!!params.model}async prepareInputMessages(params){const messages=params?.messages||[],files=params?.files||[];let input=[...messages];return files.length>0&&(input=await this.handleFileAttachments(files,params.agentId,input)),input}async prepareFunctionTools(params){const tools=[];if(params?.toolsConfig?.tools&&Array.isArray(params.toolsConfig.tools)&&params.toolsConfig.tools.length>0)try{const validTools=this.transformToolsConfig({type:"function",toolDefinitions:params.toolsConfig.tools,toolChoice:params.toolsConfig.tool_choice||"auto",modelInfo:params.modelInfo||null}).filter((tool,index)=>!(tool.type!=="function"||!tool.name));tools.push(...validTools)}catch{}return tools}prepareWebSearchTool(params){const webSearch=params?.toolsInfo?.openai?.webSearch,contextSize=webSearch?.contextSize,searchCity=webSearch?.city,searchCountry=webSearch?.country,searchRegion=webSearch?.region,searchTimezone=webSearch?.timezone,userLocation={type:"approximate"};searchCity&&(userLocation.city=searchCity),searchCountry&&(userLocation.country=searchCountry),searchRegion&&(userLocation.region=searchRegion),searchTimezone&&(userLocation.timezone=searchTimezone);const hasLocationData=searchCity||searchCountry||searchRegion||searchTimezone,searchTool={type:"web_search_preview"},webSearchConfig={};return contextSize&&(webSearchConfig.search_context_size=contextSize),hasLocationData&&(webSearchConfig.user_location=userLocation),{...searchTool,...webSearchConfig}}applyToolMessageTransformation(input){const transformedMessages=[];for(let i=0;i<input.length;i++){const message=input[i];try{if(message.role==="assistant"&&message.tool_calls&&Array.isArray(message.tool_calls)){if(message.content!==void 0&&message.content!==null){const contentStr=typeof message.content=="string"?message.content:JSON.stringify(message.content);contentStr.trim().length>0&&transformedMessages.push({role:"assistant",content:contentStr})}message.tool_calls.forEach((toolCall,index)=>{if(!toolCall||!toolCall.function)return;const functionArgs=toolCall.function.arguments,normalizedArgs=functionArgs==null?void 0:typeof functionArgs=="object"?JSON.stringify(functionArgs):String(functionArgs);transformedMessages.push({type:"function_call",name:toolCall.function.name||"",arguments:normalizedArgs,call_id:toolCall.id||toolCall.call_id||`call_${Date.now()}_${index}`})})}else if(message.role==="tool"){if(!message.tool_call_id)return;const outputContent=message.content,normalizedOutput=typeof outputContent=="string"?outputContent:JSON.stringify(outputContent||"null");transformedMessages.push({type:"function_call_output",call_id:message.tool_call_id,output:normalizedOutput})}else transformedMessages.push(message)}catch{transformedMessages.push(message)}}return transformedMessages.filter((msg,index)=>!(!msg||typeof msg!="object"))}getSearchToolCost(modelName){if(!modelName)return 0;const normalized=String(modelName).toLowerCase().replace(/^smythos\//,""),match=Object.entries(SEARCH_TOOL_COSTS).find(([family])=>normalized.startsWith(family));return match?match[1]:0}async processFunctionCallResults(toolsData){const processedTools=[];for(const tool of toolsData)if(this.isValidToolData(tool))try{const processedTool={...tool,arguments:this.normalizeToolArguments(tool.arguments),function:tool.function||{name:tool.name,arguments:this.normalizeToolArguments(tool.arguments)}};processedTools.push(processedTool)}catch(error){processedTools.push({...tool,error:error instanceof Error?error.message:"Unknown processing error",result:void 0})}return processedTools}validateToolChoice(toolChoice,availableTools){return toolChoice?typeof toolChoice=="string"?["auto","required","none"].includes(toolChoice):typeof toolChoice=="object"&&toolChoice!==null&&toolChoice.type==="function"&&toolChoice.function?.name?availableTools.some(tool=>tool.type==="function"&&tool.name===toolChoice.function.name):!1:!0}upsertWebSearchToolImmutable(toolsData,id,args=""){const existingIndex=toolsData.findIndex(t=>t.id===id);if(existingIndex===-1){const index=toolsData.length,newItem={index,id,type:TToolType.WebSearch,name:"web_search",arguments:args,role:"tool"};return{toolsData:[...toolsData,newItem],index}}return args?{toolsData:toolsData.map((t,idx)=>idx===existingIndex?{...t,arguments:args}:t),index:existingIndex}:{toolsData,index:existingIndex}}}var __defProp$I=Object.defineProperty,__defNormalProp$I=(obj,key,value)=>key in obj?__defProp$I(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$I=(obj,key,value)=>__defNormalProp$I(obj,typeof key!="symbol"?key+"":key,value);const MAX_IMAGE_SIZE=20*1024*1024,MAX_DOCUMENT_SIZE=25*1024*1024;class ChatCompletionsApiInterface extends OpenAIApiInterface{constructor(context,deps){super(context),__publicField$I(this,"deps"),__publicField$I(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.image),__publicField$I(this,"validDocumentMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.document),this.deps=deps}async createRequest(body,context){return await(await this.deps.getClient(context)).chat.completions.create({...body,stream:!1})}async createStream(body,context){return await(await this.deps.getClient(context)).chat.completions.create({...body,stream:!0,stream_options:{include_usage:!0}})}handleStream(stream,context){const emitter=new EventEmitter$1;return(async()=>{let finalToolsData=[];try{const streamResult=await this.processStream(stream,emitter);finalToolsData=streamResult.toolsData;const finishReason=streamResult.finishReason||"stop",usageData=streamResult.usageData,reportedUsage=this.reportUsageStatistics(usageData,context);this.emitFinalEvents(emitter,finalToolsData,reportedUsage,finishReason)}catch(error){emitter.emit("error",error)}})(),emitter}async prepareRequestBody(params){let messages=await this.prepareMessages(params);if(MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT.includes(params.modelEntryName)&&(messages=this.convertSystemMessagesToUserMessages(messages)),params.responseFormat==="json"){if(!MODELS_WITHOUT_SYSTEM_MESSAGE_SUPPORT.includes(params.modelEntryName))messages?.[0]?.role===TLLMMessageRole.System?messages[0]={...messages[0],content:messages[0].content+JSON_RESPONSE_INSTRUCTION}:messages.unshift({role:TLLMMessageRole.System,content:JSON_RESPONSE_INSTRUCTION});else{const firstUserMessageIndex=messages.findIndex(msg=>msg.role===TLLMMessageRole.User);if(firstUserMessageIndex!==-1){const userMessage=messages[firstUserMessageIndex],content=typeof userMessage.content=="string"?userMessage.content:"";messages[firstUserMessageIndex]={...userMessage,content:JSON_RESPONSE_INSTRUCTION+`
189
189
 
190
190
  `+content}}else messages.push({role:TLLMMessageRole.User,content:JSON_RESPONSE_INSTRUCTION})}params.responseFormat={type:"json_object"}}const body={model:params.model,messages};params?.maxTokens!==void 0&&(body.max_completion_tokens=params.maxTokens),params?.temperature!==void 0&&!MODELS_WITHOUT_TEMPERATURE_SUPPORT.includes(params.modelEntryName)&&(body.temperature=params.temperature),params?.topP!==void 0&&(body.top_p=params.topP),params?.frequencyPenalty!==void 0&&(body.frequency_penalty=params.frequencyPenalty),params?.presencePenalty!==void 0&&!MODELS_WITHOUT_PRESENCE_PENALTY_SUPPORT.includes(params.modelEntryName)&&(body.presence_penalty=params.presencePenalty),params?.responseFormat?.type&&!MODELS_WITHOUT_JSON_RESPONSE_SUPPORT.includes(params.modelEntryName)&&(body.response_format=params.responseFormat),params?.stopSequences?.length&&(body.stop=params.stopSequences);const isGPT5ReasoningModels=params.modelEntryName?.includes("gpt-5")&&params?.capabilities?.reasoning;return isGPT5ReasoningModels&&params?.verbosity&&(body.verbosity=params.verbosity),isGPT5ReasoningModels&&isValidOpenAIReasoningEffort(params.reasoningEffort)&&(body.reasoning_effort=params.reasoningEffort),params?.toolsConfig?.tools&&params?.toolsConfig?.tools?.length>0&&(body.tools=params?.toolsConfig?.tools,body.tool_choice=params?.toolsConfig?.tool_choice),body}transformToolsConfig(config2){return config2.toolDefinitions.map(tool=>"parameters"in tool?{type:"function",function:{name:tool.name,description:tool.description,parameters:tool.parameters}}:{type:"function",function:{name:tool.name,description:tool.description,parameters:{type:"object",properties:tool.properties||{},required:tool.requiredFields||[]}}})}async handleFileAttachments(files,agentId,messages){if(files.length===0)return messages;const uploadedFiles=await this.uploadFiles(files,agentId),validImageFiles=this.getValidImageFiles(uploadedFiles),validDocumentFiles=this.getValidDocumentFiles(uploadedFiles),imageData=await this.processImageData(validImageFiles,agentId),documentData=await this.processDocumentData(validDocumentFiles,agentId),messagesCopy=[...messages],userMessage=Array.isArray(messagesCopy)&&messagesCopy.length>0?messagesCopy[messagesCopy.length-1]:{content:""},promptData=[{type:"text",text:(userMessage?.content&&typeof userMessage.content=="string"?userMessage.content:"")||""},...imageData,...documentData];return messagesCopy.length>0?messagesCopy[messagesCopy.length-1]={role:"user",content:promptData}:messagesCopy.push({role:"user",content:promptData}),messagesCopy}async processStream(stream,emitter){let toolsData=[],finishReason="stop";const usageData=[];for await(const part of stream){const delta=part.choices[0]?.delta,usage=part.usage;if(usage&&usageData.push(usage),emitter.emit("data",delta),!delta?.tool_calls&&delta?.content&&emitter.emit("content",delta?.content,delta?.role),delta?.tool_calls){const toolCall=delta?.tool_calls?.[0],index=toolCall?.index;toolsData[index]||(toolsData[index]={index:index||0,id:"",type:"function",name:"",arguments:"",role:"tool"}),toolCall?.function?.name&&(toolsData[index].name=toolCall.function.name),toolCall?.function?.arguments&&(toolsData[index].arguments+=toolCall.function.arguments),toolCall?.id&&(toolsData[index].id=toolCall.id)}part.choices[0]?.finish_reason&&(finishReason=part.choices[0].finish_reason)}return{toolsData:this.extractToolCalls(toolsData),finishReason,usageData}}extractToolCalls(toolsData){return toolsData.map(tool=>({index:tool.index,name:tool.name,arguments:tool.arguments,id:tool.id,type:tool.type,role:tool.role}))}reportUsageStatistics(usage_data,context){const reportedUsage=[];return usage_data.forEach(usage=>{const reported=this.deps.reportUsage(usage,this.buildUsageContext(context));reportedUsage.push(reported)}),reportedUsage}emitFinalEvents(emitter,toolsData,reportedUsage,finishReason){toolsData.length>0&&emitter.emit(TLLMEvent.ToolInfo,toolsData),finishReason!=="stop"&&emitter.emit("interrupted",finishReason),setImmediate(()=>{emitter.emit("end",toolsData,reportedUsage,finishReason)})}buildUsageContext(context){return{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}}getValidImageFiles(files){return files.filter(file=>this.validImageMimeTypes.includes(file?.mimetype))}getValidDocumentFiles(files){return files.filter(file=>this.validDocumentMimeTypes.includes(file?.mimetype))}async uploadFiles(files,agentId){const promises=files.map(file=>{const binaryInput=BinaryInput.from(file);return binaryInput.upload(AccessCandidate.agent(agentId)).then(()=>binaryInput)});return Promise.all(promises)}async processImageData(files,agentId){if(files.length===0)return[];const imageData=[];for(const file of files){await this.validateFileSize(file,MAX_IMAGE_SIZE,"Image",agentId);const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),url=`data:${file.mimetype};base64,${base64Data}`;imageData.push({type:"image_url",image_url:{url}})}return imageData}async processDocumentData(files,agentId){if(files.length===0)return[];const documentData=[];for(const file of files){await this.validateFileSize(file,MAX_DOCUMENT_SIZE,"Document",agentId);const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),fileData=`data:${file.mimetype};base64,${base64Data}`,filename=await file.getName();documentData.push({type:"file",file:{file_data:fileData,filename}})}return documentData}async validateFileSize(file,maxSize,fileType,agentId){await file.ready();const fileInfo=await file.getJsonData(AccessCandidate.agent(agentId));if(fileInfo.size>maxSize)throw new Error(`${fileType} file size (${fileInfo.size} bytes) exceeds maximum allowed size of ${maxSize} bytes`)}getInterfaceName(){return"chat.completions"}validateParameters(params){return!!params.model&&Array.isArray(params.messages)}convertSystemMessagesToUserMessages(messages){const convertedMessages=[],systemMessages=[];for(const message of messages)if(message.role===TLLMMessageRole.System){const content=typeof message.content=="string"?message.content:"";content.trim()&&systemMessages.push(content)}else convertedMessages.push(message);if(systemMessages.length>0){const systemContent=systemMessages.join(`
191
191
 
192
192
  `),firstUserMessageIndex=convertedMessages.findIndex(msg=>msg.role===TLLMMessageRole.User);if(firstUserMessageIndex!==-1){const userMessage=convertedMessages[firstUserMessageIndex],existingContent=typeof userMessage.content=="string"?userMessage.content:"";convertedMessages[firstUserMessageIndex]={...userMessage,content:systemContent+`
193
193
 
194
- `+existingContent}}else convertedMessages.unshift({role:TLLMMessageRole.User,content:systemContent})}return convertedMessages}async prepareMessages(params){const messages=params?.messages||[],files=params?.files||[];return files.length>0?await this.handleFileAttachments(files,params.agentId,[...messages]):messages}}class OpenAIApiInterfaceFactory{constructor(){}createInterface(interfaceType,context,deps){if(!context||!deps)throw new Error("Context and dependencies (getClient(), reportUsage()) are required to create an interface");switch(interfaceType){case"responses":return new ResponsesApiInterface(context,deps);case"chat.completions":return new ChatCompletionsApiInterface(context,deps);default:throw new Error(`Unsupported OpenAI API interface type: ${interfaceType}. Supported types: ${this.getSupportedInterfaces().join(", ")}`)}}getSupportedInterfaces(){return["responses","chat.completions"]}isInterfaceSupported(interfaceType){return this.getSupportedInterfaces().includes(interfaceType)}getDefaultInterfaceType(){return"chat.completions"}getInterfaceTypeFromModelInfo(modelInfo){return modelInfo?.interface||this.getDefaultInterfaceType()}}var __defProp$H=Object.defineProperty,__defNormalProp$H=(obj,key,value)=>key in obj?__defProp$H(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$H=(obj,key,value)=>__defNormalProp$H(obj,typeof key!="symbol"?key+"":key,value);class OpenAIConnector extends LLMConnector{constructor(){super(),__publicField$H(this,"name","LLM:OpenAI"),__publicField$H(this,"interfaceFactory"),this.interfaceFactory=new OpenAIApiInterfaceFactory}getApiInterface(interfaceType,context){const deps={getClient:context2=>this.getClient(context2),reportUsage:(usage,metadata)=>this.reportUsage(usage,metadata)};return this.interfaceFactory.createInterface(interfaceType,context,deps)}getInterfaceType(context){let responseInterface=this.interfaceFactory.getInterfaceTypeFromModelInfo(context.modelInfo);return context.toolsInfo?.openai?.webSearch?.enabled===!0&&(responseInterface="responses"),responseInterface}async getClient(params){const apiKey=params.credentials?.apiKey,baseURL=params?.modelInfo?.baseURL;if(!apiKey)throw new Error("Please provide an API key for OpenAI");return new OpenAI({baseURL,apiKey})}async request({acRequest,body,context}){const _body=body,messages=_body?.messages||[],lastMessage=messages[messages.length-1],promptTokens=context?.hasFiles?await LLMHelper.countVisionPromptTokens(lastMessage?.content):encodeChat(messages,"gpt-4")?.length;await this.validateTokenLimit({acRequest,promptTokens,context,maxTokens:_body.max_completion_tokens});const responseInterface=this.getInterfaceType(context),result=await this.getApiInterface(responseInterface,context).createRequest(body,context),message=result?.choices?.[0]?.message,finishReason=result?.choices?.[0]?.finish_reason;let toolsData=[],useTool=!1;finishReason==="tool_calls"&&(toolsData=message?.tool_calls?.map((tool,index)=>({index,id:tool?.id,type:tool?.type,name:tool?.function?.name,arguments:tool?.function?.arguments,role:"tool"}))||[],useTool=!0);const usage=result?.usage;return this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}),{content:message?.content??"",finishReason,useTool,toolsData,message,usage}}async streamRequest({acRequest,body,context}){const messages=body?.messages||body?.input||[],lastMessage=messages[messages.length-1],promptTokens=context?.hasFiles?await LLMHelper.countVisionPromptTokens(lastMessage?.content):encodeChat(messages,"gpt-4")?.length;await this.validateTokenLimit({acRequest,promptTokens,context,maxTokens:body.max_completion_tokens});const responseInterface=this.getInterfaceType(context),apiInterface=this.getApiInterface(responseInterface,context),stream=await apiInterface.createStream(body,context);return apiInterface.handleStream(stream,context)}async imageGenRequest({acRequest,body,context}){return await(await this.getClient(context)).images.generate(body)}async imageEditRequest({acRequest,body,context}){const _body=body;return await(await this.getClient(context)).images.edit(_body)}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto",modelInfo=null}){let tools=[];if(toolDefinitions&&toolDefinitions.length>0){const interfaceType=modelInfo?.interface||"chat.completions",tempContext={modelEntryName:"",agentId:"",teamId:"",isUserKey:!1,modelInfo,credentials:null},deps={getClient:context=>this.getClient(context),reportUsage:(usage,metadata)=>this.reportUsage(usage,metadata)};tools=this.interfaceFactory.createInterface(interfaceType,tempContext,deps).transformToolsConfig({type,toolDefinitions,toolChoice,modelInfo})}return tools?.length>0?{tools,tool_choice:toolChoice||"auto"}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls)toolCall.function.arguments=typeof toolCall.function.arguments=="object"?JSON.stringify(toolCall.function.arguments):toolCall.function.arguments;messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}async validateTokenLimit({acRequest,maxTokens,promptTokens,context}){await(await this.getProvider(acRequest,context.modelEntryName)).validateTokensLimit({model:context.modelInfo,promptTokens,completionTokens:maxTokens,hasAPIKey:context.isUserKey})}async getProvider(acRequest,modelEntryName){return ConnectorService.getModelsProviderConnector().requester(acRequest.candidate)}async prepareImageGenerationBody(params){const{model,size,quality,n,responseFormat,style}=params,body={prompt:params.prompt,model,size,n:n||1};return quality&&(body.quality=quality),style&&(body.style=style),body}async prepareImageEditBody(params){const{model,size,n,responseFormat}=params,body={prompt:params.prompt,model,size,n:n||1,image:null},files=params?.files||[];if(files.length>0){const images=await Promise.all(files.map(async file=>await toFile(await file.getReadStream(),await file.getName(),{type:file.mimetype})));body.image=images[0]}return body}async reqBodyAdapter(params){if(params.capabilities?.imageGeneration===!0){const capabilityType=params?.files?.length>0?"image-edit":"image-generation";return this.prepareRequestBody(params,capabilityType)}const minimalContext={modelInfo:params.modelInfo,toolsInfo:params.toolsInfo},responseInterface=this.getInterfaceType(minimalContext);return this.prepareRequestBody(params,responseInterface)}async prepareRequestBody(params,preparationType){const minimalContext={modelInfo:params.modelInfo,modelEntryName:params.modelEntryName,agentId:params.agentId,teamId:params.teamId,isUserKey:params.isUserKey,credentials:params.credentials,hasFiles:params.files&&params.files.length>0,toolsInfo:params.toolsInfo},preparer={"chat.completions":async()=>this.getApiInterface("chat.completions",minimalContext).prepareRequestBody(params),responses:async()=>this.getApiInterface("responses",minimalContext).prepareRequestBody(params),"image-generation":()=>this.prepareImageGenerationBody(params),"image-edit":()=>this.prepareImageEditBody(params)}[preparationType];if(!preparer)throw new Error(`Unsupported preparation type: ${preparationType}`);return preparer()}reportUsage(usage,metadata){const modelName=metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,""),inputTokens=usage?.input_tokens||usage?.prompt_tokens-(usage?.prompt_tokens_details?.cached_tokens||0),outputTokens=usage?.output_tokens||usage?.completion_tokens||0,cachedInputTokens=usage?.input_tokens_details?.cached_tokens||usage?.prompt_tokens_details?.cached_tokens||0,usageData={sourceId:`llm:${modelName}`,input_tokens:inputTokens,output_tokens:outputTokens,input_tokens_cache_write:0,input_tokens_cache_read:cachedInputTokens,cost:usage?.cost||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}}var __defProp$G=Object.defineProperty,__defNormalProp$G=(obj,key,value)=>key in obj?__defProp$G(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$G=(obj,key,value)=>__defNormalProp$G(obj,typeof key!="symbol"?key+"":key,value);const MODELS_SUPPORT_SYSTEM_INSTRUCTION=["gemini-1.5-pro-exp-0801","gemini-1.5-pro-latest","gemini-1.5-pro-latest","gemini-1.5-pro","gemini-1.5-pro-001","gemini-1.5-flash-latest","gemini-1.5-flash-001","gemini-1.5-flash"],MODELS_SUPPORT_JSON_RESPONSE=MODELS_SUPPORT_SYSTEM_INSTRUCTION,VALID_MIME_TYPES=[...SUPPORTED_MIME_TYPES_MAP.GoogleAI.image,...SUPPORTED_MIME_TYPES_MAP.GoogleAI.audio,...SUPPORTED_MIME_TYPES_MAP.GoogleAI.video,...SUPPORTED_MIME_TYPES_MAP.GoogleAI.document];class GoogleAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$G(this,"name","LLM:GoogleAI"),__publicField$G(this,"validMimeTypes",{all:VALID_MIME_TYPES,image:SUPPORTED_MIME_TYPES_MAP.GoogleAI.image})}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Google AI");return new GoogleGenerativeAI(apiKey)}async request({acRequest,body,context}){try{const prompt=body.messages;delete body.messages;const response=await(await(await this.getClient(context)).getGenerativeModel(body).generateContent(prompt)).response,content=response.text(),finishReason=response.candidates[0].finishReason||"stop",usage=response?.usageMetadata;this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId});const toolCalls=response.candidates[0]?.content?.parts?.filter(part=>part.functionCall);let toolsData=[],useTool=!1;return toolCalls&&toolCalls.length>0&&(toolsData=toolCalls.map((toolCall,index)=>({index,id:`tool-${index}`,type:"function",name:toolCall.functionCall.name,arguments:JSON.stringify(toolCall.functionCall.args),role:TLLMMessageRole.Assistant})),useTool=!0),{content,finishReason:finishReason.toLowerCase(),useTool,toolsData,message:{content,role:"assistant"},usage}}catch(error){throw error}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1,prompt=body.messages;delete body.messages;const $model=(await this.getClient(context)).getGenerativeModel(body);try{const result=await $model.generateContentStream(prompt);let toolsData=[],usage;return(async()=>{for await(const chunk of result.stream){const chunkText2=chunk.text();if(emitter.emit("content",chunkText2),chunk.candidates[0]?.content?.parts){const toolCalls=chunk.candidates[0].content.parts.filter(part=>part.functionCall);toolCalls.length>0&&(toolsData=toolCalls.map((toolCall,index)=>({index,id:`tool-${index}`,type:"function",name:toolCall.functionCall.name,arguments:JSON.stringify(toolCall.functionCall.args),role:TLLMMessageRole.Assistant})),emitter.emit(TLLMEvent.ToolInfo,toolsData))}chunk?.usageMetadata&&(usage=chunk.usageMetadata)}usage&&this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}),setTimeout(()=>{emitter.emit("end",toolsData)},100)})(),emitter}catch(error){throw error}}async imageGenRequest({body,context}){try{const apiKey=context.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Google AI");const model=body.model||"imagen-3.0-generate-001",ai=new GoogleGenAI({apiKey}),config2={numberOfImages:body.n||1,aspectRatio:body.aspect_ratio||body.size||"1:1",personGeneration:body.person_generation||"allow_adult"},response=await ai.models.generateImages({model,prompt:body.prompt,config:config2});return{created:Math.floor(Date.now()/1e3),data:response.generatedImages?.map(generatedImage=>({url:generatedImage.image.imageBytes?`data:image/png;base64,${generatedImage.image.imageBytes}`:void 0,b64_json:generatedImage.image.imageBytes,revised_prompt:body.prompt}))||[]}}catch(error){throw error}}async imageEditRequest({body,context}){throw new Error("Image editing is not supported for Google AI. Imagen models only support image generation.")}async reqBodyAdapter(params){const model=params?.model;if(params?.capabilities?.imageGeneration)return this.prepareBodyForImageGenRequest(params);const messages=await this.prepareMessages(params);let body={model,messages};const responseFormat=params?.responseFormat||"";let responseMimeType="",systemInstruction="";responseFormat==="json"&&(systemInstruction+=JSON_RESPONSE_INSTRUCTION,MODELS_SUPPORT_JSON_RESPONSE.includes(model)&&(responseMimeType="application/json"));const config2={};return params.maxTokens!==void 0&&(config2.maxOutputTokens=params.maxTokens),params.temperature!==void 0&&(config2.temperature=params.temperature),params.topP!==void 0&&(config2.topP=params.topP),params.topK!==void 0&&(config2.topK=params.topK),params.stopSequences?.length&&(config2.stopSequences=params.stopSequences),responseMimeType&&(config2.responseMimeType=responseMimeType),systemInstruction&&(body.systemInstruction=systemInstruction),Object.keys(config2).length>0&&(body.generationConfig=config2),body}reportUsage(usage,metadata){const modelEntryName=metadata.modelEntryName;let tier="";const tierThresholds={"gemini-1.5-pro":128e3,"gemini-2.5-pro":2e5},textInputTokens=usage?.promptTokensDetails?.find(detail=>detail.modality==="TEXT")?.tokenCount||usage?.promptTokenCount||0,audioInputTokens=usage?.promptTokensDetails?.find(detail=>detail.modality==="AUDIO")?.tokenCount||0,modelWithTier=Object.keys(tierThresholds).find(model=>modelEntryName.includes(model));modelWithTier&&(tier=textInputTokens<tierThresholds[modelWithTier]?"tier1":"tier2");const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:textInputTokens,output_tokens:usage.candidatesTokenCount,input_tokens_audio:audioInputTokens,input_tokens_cache_read:usage.cachedContentTokenCount||0,input_tokens_cache_write:0,reasoning_tokens:usage.thoughtsTokenCount,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId,tier};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({toolDefinitions,toolChoice="auto"}){return{tools:toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool,validName=this.sanitizeFunctionName(name),validProperties=properties&&Object.keys(properties).length>0?properties:{dummy:{type:"string"}};return{functionDeclarations:[{name:validName,description:description||"",parameters:{type:"OBJECT",properties:validProperties,required:requiredFields||[]}}]}}),toolChoice:{type:toolChoice}}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const content=[];if(typeof messageBlock.content=="string"?content.push({text:messageBlock.content}):Array.isArray(messageBlock.content)&&content.push(...messageBlock.content),messageBlock.parts){const functionCalls=messageBlock.parts.filter(part=>part.functionCall);functionCalls.length>0&&content.push(...functionCalls.map(call=>({functionCall:{name:call.functionCall.name,args:JSON.parse(call.functionCall.args)}})))}messageBlocks.push({role:messageBlock.role,parts:content})}const transformedToolsData=toolsData.map(toolData=>({role:TLLMMessageRole.User,parts:[{functionResponse:{name:toolData.name,response:{name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}}}]}));return[...messageBlocks,...transformedToolsData]}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";switch(_message.role){case TLLMMessageRole.Assistant:case TLLMMessageRole.System:_message.role=TLLMMessageRole.Model;break;case TLLMMessageRole.User:break;default:_message.role=TLLMMessageRole.User}return _message?.parts?textContent=_message.parts.map(textBlock=>textBlock?.text||"...").join(" "):Array.isArray(_message?.content)?textContent=_message.content.map(textBlock=>textBlock?.text||"...").join(" "):_message?.content&&(textContent=_message.content||"..."),_message.parts=[{text:textContent||"..."}],delete _message.content,_message})}async prepareMessages(params){let messages=params?.messages||"";return(params?.files||[]).length>0?messages=await this.prepareMessagesWithFiles(params):params?.toolsConfig?.tools?.length>0?messages=await this.prepareMessagesWithTools(params):messages=await this.prepareMessagesWithTextQuery(params),messages}async prepareMessagesWithFiles(params){const model=params.model;let messages=params?.messages||"",systemInstruction="";const files=params?.files||[],promises=[],_files=[];for(let image of files){const binaryInput=BinaryInput.from(image);promises.push(binaryInput.upload(AccessCandidate.agent(params.agentId))),_files.push(binaryInput)}await Promise.all(promises);const validFiles=this.getValidFiles(_files,"all");if(validFiles.some(file=>file?.mimetype?.includes("video"))&&validFiles.length>1)throw new Error("Only one video file is supported at a time.");const fileUploadingTasks=validFiles.map(file=>async()=>{try{return{url:(await this.uploadFile({file,apiKey:params.credentials.apiKey,agentId:params.agentId})).url,mimetype:file.mimetype}}catch{return null}}),uploadedFiles=await processWithConcurrencyLimit(fileUploadingTasks);if(uploadedFiles&&uploadedFiles?.length===0)throw new Error("There is an issue during upload file in Google AI Server!");const fileData=this.getFileData(uploadedFiles);let prompt=(Array.isArray(messages)?messages.pop():{role:TLLMMessageRole.User,content:""})?.content||"";return MODELS_SUPPORT_SYSTEM_INSTRUCTION.includes(model)||(prompt=`${prompt}
194
+ `+existingContent}}else convertedMessages.unshift({role:TLLMMessageRole.User,content:systemContent})}return convertedMessages}async prepareMessages(params){const messages=params?.messages||[],files=params?.files||[];return files.length>0?await this.handleFileAttachments(files,params.agentId,[...messages]):messages}}class OpenAIApiInterfaceFactory{constructor(){}createInterface(interfaceType,context,deps){if(!context||!deps)throw new Error("Context and dependencies (getClient(), reportUsage()) are required to create an interface");switch(interfaceType){case"responses":return new ResponsesApiInterface(context,deps);case"chat.completions":return new ChatCompletionsApiInterface(context,deps);default:throw new Error(`Unsupported OpenAI API interface type: ${interfaceType}. Supported types: ${this.getSupportedInterfaces().join(", ")}`)}}getSupportedInterfaces(){return["responses","chat.completions"]}isInterfaceSupported(interfaceType){return this.getSupportedInterfaces().includes(interfaceType)}getDefaultInterfaceType(){return"chat.completions"}getInterfaceTypeFromModelInfo(modelInfo){return modelInfo?.interface||this.getDefaultInterfaceType()}}var __defProp$H=Object.defineProperty,__defNormalProp$H=(obj,key,value)=>key in obj?__defProp$H(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$H=(obj,key,value)=>__defNormalProp$H(obj,typeof key!="symbol"?key+"":key,value);class OpenAIConnector extends LLMConnector{constructor(){super(),__publicField$H(this,"name","LLM:OpenAI"),__publicField$H(this,"interfaceFactory"),this.interfaceFactory=new OpenAIApiInterfaceFactory}getApiInterface(interfaceType,context){const deps={getClient:context2=>this.getClient(context2),reportUsage:(usage,metadata)=>this.reportUsage(usage,metadata)};return this.interfaceFactory.createInterface(interfaceType,context,deps)}getInterfaceType(context){let responseInterface=this.interfaceFactory.getInterfaceTypeFromModelInfo(context.modelInfo);return context.toolsInfo?.openai?.webSearch?.enabled===!0&&(responseInterface="responses"),responseInterface}async getClient(params){const apiKey=params.credentials?.apiKey,baseURL=params?.modelInfo?.baseURL;if(!apiKey)throw new Error("Please provide an API key for OpenAI");return new OpenAI({baseURL,apiKey})}async request({acRequest,body,context}){const _body=body,messages=_body?.messages||[];messages[messages.length-1];const promptTokens=await this.computePromptTokens(messages,context);await this.validateTokenLimit({acRequest,promptTokens,context,maxTokens:_body.max_completion_tokens});const responseInterface=this.getInterfaceType(context),result=await this.getApiInterface(responseInterface,context).createRequest(body,context),message=result?.choices?.[0]?.message,finishReason=result?.choices?.[0]?.finish_reason;let toolsData=[],useTool=!1;finishReason==="tool_calls"&&(toolsData=message?.tool_calls?.map((tool,index)=>({index,id:tool?.id,type:tool?.type,name:tool?.function?.name,arguments:tool?.function?.arguments,role:"tool"}))||[],useTool=!0);const usage=result?.usage;return this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}),{content:message?.content??"",finishReason,useTool,toolsData,message,usage}}async streamRequest({acRequest,body,context}){const messages=body?.messages||body?.input||[];messages[messages.length-1];const promptTokens=await this.computePromptTokens(messages,context);await this.validateTokenLimit({acRequest,promptTokens,context,maxTokens:body.max_completion_tokens});const responseInterface=this.getInterfaceType(context),apiInterface=this.getApiInterface(responseInterface,context),stream=await apiInterface.createStream(body,context);return apiInterface.handleStream(stream,context)}async imageGenRequest({acRequest,body,context}){return await(await this.getClient(context)).images.generate(body)}async imageEditRequest({acRequest,body,context}){const _body=body;return await(await this.getClient(context)).images.edit(_body)}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto",modelInfo=null}){let tools=[];if(toolDefinitions&&toolDefinitions.length>0){const interfaceType=modelInfo?.interface||"chat.completions",tempContext={modelEntryName:"",agentId:"",teamId:"",isUserKey:!1,modelInfo,credentials:null},deps={getClient:context=>this.getClient(context),reportUsage:(usage,metadata)=>this.reportUsage(usage,metadata)};tools=this.interfaceFactory.createInterface(interfaceType,tempContext,deps).transformToolsConfig({type,toolDefinitions,toolChoice,modelInfo})}return tools?.length>0?{tools,tool_choice:toolChoice||"auto"}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls)toolCall.function.arguments=typeof toolCall.function.arguments=="object"?JSON.stringify(toolCall.function.arguments):toolCall.function.arguments;messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}async validateTokenLimit({acRequest,maxTokens,promptTokens,context}){await(await this.getProvider(acRequest,context.modelEntryName)).validateTokensLimit({model:context.modelInfo,promptTokens,completionTokens:maxTokens,hasAPIKey:context.isUserKey})}async getProvider(acRequest,modelEntryName){return ConnectorService.getModelsProviderConnector().requester(acRequest.candidate)}async computePromptTokens(messages,context){try{if(context?.hasFiles){const lastContent=(messages?.[messages?.length-1]||{})?.content??"";return await LLMHelper.countVisionPromptTokens(lastContent||"")}const normalized=(messages||[]).map(m=>{if(!m||!m.role)return null;let content="";if(Array.isArray(m.content))content=m.content.map(b=>typeof b?.text=="string"?b.text:"").join(" ");else if(typeof m.content=="string")content=m.content;else if(m.content!==void 0&&m.content!==null)try{content=JSON.stringify(m.content)}catch{content=""}return{role:m.role,content}}).filter(Boolean);return encodeChat(normalized,"gpt-4")?.length||0}catch{return 0}}async prepareImageGenerationBody(params){const{model,size,quality,n,responseFormat,style}=params,body={prompt:params.prompt,model,size,n:n||1};return quality&&(body.quality=quality),style&&(body.style=style),body}async prepareImageEditBody(params){const{model,size,n,responseFormat}=params,body={prompt:params.prompt,model,size,n:n||1,image:null},files=params?.files||[];if(files.length>0){const images=await Promise.all(files.map(async file=>await toFile(await file.getReadStream(),await file.getName(),{type:file.mimetype})));body.image=images[0]}return body}async reqBodyAdapter(params){if(params.capabilities?.imageGeneration===!0){const capabilityType=params?.files?.length>0?"image-edit":"image-generation";return this.prepareRequestBody(params,capabilityType)}const minimalContext={modelInfo:params.modelInfo,toolsInfo:params.toolsInfo},responseInterface=this.getInterfaceType(minimalContext);return this.prepareRequestBody(params,responseInterface)}async prepareRequestBody(params,preparationType){const minimalContext={modelInfo:params.modelInfo,modelEntryName:params.modelEntryName,agentId:params.agentId,teamId:params.teamId,isUserKey:params.isUserKey,credentials:params.credentials,hasFiles:params.files&&params.files.length>0,toolsInfo:params.toolsInfo},preparer={"chat.completions":async()=>this.getApiInterface("chat.completions",minimalContext).prepareRequestBody(params),responses:async()=>this.getApiInterface("responses",minimalContext).prepareRequestBody(params),"image-generation":()=>this.prepareImageGenerationBody(params),"image-edit":()=>this.prepareImageEditBody(params)}[preparationType];if(!preparer)throw new Error(`Unsupported preparation type: ${preparationType}`);return preparer()}reportUsage(usage,metadata){const modelName=metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,""),inputTokens=usage?.input_tokens||usage?.prompt_tokens-(usage?.prompt_tokens_details?.cached_tokens||0),outputTokens=usage?.output_tokens||usage?.completion_tokens||0,cachedInputTokens=usage?.input_tokens_details?.cached_tokens||usage?.prompt_tokens_details?.cached_tokens||0,usageData={sourceId:`llm:${modelName}`,input_tokens:inputTokens,output_tokens:outputTokens,input_tokens_cache_write:0,input_tokens_cache_read:cachedInputTokens,cost:usage?.cost||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}}var __defProp$G=Object.defineProperty,__defNormalProp$G=(obj,key,value)=>key in obj?__defProp$G(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$G=(obj,key,value)=>__defNormalProp$G(obj,typeof key!="symbol"?key+"":key,value);const MODELS_SUPPORT_SYSTEM_INSTRUCTION=["gemini-1.5-pro-exp-0801","gemini-1.5-pro-latest","gemini-1.5-pro-latest","gemini-1.5-pro","gemini-1.5-pro-001","gemini-1.5-flash-latest","gemini-1.5-flash-001","gemini-1.5-flash"],MODELS_SUPPORT_JSON_RESPONSE=MODELS_SUPPORT_SYSTEM_INSTRUCTION,VALID_MIME_TYPES=[...SUPPORTED_MIME_TYPES_MAP.GoogleAI.image,...SUPPORTED_MIME_TYPES_MAP.GoogleAI.audio,...SUPPORTED_MIME_TYPES_MAP.GoogleAI.video,...SUPPORTED_MIME_TYPES_MAP.GoogleAI.document];class GoogleAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$G(this,"name","LLM:GoogleAI"),__publicField$G(this,"validMimeTypes",{all:VALID_MIME_TYPES,image:SUPPORTED_MIME_TYPES_MAP.GoogleAI.image})}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Google AI");return new GoogleGenerativeAI(apiKey)}async request({acRequest,body,context}){try{const prompt=body.messages;delete body.messages;const response=await(await(await this.getClient(context)).getGenerativeModel(body).generateContent(prompt)).response,content=response.text(),finishReason=response.candidates[0].finishReason||"stop",usage=response?.usageMetadata;this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId});const toolCalls=response.candidates[0]?.content?.parts?.filter(part=>part.functionCall);let toolsData=[],useTool=!1;return toolCalls&&toolCalls.length>0&&(toolsData=toolCalls.map((toolCall,index)=>({index,id:`tool-${index}`,type:"function",name:toolCall.functionCall.name,arguments:JSON.stringify(toolCall.functionCall.args),role:TLLMMessageRole.Assistant})),useTool=!0),{content,finishReason:finishReason.toLowerCase(),useTool,toolsData,message:{content,role:"assistant"},usage}}catch(error){throw error}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1,prompt=body.messages;delete body.messages;const $model=(await this.getClient(context)).getGenerativeModel(body);try{const result=await $model.generateContentStream(prompt);let toolsData=[],usage;return(async()=>{for await(const chunk of result.stream){const chunkText2=chunk.text();if(emitter.emit("content",chunkText2),chunk.candidates[0]?.content?.parts){const toolCalls=chunk.candidates[0].content.parts.filter(part=>part.functionCall);toolCalls.length>0&&(toolsData=toolCalls.map((toolCall,index)=>({index,id:`tool-${index}`,type:"function",name:toolCall.functionCall.name,arguments:JSON.stringify(toolCall.functionCall.args),role:TLLMMessageRole.Assistant})),emitter.emit(TLLMEvent.ToolInfo,toolsData))}chunk?.usageMetadata&&(usage=chunk.usageMetadata)}usage&&this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}),setTimeout(()=>{emitter.emit("end",toolsData)},100)})(),emitter}catch(error){throw error}}async imageGenRequest({body,context}){try{const apiKey=context.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Google AI");const model=body.model||"imagen-3.0-generate-001",ai=new GoogleGenAI({apiKey}),config2={numberOfImages:body.n||1,aspectRatio:body.aspect_ratio||body.size||"1:1",personGeneration:body.person_generation||"allow_adult"},response=await ai.models.generateImages({model,prompt:body.prompt,config:config2});return{created:Math.floor(Date.now()/1e3),data:response.generatedImages?.map(generatedImage=>({url:generatedImage.image.imageBytes?`data:image/png;base64,${generatedImage.image.imageBytes}`:void 0,b64_json:generatedImage.image.imageBytes,revised_prompt:body.prompt}))||[]}}catch(error){throw error}}async imageEditRequest({body,context}){throw new Error("Image editing is not supported for Google AI. Imagen models only support image generation.")}async reqBodyAdapter(params){const model=params?.model;if(params?.capabilities?.imageGeneration)return this.prepareBodyForImageGenRequest(params);const messages=await this.prepareMessages(params);let body={model,messages};const responseFormat=params?.responseFormat||"";let responseMimeType="",systemInstruction="";responseFormat==="json"&&(systemInstruction+=JSON_RESPONSE_INSTRUCTION,MODELS_SUPPORT_JSON_RESPONSE.includes(model)&&(responseMimeType="application/json"));const config2={};return params.maxTokens!==void 0&&(config2.maxOutputTokens=params.maxTokens),params.temperature!==void 0&&(config2.temperature=params.temperature),params.topP!==void 0&&(config2.topP=params.topP),params.topK!==void 0&&(config2.topK=params.topK),params.stopSequences?.length&&(config2.stopSequences=params.stopSequences),responseMimeType&&(config2.responseMimeType=responseMimeType),systemInstruction&&(body.systemInstruction=systemInstruction),Object.keys(config2).length>0&&(body.generationConfig=config2),body}reportUsage(usage,metadata){const modelEntryName=metadata.modelEntryName;let tier="";const tierThresholds={"gemini-1.5-pro":128e3,"gemini-2.5-pro":2e5},textInputTokens=usage?.promptTokensDetails?.find(detail=>detail.modality==="TEXT")?.tokenCount||usage?.promptTokenCount||0,audioInputTokens=usage?.promptTokensDetails?.find(detail=>detail.modality==="AUDIO")?.tokenCount||0,modelWithTier=Object.keys(tierThresholds).find(model=>modelEntryName.includes(model));modelWithTier&&(tier=textInputTokens<tierThresholds[modelWithTier]?"tier1":"tier2");const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:textInputTokens,output_tokens:usage.candidatesTokenCount,input_tokens_audio:audioInputTokens,input_tokens_cache_read:usage.cachedContentTokenCount||0,input_tokens_cache_write:0,reasoning_tokens:usage.thoughtsTokenCount,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId,tier};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({toolDefinitions,toolChoice="auto"}){return{tools:toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool,validName=this.sanitizeFunctionName(name),validProperties=properties&&Object.keys(properties).length>0?properties:{dummy:{type:"string"}};return{functionDeclarations:[{name:validName,description:description||"",parameters:{type:"OBJECT",properties:validProperties,required:requiredFields||[]}}]}}),toolChoice:{type:toolChoice}}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const content=[];if(typeof messageBlock.content=="string"?content.push({text:messageBlock.content}):Array.isArray(messageBlock.content)&&content.push(...messageBlock.content),messageBlock.parts){const functionCalls=messageBlock.parts.filter(part=>part.functionCall);functionCalls.length>0&&content.push(...functionCalls.map(call=>({functionCall:{name:call.functionCall.name,args:JSON.parse(call.functionCall.args)}})))}messageBlocks.push({role:messageBlock.role,parts:content})}const transformedToolsData=toolsData.map(toolData=>({role:TLLMMessageRole.User,parts:[{functionResponse:{name:toolData.name,response:{name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}}}]}));return[...messageBlocks,...transformedToolsData]}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";switch(_message.role){case TLLMMessageRole.Assistant:case TLLMMessageRole.System:_message.role=TLLMMessageRole.Model;break;case TLLMMessageRole.User:break;default:_message.role=TLLMMessageRole.User}return _message?.parts?textContent=_message.parts.map(textBlock=>textBlock?.text||"...").join(" "):Array.isArray(_message?.content)?textContent=_message.content.map(textBlock=>textBlock?.text||"...").join(" "):_message?.content&&(textContent=_message.content||"..."),_message.parts=[{text:textContent||"..."}],delete _message.content,_message})}async prepareMessages(params){let messages=params?.messages||"";return(params?.files||[]).length>0?messages=await this.prepareMessagesWithFiles(params):params?.toolsConfig?.tools?.length>0?messages=await this.prepareMessagesWithTools(params):messages=await this.prepareMessagesWithTextQuery(params),messages}async prepareMessagesWithFiles(params){const model=params.model;let messages=params?.messages||"",systemInstruction="";const files=params?.files||[],promises=[],_files=[];for(let image of files){const binaryInput=BinaryInput.from(image);promises.push(binaryInput.upload(AccessCandidate.agent(params.agentId))),_files.push(binaryInput)}await Promise.all(promises);const validFiles=this.getValidFiles(_files,"all");if(validFiles.some(file=>file?.mimetype?.includes("video"))&&validFiles.length>1)throw new Error("Only one video file is supported at a time.");const fileUploadingTasks=validFiles.map(file=>async()=>{try{return{url:(await this.uploadFile({file,apiKey:params.credentials.apiKey,agentId:params.agentId})).url,mimetype:file.mimetype}}catch{return null}}),uploadedFiles=await processWithConcurrencyLimit(fileUploadingTasks);if(uploadedFiles&&uploadedFiles?.length===0)throw new Error("There is an issue during upload file in Google AI Server!");const fileData=this.getFileData(uploadedFiles);let prompt=(Array.isArray(messages)?messages.pop():{role:TLLMMessageRole.User,content:""})?.content||"";return MODELS_SUPPORT_SYSTEM_INSTRUCTION.includes(model)||(prompt=`${prompt}
195
195
  ${systemInstruction}`),messages=fileData.length===1?[...fileData,{text:prompt}]:[prompt,...fileData],messages}async prepareMessagesWithTools(params){let formattedMessages,systemInstruction="",messages=params?.messages||[];if(LLMHelper.hasSystemMessage(messages)){const separateMessages=LLMHelper.separateSystemMessages(messages),systemMessageContent=separateMessages.systemMessage?.content;systemInstruction=typeof systemMessageContent=="string"?systemMessageContent:"",formattedMessages=separateMessages.otherMessages}else formattedMessages=messages;const toolsPrompt={contents:formattedMessages};if(systemInstruction&&(toolsPrompt.systemInstruction=systemInstruction),params?.toolsConfig?.tools&&(toolsPrompt.tools=params?.toolsConfig?.tools),params?.toolsConfig?.tool_choice){let mode=FunctionCallingMode.AUTO;const toolChoice=params?.toolsConfig?.tool_choice;toolChoice==="auto"?mode=FunctionCallingMode.AUTO:toolChoice==="required"?mode=FunctionCallingMode.ANY:toolChoice==="none"?mode=FunctionCallingMode.NONE:typeof toolChoice=="object"&&toolChoice.type==="function"&&(mode=FunctionCallingMode.ANY),toolsPrompt.toolConfig={functionCallingConfig:{mode}}}return toolsPrompt}async prepareMessagesWithTextQuery(params){const model=params.model;let systemInstruction="",prompt="";const{systemMessage,otherMessages}=LLMHelper.separateSystemMessages(params?.messages);return"content"in systemMessage&&(systemInstruction=systemMessage.content),(params?.responseFormat||"")==="json"&&(systemInstruction+=JSON_RESPONSE_INSTRUCTION,MODELS_SUPPORT_JSON_RESPONSE.includes(model)),otherMessages?.length>0&&(prompt+=otherMessages.map(message=>message?.parts?.[0]?.text||"").join(`
196
196
  `)),MODELS_SUPPORT_SYSTEM_INSTRUCTION.includes(model)||(prompt=`${prompt}
197
197
  ${systemInstruction}`),prompt}async prepareBodyForImageGenRequest(params){return{prompt:params.prompt,model:params.model,aspectRatio:params.aspectRatio,personGeneration:params.personGeneration}}sanitizeFunctionName(name){if(name==null)return"_unnamed_function";let sanitized=name.replace(/[^a-zA-Z0-9_.-]/g,"");return/^[a-zA-Z_]/.test(sanitized)||(sanitized="_"+sanitized),sanitized===""&&(sanitized="_unnamed_function"),sanitized=sanitized.slice(0,64),sanitized}async uploadFile({file,apiKey,agentId}){try{if(!apiKey||!file?.mimetype)throw new Error("Missing required parameters to save file for Google AI!");const tempDir=os.tmpdir(),fileName=uid(),tempFilePath=path.join(tempDir,fileName),bufferData=await file.readData(AccessCandidate.agent(agentId));await fs__default.promises.writeFile(tempFilePath,new Uint8Array(bufferData));const fileManager=new GoogleAIFileManager(apiKey),uploadResponse=await fileManager.uploadFile(tempFilePath,{mimeType:file.mimetype,displayName:fileName}),name=uploadResponse.file.name;let uploadedFile=await fileManager.getFile(name);for(;uploadedFile.state===FileState.PROCESSING;)process.stdout.write("."),await new Promise(resolve=>setTimeout(resolve,1e4)),uploadedFile=await fileManager.getFile(name);if(uploadedFile.state===FileState.FAILED)throw new Error("File processing failed.");return await fs__default.promises.unlink(tempFilePath),{url:uploadResponse.file.uri||""}}catch(error){throw new Error(`Error uploading file for Google AI: ${error.message}`)}}getValidFiles(files,type){const validSources=[];for(let file of files)this.validMimeTypes[type].includes(file?.mimetype)&&validSources.push(file);if(validSources?.length===0)throw new Error(`Unsupported file(s). Please make sure your file is one of the following types: ${this.validMimeTypes[type].join(", ")}`);return validSources}getFileData(files){try{const imageData=[];for(let file of files)imageData.push({fileData:{mimeType:file.mimetype,fileUri:file.url}});return imageData}catch(error){throw error}}}var __defProp$F=Object.defineProperty,__defNormalProp$F=(obj,key,value)=>key in obj?__defProp$F(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$F=(obj,key,value)=>__defNormalProp$F(obj,typeof key!="symbol"?key+"":key,value);const PREFILL_TEXT_FOR_JSON_RESPONSE="{",LEGACY_THINKING_MODELS=["smythos/claude-3.7-sonnet-thinking","claude-3.7-sonnet-thinking"];class AnthropicConnector extends LLMConnector{constructor(){super(...arguments),__publicField$F(this,"name","LLM:Anthropic"),__publicField$F(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.Anthropic.image)}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Anthropic");return new Anthropic({apiKey})}async request({acRequest,body,context}){try{const result=await(await this.getClient(context)).messages.create(body),message={role:result?.role||TLLMMessageRole.User,content:result?.content||""},stopReason=result?.stop_reason;let toolsData=[],useTool=!1;if(stopReason==="tool_use"){const toolUseContentBlocks=result?.content?.filter(c=>c.type==="tool_use");if(toolUseContentBlocks?.length===0)return;toolUseContentBlocks.forEach((toolUseBlock,index)=>{toolsData.push({index,id:toolUseBlock?.id,type:"function",name:toolUseBlock?.name,arguments:toolUseBlock?.input,role:result?.role})}),useTool=!0}let content=result?.content?.find(block=>block.type==="text")?.text||"";const usage=result?.usage;return this.hasPrefillText(body.messages)&&(content=`${PREFILL_TEXT_FOR_JSON_RESPONSE}${content}`),this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}),{content,finishReason:result?.stop_reason,useTool,toolsData,message,usage}}catch(error){throw error}}async streamRequest({acRequest,body,context}){try{const emitter=new EventEmitter$1,usage_data=[];let stream=(await this.getClient(context)).messages.stream(body),toolsData=[],thinkingBlocks=[];const needsPrefillInjection=this.hasPrefillText(body.messages);let prefillInjected=!1;return stream.on("streamEvent",event=>{event.message?.usage}),stream.on("error",error=>{emitter.emit("error",error)}),stream.on("text",text=>{needsPrefillInjection&&!prefillInjected&&(text=`${PREFILL_TEXT_FOR_JSON_RESPONSE}${text}`,prefillInjected=!0),emitter.emit("content",text)}),stream.on("thinking",thinking=>{emitter.emit("thinking",thinking)}),stream.on("finalMessage",finalMessage=>{let finishReason="stop";thinkingBlocks=finalMessage.content.filter(block=>block.type==="thinking"||block.type==="redacted_thinking");const toolUseContentBlocks=finalMessage.content.filter(c=>c.type==="tool_use");if(toolUseContentBlocks?.length>0?(toolUseContentBlocks.forEach((toolUseBlock,index)=>{toolsData.push({index,id:toolUseBlock?.id,type:"function",name:toolUseBlock?.name,arguments:toolUseBlock?.input,role:finalMessage?.role})}),emitter.emit(TLLMEvent.ToolInfo,toolsData,thinkingBlocks)):finishReason=finalMessage.stop_reason,finalMessage?.usage){const usage=finalMessage.usage,reportedUsage=this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId});usage_data.push(reportedUsage)}finishReason!=="stop"&&finishReason!=="end_turn"&&emitter.emit("interrupted",finishReason),setTimeout(()=>{emitter.emit("end",toolsData,usage_data,finishReason)},100)}),emitter}catch(error){throw error}}async reqBodyAdapter(params){const body=await this.prepareBody(params);return await this.shouldUseThinkingMode(params)?await this.prepareBodyForThinkingRequest({body,maxThinkingTokens:params.maxThinkingTokens,toolChoice:params?.toolsConfig?.tool_choice}):body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage.input_tokens,output_tokens:usage.output_tokens,input_tokens_cache_write:usage.cache_creation_input_tokens,input_tokens_cache_read:usage.cache_read_input_tokens,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{name,description,input_schema:{type:"object",properties,required:requiredFields}}})),tools?.length>0?{tools}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const content=[];if(messageBlock.thinkingBlocks?.length>0&&content.push(...messageBlock.thinkingBlocks),Array.isArray(messageBlock.content)?content.push(...messageBlock.content):messageBlock.content&&content.push({type:"text",text:messageBlock.content}),messageBlock.tool_calls){const calls=messageBlock.tool_calls.map(toolCall=>{const args=toolCall?.function?.arguments;return{type:"tool_use",id:toolCall.id,name:toolCall?.function?.name,input:typeof args=="string"?JSONContent(args||"{}").tryParse():args||{}}});content.push(...calls)}messageBlocks.push({role:messageBlock?.role,content})}const toolResultsContent=toolsData.map(toolData=>({type:"tool_result",tool_use_id:toolData.id,content:toolData.result}));return toolResultsContent.length>0&&messageBlocks.push({role:TLLMMessageRole.User,content:toolResultsContent}),messageBlocks}getConsistentMessages(messages){let _messages=JSON.parse(JSON.stringify(messages)),systemMessage=null;return _messages[0]?.role===TLLMMessageRole.System&&(systemMessage=_messages.shift()),_messages=LLMHelper.removeDuplicateUserMessages(_messages),_messages=_messages.map(message=>{let content;return message?.parts?content=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?Array.isArray(message.content)?message.content.filter(item=>typeof item=="object"&&"type"in item&&(item.type==="tool_use"||item.type==="tool_result"))?.length>0?content=message.content.map(item=>item.type==="text"&&(!item.text||item.text.trim()==="")?{...item,text:"..."}:item):content=message.content.map(block=>block?.text||"").join(" ").trim():content=message.content:message?.content&&(content=message.content),message.content=content||"...",message}),_messages[0]?.role===TLLMMessageRole.User&&Array.isArray(_messages[0].content)&&_messages[0].content.find(content=>"type"in content&&content.type==="tool_result")&&_messages.shift(),_messages[0]?.role!==TLLMMessageRole.User&&_messages.unshift({role:TLLMMessageRole.User,content:"continue"}),systemMessage&&systemMessage.content&&_messages.unshift(systemMessage),_messages}async prepareBody(params){let messages=await this.prepareMessages(params),body={model:params.model,messages,max_tokens:params.maxTokens};const{systemMessage,otherMessages}=LLMHelper.separateSystemMessages(messages);if("content"in systemMessage&&(body.system=systemMessage?.content),messages=otherMessages,(params?.responseFormat||"")==="json"&&(body.system=body.system?`${body.system} ${JSON_RESPONSE_INSTRUCTION}`:JSON_RESPONSE_INSTRUCTION,messages.push({role:TLLMMessageRole.Assistant,content:PREFILL_TEXT_FOR_JSON_RESPONSE})),LLMHelper.hasSystemMessage(messages)){const{systemMessage:systemMessage2,otherMessages:otherMessages2}=LLMHelper.separateSystemMessages(messages);"content"in systemMessage2&&(body.system=await this.prepareSystemPrompt(systemMessage2,params)),messages=otherMessages2}const isReasoningModel=params?.capabilities?.reasoning;params?.temperature!==void 0&&!isReasoningModel&&(body.temperature=params.temperature),params?.topP!==void 0&&!isReasoningModel&&(body.top_p=params.topP),params?.topK!==void 0&&!isReasoningModel&&(body.top_k=params.topK),params?.stopSequences?.length&&(body.stop_sequences=params.stopSequences),params?.toolsConfig?.tools&&params?.toolsConfig?.tools.length>0&&(body.tools=params?.toolsConfig?.tools,params?.cache&&(body.tools[body.tools.length-1].cache_control={type:"ephemeral"}));const toolChoice=params?.toolsConfig?.tool_choice;return toolChoice&&(body.tool_choice=toolChoice),body.messages=messages,body}async prepareBodyForThinkingRequest({body,maxThinkingTokens,toolChoice=null}){let messages=body.messages.filter(message=>!(message?.role===TLLMMessageRole.Assistant&&message?.content===PREFILL_TEXT_FOR_JSON_RESPONSE)),budget_tokens=Math.min(maxThinkingTokens,body.max_tokens);budget_tokens===body.max_tokens&&(budget_tokens=Math.floor(budget_tokens*.8));const thinkingBody={model:body.model,messages,max_tokens:body.max_tokens,thinking:{type:"enabled",budget_tokens}};return toolChoice&&(["any","tool"].includes(toolChoice.type)?thinkingBody.tool_choice={type:"auto"}:thinkingBody.tool_choice=toolChoice),thinkingBody}async prepareMessages(params){const messages=params?.messages||[],files=params?.files||[];if(files?.length>0){const promises=[],_files=[];for(let image of files){const binaryInput=BinaryInput.from(image);promises.push(binaryInput.upload(AccessCandidate.agent(params.agentId))),_files.push(binaryInput)}await Promise.all(promises);const validSources=this.getValidImageFiles(_files),imageData=await this.getImageData(validSources,params.agentId),content=[{type:"text",text:(Array.isArray(messages)?messages.pop():{})?.content||""},...imageData];messages.push({role:TLLMMessageRole.User,content})}return messages}async prepareSystemPrompt(systemMessage,params){let systemPrompt=systemMessage?.content;return typeof systemPrompt=="string"&&(systemPrompt=[{type:"text",text:systemPrompt}]),systemPrompt.unshift({type:"text",text:'If you need to call a function, Do NOT inform the user that you are about to do so, and do not thank the user after you get the response. Just say something like "Give me a moment...", then when you get the response, Just continue answering the user without saying anything about the function you just called'}),params?.cache&&(systemPrompt[systemPrompt.length-1].cache_control={type:"ephemeral"}),systemPrompt}async shouldUseThinkingMode(params){return LEGACY_THINKING_MODELS.includes(params.modelEntryName)?!0:params?.useReasoning&&params.capabilities?.reasoning===!0}getValidImageFiles(files){const validSources=[];for(let file of files)this.validImageMimeTypes.includes(file?.mimetype)&&validSources.push(file);if(validSources?.length===0)throw new Error(`Unsupported file(s). Please make sure your file is one of the following types: ${this.validImageMimeTypes.join(", ")}`);return validSources}async getImageData(files,agentId){try{const imageData=[];for(let file of files){const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64");imageData.push({type:"image",source:{type:"base64",data:base64Data,media_type:file.mimetype}})}return imageData}catch(error){throw error}}hasPrefillText(messages){for(let i=messages.length-1;i>=0;i--){const message=messages[i];if(message?.role===TLLMMessageRole.Assistant&&message?.content===PREFILL_TEXT_FOR_JSON_RESPONSE)return!0}return!1}}var __defProp$E=Object.defineProperty,__defNormalProp$E=(obj,key,value)=>key in obj?__defProp$E(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$E=(obj,key,value)=>__defNormalProp$E(obj,key+"",value);const MODELS_WITHOUT_REASONING_EFFORT_SUPPORT=["deepseek-r1-distill-llama-70b"];class GroqConnector extends LLMConnector{constructor(){super(...arguments),__publicField$E(this,"name","LLM:Groq")}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Groq");return new Groq({apiKey})}async request({acRequest,body,context}){const result=await(await this.getClient(context)).chat.completions.create(body),message=result?.choices?.[0]?.message,finishReason=result?.choices?.[0]?.finish_reason,toolCalls=message?.tool_calls,usage=result.usage;this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId});let toolsData=[],useTool=!1;return toolCalls&&(toolsData=toolCalls.map((tool,index)=>({index,id:tool.id,type:tool.type,name:tool.function.name,arguments:tool.function.arguments,role:TLLMMessageRole.Assistant})),useTool=!0),{content:message?.content??"",finishReason,useTool,toolsData,message,usage}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1,usage_data=[],stream=await(await this.getClient(context)).chat.completions.create({...body,stream:!0,stream_options:{include_usage:!0}});let toolsData=[];return(async()=>{for await(const chunk of stream){const delta=chunk.choices[0]?.delta,usage=chunk.x_groq?.usage||chunk.usage;usage&&usage_data.push(usage),emitter.emit("data",delta),delta?.content&&emitter.emit("content",delta.content),delta?.tool_calls&&delta.tool_calls.forEach((toolCall,index)=>{toolsData[index]?toolsData[index].arguments+=toolCall.function?.arguments||"":toolsData[index]={index,id:toolCall.id,type:toolCall.type,name:toolCall.function?.name,arguments:toolCall.function?.arguments,role:"assistant"}})}toolsData.length>0&&emitter.emit(TLLMEvent.ToolInfo,toolsData),usage_data.forEach(usage=>{this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId})}),setTimeout(()=>{emitter.emit("end",toolsData)},100)})(),emitter}async reqBodyAdapter(params){const messages=params?.messages||[],body={model:params.model,messages};(params?.responseFormat||"")==="json"&&(messages?.[0]?.role==="system"?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:"system",content:JSON_RESPONSE_INSTRUCTION}));const allowReasoning=params.useReasoning&&params.capabilities?.reasoning;return params.maxTokens!==void 0&&(allowReasoning?body.max_completion_tokens=params.maxTokens:body.max_tokens=params.maxTokens),params.temperature!==void 0&&(body.temperature=params.temperature),params.topP!==void 0&&(body.top_p=params.topP),params.stopSequences?.length&&(body.stop=params.stopSequences),params.toolsConfig?.tools&&(body.tools=params.toolsConfig?.tools),params.toolsConfig?.tool_choice&&(body.tool_choice=params.toolsConfig?.tool_choice),allowReasoning&&isValidGroqReasoningEffort(params?.reasoningEffort)&&!MODELS_WITHOUT_REASONING_EFFORT_SUPPORT.includes(params?.modelEntryName)&&params.reasoningEffort!==void 0&&(body.reasoning_effort=params.reasoningEffort),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage?.prompt_tokens-(usage?.prompt_tokens_details?.cached_tokens||0),output_tokens:usage?.completion_tokens,input_tokens_cache_write:0,input_tokens_cache_read:usage?.prompt_tokens_details?.cached_tokens||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const transformedMessageBlock={...messageBlock,content:typeof messageBlock.content=="object"?JSON.stringify(messageBlock.content):messageBlock.content};if(transformedMessageBlock.tool_calls)for(let toolCall of transformedMessageBlock.tool_calls)toolCall.function.arguments=typeof toolCall.function.arguments=="object"?JSON.stringify(toolCall.function.arguments):toolCall.function.arguments;messageBlocks.push(transformedMessageBlock)}const transformedToolsData=toolsData.map(toolData=>({tool_call_id:toolData.id,role:TLLMMessageRole.Tool,name:toolData.name,content:typeof toolData.result=="string"?toolData.result:JSON.stringify(toolData.result)}));return[...messageBlocks,...transformedToolsData]}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{type:"function",function:{name,description,parameters:{type:"object",properties,required:requiredFields}}}})),tools?.length>0?{tools,tool_choice:toolChoice}:{}}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{const _message={...message};let textContent="";return message?.parts?textContent=message.parts.map(textBlock=>textBlock?.text||"").join(" "):Array.isArray(message?.content)?textContent=message.content.map(textBlock=>textBlock?.text||"").join(" "):message?.content&&(textContent=message.content),_message.content=textContent,_message})}}function isValidGroqReasoningEffort(value){return["none","default","low","medium","high"].includes(value)}var __defProp$D=Object.defineProperty,__defNormalProp$D=(obj,key,value)=>key in obj?__defProp$D(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$D=(obj,key,value)=>__defNormalProp$D(obj,key+"",value);class BedrockConnector extends LLMConnector{constructor(){super(...arguments),__publicField$D(this,"name","LLM:Bedrock")}async getClient(params){const credentials=params.credentials,region=params.modelInfo.settings.region;if(!(Object.keys(credentials).length>=2))throw new Error("Access key ID and secret access key are required for Bedrock");return new BedrockRuntimeClient({region,credentials})}async request({acRequest,body,context}){try{const bedrock=await this.getClient(context),command=new ConverseCommand(body),response=await bedrock.send(command),usage=response.usage;this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId});const message=response.output?.message,finishReason=response.stopReason;let toolsData=[],useTool=!1;return finishReason==="tool_use"&&(toolsData=(message?.content?.filter(block=>block?.toolUse)||[]).map((block,index)=>({index,id:block.toolUse?.toolUseId,type:"function",name:_deserializeToolName(block.toolUse?.name),arguments:block.toolUse?.input,role:"tool"})),useTool=!0),{content:Array.isArray(message?.content)?message?.content?.[0]?.text||"":message?.content||"",finishReason,useTool,toolsData,message,usage}}catch(error){throw error?.error||error}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1;try{const bedrock=await this.getClient(context),command=new ConverseStreamCommand(body),stream=(await bedrock.send(command)).stream;return stream&&(async()=>{let currentMessage={role:"",content:"",toolCalls:[],currentToolCall:null,currentToolInput:""};for await(const chunk of stream){if(chunk.messageStart&&(currentMessage.role=chunk.messageStart.role||"",emitter.emit("data",{role:currentMessage.role})),chunk.contentBlockDelta?.delta?.text&&(currentMessage.content+=chunk.contentBlockDelta.delta.text,emitter.emit("data",chunk.contentBlockDelta.delta.text),emitter.emit("content",chunk.contentBlockDelta.delta.text,currentMessage.role)),chunk.contentBlockStart?.start?.toolUse){const toolUse=chunk.contentBlockStart.start.toolUse;toolUse.toolUseId&&toolUse.name&&(currentMessage.currentToolCall={index:currentMessage.toolCalls.length,id:toolUse.toolUseId,type:"function",name:_deserializeToolName(toolUse.name),arguments:"",role:"tool"},currentMessage.currentToolInput="")}if(chunk.contentBlockDelta?.delta?.toolUse?.input&&currentMessage.currentToolCall&&(currentMessage.currentToolInput+=chunk.contentBlockDelta.delta.toolUse.input,currentMessage.currentToolCall.arguments=currentMessage.currentToolInput),chunk.contentBlockStop&&currentMessage.currentToolCall&&(typeof currentMessage.currentToolCall.arguments=="string"&&isJSONString(currentMessage.currentToolCall.arguments)&&(currentMessage.currentToolCall.arguments=JSON.parse(currentMessage.currentToolCall.arguments)),currentMessage.toolCalls.push(currentMessage.currentToolCall),currentMessage.currentToolCall=null,currentMessage.currentToolInput=""),chunk.messageStop&&(currentMessage.toolCalls.length>0&&emitter.emit(TLLMEvent.ToolInfo,currentMessage.toolCalls),emitter.emit(TLLMEvent.End,currentMessage.toolCalls)),chunk?.metadata?.usage){const usage=chunk.metadata.usage;this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId})}}})(),emitter}catch(error){const typedError=error;return emitter.emit(TLLMEvent.Error,typedError?.error||typedError),emitter}}async reqBodyAdapter(params){const customModelInfo=params.modelInfo;let systemPrompt,messages=params?.messages||[];const{systemMessage,otherMessages}=LLMHelper.separateSystemMessages(messages);"content"in systemMessage&&(systemPrompt=typeof systemMessage?.content=="string"?[{text:systemMessage?.content}]:systemMessage?.content),messages=otherMessages;const body={modelId:customModelInfo.settings?.customModel||customModelInfo.settings?.foundationModel,messages};return systemPrompt&&(body.system=systemPrompt),params?.toolsConfig?.tools?.length>0&&(body.toolConfig={tools:params?.toolsConfig?.tools,...params?.toolsConfig?.tool_choice&&{toolChoice:params?.toolsConfig?.tool_choice}}),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage.inputTokens,output_tokens:usage.outputTokens,input_tokens_cache_write:usage.cacheWriteInputTokenCount||0,input_tokens_cache_read:usage.cacheReadInputTokenCount||0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){let tools=[];return type==="function"&&(tools=toolDefinitions.map(tool=>{const{name,description,properties,requiredFields}=tool;return{toolSpec:{name:_serializeToolName(name),description,inputSchema:{json:{type:"object",properties,required:requiredFields}}}}})),tools?.length>0?{tools,toolChoice:toolChoice||"auto"}:{}}transformToolMessageBlocks({messageBlock,toolsData}){const messageBlocks=[];if(messageBlock){const content=[];typeof messageBlock.content=="string"?content.push({text:messageBlock.content}):Array.isArray(messageBlock.content)&&content.push(...messageBlock.content),messageBlock.tool_calls?.length&&messageBlock.tool_calls.forEach(toolCall=>{const args=toolCall?.function?.arguments;content.push({toolUse:{toolUseId:toolCall.id,name:_serializeToolName(toolCall?.function?.name),input:typeof args=="string"?JSONContent(args||"{}").tryParse():args||{}}})}),messageBlocks.push({role:messageBlock?.role,content})}if(toolsData?.length){const toolResultsContent=toolsData.filter(tool=>tool.id&&(tool.result||tool.error)).map(tool=>{let content;return typeof tool?.result=="string"?content=[{text:tool.result}]:typeof tool?.result=="object"&&(content=[{json:tool.result}]),{toolResult:{toolUseId:tool.id,content,...tool.error&&{status:"error"}}}});toolResultsContent.length>0&&messageBlocks.push({role:TLLMMessageRole.User,content:toolResultsContent})}return messageBlocks}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{let textBlock=[];return message?.parts?textBlock=message.parts.map(part=>"text"in part?{...part,text:part.text||"..."}:{...part}):message?.content&&(textBlock=Array.isArray(message.content)?message.content.map(part=>"text"in part?{...part,text:part.text||"..."}:{...part}):[{text:message?.content||"..."}]),{role:message.role,content:textBlock}})}}function _serializeToolName(name){return name?.replace(/-/g,"__")}function _deserializeToolName(name){return name?.replace(/__/g,"-")}var __defProp$C=Object.defineProperty,__defNormalProp$C=(obj,key,value)=>key in obj?__defProp$C(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$C=(obj,key,value)=>__defNormalProp$C(obj,key+"",value);class VertexAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$C(this,"name","LLM:VertexAI")}async getClient(params){const credentials=params.credentials,modelInfo=params.modelInfo,projectId=modelInfo?.settings?.projectId,region=modelInfo?.settings?.region;return new VertexAI({project:projectId,location:region,apiEndpoint:modelInfo?.settings?.apiEndpoint,googleAuthOptions:{credentials}})}async request({acRequest,body,context}){try{const vertexAI=await this.getClient(context),contents=body.contents;delete body.contents;const requestParam={contents},response=await(await vertexAI.getGenerativeModel(body).generateContent(requestParam)).response,content=response.candidates?.[0]?.content?.parts?.[0]?.text||"",finishReason=response.candidates?.[0]?.finishReason||"stop",usage=response.usageMetadata;let toolsData=[],useTool=!1;const functionCalls=response.candidates?.[0]?.content?.parts?.filter(part=>part.functionCall);return functionCalls&&functionCalls.length>0&&(functionCalls.forEach((call,index)=>{toolsData.push({index,id:call.functionCall?.name+"_"+index,type:"function",name:call.functionCall?.name,arguments:call.functionCall?.args,role:TLLMMessageRole.Assistant})}),useTool=!0),usage&&this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}),{content,finishReason,toolsData,useTool}}catch(error){throw error}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1;return setTimeout(async()=>{try{const vertexAI=await this.getClient(context),contents=body.contents;delete body.contents;const vertexModel=vertexAI.getGenerativeModel(body),requestParam={contents},streamResult=await vertexModel.generateContentStream(requestParam);let toolsData=[],usageData=[];for await(const chunk of streamResult.stream){const chunkText2=chunk.candidates?.[0]?.content?.parts?.[0]?.text||"";chunkText2&&emitter.emit("content",chunkText2)}const aggregatedResponse=await streamResult.response,functionCalls=aggregatedResponse.candidates?.[0]?.content?.parts?.filter(part=>part.functionCall);functionCalls&&functionCalls.length>0&&(functionCalls.forEach((call,index)=>{toolsData.push({index,id:call.functionCall?.name+"_"+index,type:"function",name:call.functionCall?.name,arguments:call.functionCall?.args,role:TLLMMessageRole.Assistant})}),emitter.emit(TLLMEvent.ToolInfo,toolsData));const usage=aggregatedResponse.usageMetadata;if(usage){const reportedUsage=this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId});usageData.push(reportedUsage)}const finishReason=(aggregatedResponse.candidates?.[0]?.finishReason||"stop").toLowerCase();finishReason!=="stop"&&emitter.emit("interrupted",finishReason),setTimeout(()=>{emitter.emit("end",toolsData,usageData,finishReason)},100)}catch(error){emitter.emit("error",error)}},100),emitter}async reqBodyAdapter(params){const model=params?.model,{messages,systemMessage}=await this.prepareMessages(params);let body={model,contents:messages};const responseFormat=params?.responseFormat||"";let systemInstruction=systemMessage||"";responseFormat==="json"&&(systemInstruction+=(systemInstruction?`