@smythos/sre 1.5.33 → 1.5.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +7 -7
- package/dist/index.js.map +1 -1
- package/dist/types/Components/ImageGenerator.class.d.ts +2 -2
- package/dist/types/constants.d.ts +1 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.d.ts +3 -0
- package/dist/types/subsystems/LLMManager/LLM.service/connectors/xAI.class.d.ts +121 -0
- package/package.json +2 -1
- package/src/Components/ImageGenerator.class.ts +97 -6
- package/src/constants.ts +1 -0
- package/src/index.ts +185 -185
- package/src/index.ts.bak +185 -185
- package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +3 -3
- package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +59 -0
- package/src/subsystems/LLMManager/LLM.service/index.ts +1 -1
- /package/src/subsystems/LLMManager/LLM.service/connectors/{xAI.ts → xAI.class.ts} +0 -0
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}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 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}from"@google/generative-ai";import{GoogleAIFileManager,FileState}from"@google/generative-ai/server";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 chokidar 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.
|
|
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}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 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}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 chokidar 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.34";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.
|
|
@@ -9,7 +9,7 @@ Respond ONLY with a valid, parsable JSON object. Follow these strict guidelines:
|
|
|
9
9
|
|
|
10
10
|
Example of a valid response:
|
|
11
11
|
{"result": "This is a valid JSON response without any extra text."}
|
|
12
|
-
`,SUPPORTED_MIME_TYPES_MAP={OpenAI:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"],imageGen:["image/png","image/jpeg","image/jpg","image/webp"],document:["application/pdf"]},TogetherAI:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"]},Anthropic:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"]},GoogleAI:{image:["image/png","image/jpeg","image/jpg","image/webp","image/heic","image/heif"],video:["video/mp4","video/mpeg","video/mov","video/avi","video/x-msvideo","video/x-flv","video/mpg","video/webm","video/wmv","video/3gpp"],audio:["audio/wav","audio/mp3","audio/mpeg","audio/aiff","audio/aac","audio/ogg","audio/flac"],document:["application/pdf","application/x-javascript","application/x-typescript","application/x-python-code","application/json","application/rtf","text/plain","text/html","text/css","text/javascript","text/x-typescript","text/csv","text/markdown","text/x-python","text/xml","text/rtf"]},Groq:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"]}},DEFAULT_SMYTHOS_LLM_PROVIDERS_SETTINGS={openai:{enabled:!0},anthropic:{enabled:!0},googleai:{enabled:!0},togetherai:{enabled:!0},groq:{enabled:!0},xai:{enabled:!0}},BUILT_IN_MODEL_PREFIX="smythos/";var TConnectorService=(TConnectorService2=>(TConnectorService2.Storage="Storage",TConnectorService2.VectorDB="VectorDB",TConnectorService2.Cache="Cache",TConnectorService2.LLM="LLM",TConnectorService2.Vault="Vault",TConnectorService2.Account="Account",TConnectorService2.AgentData="AgentData",TConnectorService2.CLI="CLI",TConnectorService2.NKV="NKV",TConnectorService2.Router="Router",TConnectorService2.ManagedVault="ManagedVault",TConnectorService2.Log="Log",TConnectorService2.Component="Component",TConnectorService2.ModelsProvider="ModelsProvider",TConnectorService2.Code="Code",TConnectorService2))(TConnectorService||{}),__defProp$1F=Object.defineProperty,__defNormalProp$1F=(obj,key,value)=>key in obj?__defProp$1F(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1F=(obj,key,value)=>__defNormalProp$1F(obj,typeof key!="symbol"?key+"":key,value);function uid(){return(Date.now()+Math.random()).toString(36).replace(".","").toUpperCase()}function isSubclassOf(subClass,superClass){if(typeof subClass!="function"||typeof superClass!="function")return!1;let prototype=Object.getPrototypeOf(subClass.prototype),depth=10;for(;prototype&&depth>=0;){if(prototype===superClass.prototype)return!0;prototype=Object.getPrototypeOf(prototype),depth++}return!1}async function processWithConcurrencyLimit(tasks,maxConcurrentTasks=10){const limit=pLimit(maxConcurrentTasks),limitedTasks=tasks.map(task=>limit(task));return(await Promise.allSettled(limitedTasks)).flatMap(result=>result.status==="fulfilled"?[result.value]:[]).filter(Boolean)}const isJSONString=str=>{try{return typeof str=="string"&&!!JSON.parse(str)}catch{return!1}};class ControlledPromise extends Promise{constructor(executor){let internalResolve,internalReject,_isSettled=!1;super((resolve,reject)=>{internalResolve=value=>{_isSettled||(_isSettled=!0,resolve(value))},internalReject=reason=>{_isSettled||(_isSettled=!0,reject(reason))}}),__publicField$1F(this,"_isSettled",!1),__publicField$1F(this,"isSettled"),__publicField$1F(this,"resolve"),__publicField$1F(this,"reject"),this.resolve=internalResolve,this.reject=internalReject,this.isSettled=()=>_isSettled,executor(this.resolve,this.reject,this.isSettled)}}function debounce(func,wait,options){let timeout=null,lastCall=0;return function(...args){const now=Date.now(),later=()=>{timeout=null,lastCall=now,func.apply(this,args)};timeout&&clearTimeout(timeout),options.leading&&!timeout&&(func.apply(this,args),lastCall=now),options.maxWait&&now-lastCall>=options.maxWait&&(func.apply(this,args),lastCall=now),timeout=setTimeout(later,wait)}}function getFormattedStackTrace(limit=3,skip=0){const stack=new Error().stack;if(!stack)return[];const relevantLines=stack.split(`
|
|
12
|
+
`,SUPPORTED_MIME_TYPES_MAP={OpenAI:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"],imageGen:["image/png","image/jpeg","image/jpg","image/webp"],document:["application/pdf"]},TogetherAI:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"]},Anthropic:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"]},GoogleAI:{image:["image/png","image/jpeg","image/jpg","image/webp","image/heic","image/heif"],imageGen:["image/png","image/jpeg","image/jpg","image/webp"],video:["video/mp4","video/mpeg","video/mov","video/avi","video/x-msvideo","video/x-flv","video/mpg","video/webm","video/wmv","video/3gpp"],audio:["audio/wav","audio/mp3","audio/mpeg","audio/aiff","audio/aac","audio/ogg","audio/flac"],document:["application/pdf","application/x-javascript","application/x-typescript","application/x-python-code","application/json","application/rtf","text/plain","text/html","text/css","text/javascript","text/x-typescript","text/csv","text/markdown","text/x-python","text/xml","text/rtf"]},Groq:{image:["image/png","image/jpeg","image/jpg","image/webp","image/gif"]}},DEFAULT_SMYTHOS_LLM_PROVIDERS_SETTINGS={openai:{enabled:!0},anthropic:{enabled:!0},googleai:{enabled:!0},togetherai:{enabled:!0},groq:{enabled:!0},xai:{enabled:!0}},BUILT_IN_MODEL_PREFIX="smythos/";var TConnectorService=(TConnectorService2=>(TConnectorService2.Storage="Storage",TConnectorService2.VectorDB="VectorDB",TConnectorService2.Cache="Cache",TConnectorService2.LLM="LLM",TConnectorService2.Vault="Vault",TConnectorService2.Account="Account",TConnectorService2.AgentData="AgentData",TConnectorService2.CLI="CLI",TConnectorService2.NKV="NKV",TConnectorService2.Router="Router",TConnectorService2.ManagedVault="ManagedVault",TConnectorService2.Log="Log",TConnectorService2.Component="Component",TConnectorService2.ModelsProvider="ModelsProvider",TConnectorService2.Code="Code",TConnectorService2))(TConnectorService||{}),__defProp$1F=Object.defineProperty,__defNormalProp$1F=(obj,key,value)=>key in obj?__defProp$1F(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1F=(obj,key,value)=>__defNormalProp$1F(obj,typeof key!="symbol"?key+"":key,value);function uid(){return(Date.now()+Math.random()).toString(36).replace(".","").toUpperCase()}function isSubclassOf(subClass,superClass){if(typeof subClass!="function"||typeof superClass!="function")return!1;let prototype=Object.getPrototypeOf(subClass.prototype),depth=10;for(;prototype&&depth>=0;){if(prototype===superClass.prototype)return!0;prototype=Object.getPrototypeOf(prototype),depth++}return!1}async function processWithConcurrencyLimit(tasks,maxConcurrentTasks=10){const limit=pLimit(maxConcurrentTasks),limitedTasks=tasks.map(task=>limit(task));return(await Promise.allSettled(limitedTasks)).flatMap(result=>result.status==="fulfilled"?[result.value]:[]).filter(Boolean)}const isJSONString=str=>{try{return typeof str=="string"&&!!JSON.parse(str)}catch{return!1}};class ControlledPromise extends Promise{constructor(executor){let internalResolve,internalReject,_isSettled=!1;super((resolve,reject)=>{internalResolve=value=>{_isSettled||(_isSettled=!0,resolve(value))},internalReject=reason=>{_isSettled||(_isSettled=!0,reject(reason))}}),__publicField$1F(this,"_isSettled",!1),__publicField$1F(this,"isSettled"),__publicField$1F(this,"resolve"),__publicField$1F(this,"reject"),this.resolve=internalResolve,this.reject=internalReject,this.isSettled=()=>_isSettled,executor(this.resolve,this.reject,this.isSettled)}}function debounce(func,wait,options){let timeout=null,lastCall=0;return function(...args){const now=Date.now(),later=()=>{timeout=null,lastCall=now,func.apply(this,args)};timeout&&clearTimeout(timeout),options.leading&&!timeout&&(func.apply(this,args),lastCall=now),options.maxWait&&now-lastCall>=options.maxWait&&(func.apply(this,args),lastCall=now),timeout=setTimeout(later,wait)}}function getFormattedStackTrace(limit=3,skip=0){const stack=new Error().stack;if(!stack)return[];const relevantLines=stack.split(`
|
|
13
13
|
`).slice(3+skip),formattedCalls=[],length=Math.min(limit,relevantLines.length);for(let i=0;i<length;i++){const line=relevantLines[i].trim();if(!line)continue;let match=line.match(/at\s+(.+?)\s+\((.+?):(\d+):(\d+)\)/);if(match){const[,functionName,filePath,lineNum]=match,fileName=filePath.split(/[/\\]/).pop()||filePath,cleanFunctionName=functionName.includes(".")?functionName.split(".").pop():functionName;formattedCalls.push(`${i<length-1?"\u251C":"\u2514"} ${cleanFunctionName}() in ${fileName} (${filePath}:${lineNum})`)}else if(match=line.match(/at\s+(.+?):(\d+):(\d+)/),match){const[,filePath,lineNum]=match,fileName=filePath.split(/[/\\]/).pop()||filePath;formattedCalls.push(` ${fileName}:${lineNum}`)}if(!match&&line.includes("at ")){const cleanLine=line.replace("at ","").trim();formattedCalls.push(` ${cleanLine}`)}}return formattedCalls}function printStackTrace(logger2,limit=3,skip=0){const stackTrace=getFormattedStackTrace(limit,skip);stackTrace.length>0&&(logger2.debug("Call trace:"),stackTrace.forEach((call,index)=>{logger2.debug(` ${call}`)}))}function getCurrentFormattedDate(){const date=new Date,year=date.getFullYear(),month=String(date.getMonth()+1).padStart(2,"0"),day=String(date.getDate()).padStart(2,"0"),hours=String(date.getHours()).padStart(2,"0"),minutes=String(date.getMinutes()).padStart(2,"0"),seconds=String(date.getSeconds()).padStart(2,"0");return`${year}-${month}-${day}-${hours}-${minutes}-${seconds}`}function getDayFormattedDate(){const date=new Date,year=date.getFullYear(),month=String(date.getMonth()+1).padStart(2,"0"),day=String(date.getDate()).padStart(2,"0");return`${year}-${month}-${day}`}function delay(ms){return new Promise(r=>setTimeout(r,ms))}var __defProp$1E=Object.defineProperty,__defNormalProp$1E=(obj,key,value)=>key in obj?__defProp$1E(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$1E=(obj,key,value)=>__defNormalProp$1E(obj,typeof key!="symbol"?key+"":key,value);function isValidString(str){return str&&typeof str=="string"}const isValidNumber=str=>{const num=parseFloat(str);return!isNaN(num)&&num<=Number.MAX_SAFE_INTEGER&&num>=Number.MIN_SAFE_INTEGER&&num.toString()===str.trim()};function convertStringToRespectiveType(data){if(data==null)return data;if(typeof data!="object"){if(typeof data=="string"){if(data.toLowerCase()==="true")return!0;if(data.toLowerCase()==="false")return!1;if(isValidNumber(data))return Number(data);if(data.toLowerCase()==="null")return null;if(data.toLowerCase()==="undefined")return}return data}return Array.isArray(data)?data.map(item=>convertStringToRespectiveType(item)):Object.fromEntries(Object.entries(data).map(([key,value])=>[key,convertStringToRespectiveType(value)]))}const kebabToCamel=input=>!input||typeof input!="string"?input:input.replace(/-([a-z])/g,function(match,group){return group.toUpperCase()}),kebabToCapitalize=input=>!input||typeof input!="string"?input:input.split("-").map(word=>word.charAt(0).toUpperCase()+word.slice(1)).join(" "),identifyMimetypeFromString=input=>{if(typeof input!="string"||!input.trim())return"";const trimmedInput=input.trim();if(trimmedInput.startsWith("{")&&trimmedInput.endsWith("}")||trimmedInput.startsWith("[")&&trimmedInput.endsWith("]"))try{return JSON.parse(trimmedInput),"application/json"}catch{}if(trimmedInput.startsWith("<")&&trimmedInput.endsWith(">"))return trimmedInput.match(/^<\?xml\s/i)||trimmedInput.match(/^<[a-zA-Z][^>]*>.*<\/[a-zA-Z][^>]*>$/s)?"application/xml":trimmedInput.match(/^<!DOCTYPE\s+html/i)||trimmedInput.match(/<html[^>]*>/i)||trimmedInput.match(/<head[^>]*>/i)||trimmedInput.match(/<body[^>]*>/i)||trimmedInput.match(/<div[^>]*>/i)||trimmedInput.match(/<p[^>]*>/i)?"text/html":trimmedInput.match(/<svg[^>]*>/i)?"image/svg+xml":"application/xml";if(trimmedInput.match(/^[^{]*\{[^}]*\}/s)||trimmedInput.match(/@(import|media|charset|keyframes|font-face)/i))return"text/css";if(trimmedInput.match(/^(function\s+\w+|var\s+\w+|let\s+\w+|const\s+\w+|class\s+\w+)/i)||trimmedInput.match(/(console\.log|document\.|window\.|require\(|import\s+)/i)||trimmedInput.match(/=>\s*{|function\s*\(/))return"application/javascript";if(trimmedInput.match(/^---\s*$/m)||trimmedInput.match(/^[a-zA-Z_][a-zA-Z0-9_]*:\s*[^\n]+$/m)||trimmedInput.match(/^\s*-\s+[^\n]+$/m))return"application/yaml";const lines=trimmedInput.split(`
|
|
14
14
|
`);if(lines.length>1){const firstLine=lines[0],hasCommas=firstLine.includes(","),hasSemicolons=firstLine.includes(";"),hasTabs=firstLine.includes(" ");if(hasCommas||hasSemicolons||hasTabs){const delimiter=hasCommas?",":hasSemicolons?";":" ",firstLineFields=firstLine.split(delimiter).length;let csvLikeLines=0;for(let i=0;i<Math.min(lines.length,5);i++){const fieldsCount=lines[i].split(delimiter).length;fieldsCount===firstLineFields&&fieldsCount>1&&csvLikeLines++}if(csvLikeLines>=Math.min(lines.length,3))return"text/csv"}}return trimmedInput.match(/^#+\s+/m)||trimmedInput.match(/^\*\s+/m)||trimmedInput.match(/^-\s+/m)||trimmedInput.match(/\*\*[^*]+\*\*/g)||trimmedInput.match(/\[[^\]]+\]\([^)]+\)/g)?"text/markdown":trimmedInput.match(/^\s*(SELECT|INSERT|UPDATE|DELETE|CREATE|DROP|ALTER|GRANT|REVOKE)\s+/i)?"application/sql":"text/plain"};function chunkText(text,{chunkSize=4e3,chunkOverlap=500}={}){return new RecursiveTextSplitter({chunkSize,chunkOverlap}).splitText(text)}class TextSplitter{constructor({chunkSize=1e3,chunkOverlap=200,separators,keepSeparator}={}){if(__publicField$1E(this,"chunkSize"),__publicField$1E(this,"chunkOverlap"),__publicField$1E(this,"separators",[`
|
|
15
15
|
|
|
@@ -105,10 +105,10 @@ ${_error}
|
|
|
105
105
|
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}var translation={inputs:{Text:{type:"string",desc:"(required) a string to be translated in the original languages",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},summarization={inputs:{Text:{type:"string",desc:"(required) a string to be summarized",request_parameter_name:"inputs",request_parameter_type:"string"}},parameters:{min_length:{type:"number",default:"None",desc:"(Default: None). Integer to define the minimum length in tokens of the output summary."},max_length:{type:"number",default:"None",desc:"(Default: None). Integer to define the maximum length in tokens of the output summary."},top_k:{type:"number",default:"None",desc:"(Default: None). Integer to define the top tokens considered within the sample operation to create new text."},top_p:{type:"number",default:"None",desc:"(Default: None). Float to define the tokens that are within the sample operation of text generation. Add tokens in the sample for more probable to least probable until the sum of the probabilities is greater than top_p."},temperature:{type:"number",default:1,desc:"(Default: 1.0). Float (0.0-100.0). The temperature of the sampling operation. 1 means regular sampling, 0 means always take the highest score, 100.0 is getting closer to uniform probability."},repetition_penalty:{type:"number",default:"None",desc:"(Default: None). Float (0.0-100.0). The more a token is used within generation the more it is penalized to not be picked in successive generation passes."},max_time:{type:"number",default:"None",desc:"(Default: None). Float (0-120.0). The amount of time in seconds that the query should take maximum. Network can cause some overhead so it will be a soft limit."}},formatRequest:'inputs: "{{text}}"'},conversational={inputs:{Text:{type:"string",desc:"(required) The last input from the user in the conversation.",request_parameter_name:"text",request_parameter_type:"string"},Generated_responses:{type:"string[]",desc:"A list of strings corresponding to the earlier replies from the model.",request_parameter_name:"generated_responses",request_parameter_type:"string[]"},Past_user_inputs:{type:"string[]",desc:"A list of strings corresponding to the earlier replies from the user. Should be of the same length of generated_responses.",request_parameter_name:"past_user_inputs",request_parameter_type:"string[]"}},parameters:{min_length:{type:"number",default:"None",desc:"(Default: None). Integer to define the minimum length in tokens of the output summary."},max_length:{type:"number",default:"None",desc:"(Default: None). Integer to define the maximum length in tokens of the output summary."},top_k:{type:"number",default:"None",desc:"(Default: None). Integer to define the top tokens considered within the sample operation to create new text."},top_p:{type:"number",default:"None",desc:"(Default: None). Float to define the tokens that are within the sample operation of text generation. Add tokens in the sample for more probable to least probable until the sum of the probabilities is greater than top_p."},temperature:{type:"number",default:1,desc:"(Default: 1.0). Float (0.0-100.0). The temperature of the sampling operation. 1 means regular sampling, 0 means always take the highest score, 100.0 is getting closer to uniform probability."},repetition_penalty:{type:"number",default:"None",desc:"(Default: None). Float (0.0-100.0). The more a token is used within generation the more it is penalized to not be picked in successive generation passes."},max_time:{type:"number",default:"None",desc:"(Default: None). Float (0-120.0). The amount of time in seconds that the query should take maximum. Network can cause some overhead so it will be a soft limit."}},formatRequest:'inputs: "{{text}}", past_user_inputs: [{{past_user_inputs}}], generated_responses: [{{generated_responses}}] }'},hfParams={"text-classification":{inputs:{Text:{type:"string",desc:"(required) a string to be classified",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},"token-classification":{inputs:{Text:{type:"string",desc:"(required) a string to be classified",request_parameter_name:"inputs",request_parameter_type:"string"}},parameters:{aggregation_strategy:{type:"string",default:"simple",desc:"(Default: simple). There are several aggregation strategies:",supportedValues:[{value:"none",desc:"Every token gets classified without further aggregation."},{value:"simple",desc:"Entities are grouped according to the default schema (B-, I- tags get merged when the tag is similar)."},{value:"first",desc:"Same as the simple strategy except words cannot end up with different tags. Words will use the tag of the first token when there is ambiguity."},{value:"average",desc:"Same as the simple strategy except words cannot end up with different tags. Scores are averaged across tokens and then the maximum label is applied."},{value:"max",desc:"Same as the simple strategy except words cannot end up with different tags. Word entity will be the token with the maximum score."}]}},formatRequest:'inputs: "{{text}}"'},"table-question-answering":{inputs:{Query:{type:"string",desc:"(required) The query in plain text that you want to ask the table",request_parameter_name:"query",request_parameter_type:"string"},Table:{type:"string",desc:"(required) A table of data represented as a dict of list where entries are headers and the lists are all the values, all lists must have the same size.",request_parameter_name:"table",request_parameter_type:"Record<string, string[]>"}},formatRequest:'inputs: { query: "{{query}}", table: {{table}} }'},"question-answering":{inputs:{Question:{type:"string",request_parameter_name:"question",request_parameter_type:"string"},Context:{type:"string",request_parameter_name:"context",request_parameter_type:"string"}},formatRequest:'inputs: { context: "{{context}}", question: "{{question}}" }'},"document-question-answering":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"image",request_parameter_type:"Blob | ArrayBuffer"},Question:{type:"string",desc:"(required) Question about document image.",request_parameter_name:"question",request_parameter_type:"string"}},formatRequest:'inputs: { image: {{image}}, question: "{{question}}" }'},"visual-question-answering":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"image",request_parameter_type:"Blob | ArrayBuffer"},Question:{type:"string",desc:"(required) Question about visual image.",request_parameter_name:"question",request_parameter_type:"string"}},formatRequest:'inputs: { image: {{image}}, question: "{{question}}" }'},"zero-shot-classification":{inputs:{Text:{type:"string",desc:"(required) a string or list of strings",request_parameter_name:"inputs",request_parameter_type:"string | string[]"}},parameters:{candidate_labels:{type:"string[]",default:[],desc:"(required) a list of strings that are potential classes for inputs. (max 10 candidate_labels, for more, simply run multiple requests, results are going to be misleading if using too many candidate_labels anyway. If you want to keep the exact same, you can simply run multi_label=true and do the scaling on your end. )"},multi_label:{type:"boolean",default:!1,desc:"(Default: false) Boolean that is set to True if classes can overlap"}},formatRequest:'inputs: "{{text}}", parameters: { candidate_labels: [{{candidate_labels}}] }'},translation,summarization,conversational,"text-generation":{inputs:{Text:{type:"string",desc:"(required) a string to be generated from",request_parameter_name:"inputs",request_parameter_type:"string"}},parameters:{do_sample:{type:"boolean",default:!0,desc:"(Optional: true). Bool. Whether or not to use sampling, use greedy decoding otherwise."},max_time:{type:"number",default:"None",desc:"(Default: None). Float (0-120.0). The amount of time in seconds that the query should take maximum. Network can cause some overhead so it will be a soft limit."},num_return_sequences:{type:"number",default:1,desc:"(Default: 1). Integer. The number of proposition you want to be returned."},repetition_penalty:{type:"number",default:"None",desc:"(Default: None). Float (0.0-100.0). The more a token is used within generation the more it is penalized to not be picked in successive generation passes."},return_full_text:{type:"boolean",default:!0,desc:"(Default: true). Bool. If set to False, the return results will not contain the original query making it easier for prompting."},temperature:{type:"number",default:1,desc:"(Default: 1.0). Float (0.0-100.0). The temperature of the sampling operation. 1 means regular sampling, 0 means always take the highest score, 100.0 is getting closer to uniform probability."},max_new_tokens:{type:"number",default:"None",desc:"(Default: None). Int (0-250). The amount of new tokens to be generated, this does not include the input length it is a estimate of the size of generated text you want. Each new tokens slows down the request, so look for balance between response times and length of text generated."},top_k:{type:"number",default:"None",desc:"(Default: None). Integer to define the top tokens considered within the sample operation to create new text."},top_p:{type:"number",default:"None",desc:"(Default: None). Float to define the tokens that are within the sample operation of text generation. Add tokens in the sample for more probable to least probable until the sum of the probabilities is greater than top_p."},truncate:{type:"number",default:"None",desc:"(Default: None). Integer. The maximum number of tokens from the input."}},formatRequest:'inputs: "{{text}}"'},"text2text-generation":{inputs:{Text:{type:"string",desc:"(required) a string to be generated from",request_parameter_name:"inputs",request_parameter_type:"string"}},parameters:{max_time:{type:"number",default:"None",desc:"(Default: None). Float (0-120.0). The amount of time in seconds that the query should take maximum. Network can cause some overhead so it will be a soft limit."},num_return_sequences:{type:"number",default:1,desc:"(Default: 1). Integer. The number of proposition you want to be returned."},repetition_penalty:{type:"number",default:"None",desc:"(Default: None). Float (0.0-100.0). The more a token is used within generation the more it is penalized to not be picked in successive generation passes."},temperature:{type:"number",default:1,desc:"(Default: 1.0). Float (0.0-100.0). The temperature of the sampling operation. 1 means regular sampling, 0 means always take the highest score, 100.0 is getting closer to uniform probability."},max_new_tokens:{type:"number",default:"None",desc:"(Default: None). Int (0-250). The amount of new tokens to be generated, this does not include the input length it is a estimate of the size of generated text you want. Each new tokens slows down the request, so look for balance between response times and length of text generated."},top_k:{type:"number",default:"None",desc:"(Default: None). Integer to define the top tokens considered within the sample operation to create new text."},top_p:{type:"number",default:"None",desc:"(Default: None). Float to define the tokens that are within the sample operation of text generation. Add tokens in the sample for more probable to least probable until the sum of the probabilities is greater than top_p."}},formatRequest:'inputs: "{{text}}"'},"fill-mask":{inputs:{Text:{type:"string",desc:"(required) a string to be filled from, must contain the [MASK] token (check model card for exact name of the mask)",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},"sentence-similarity":{inputs:{Source_sentence:{type:"string",desc:"(required) The string that you wish to compare the other strings with. This can be a phrase, sentence, or longer passage, depending on the model being used.",request_parameter_name:"source_sentence",request_parameter_type:"string"},Sentences:{type:"string[]",desc:"(required) A list of strings which will be compared against the source_sentence.",request_parameter_name:"sentences",request_parameter_type:"string[]"}},formatRequest:'inputs: { source_sentence: "{{source_sentence}}", sentences: [{{sentences}}] }'},"text-to-image":{inputs:{Text:{type:"string",desc:"(required) prompt to generate image from",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},"image-to-text":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{image}} "},"image-classification":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{image}}"},"object-detection":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{image}}"},"image-segmentation":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{image}}"},"zero-shot-image-classification":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"image",request_parameter_type:"Blob | ArrayBuffer"}},parameters:{candidate_labels:{type:"string[]",desc:"A list of strings that are potential classes for inputs. (max 10)"}},formatRequest:"inputs: { image: {{image}}, parameters: { candidate_labels: [{{candidate_labels}}] } }"},"image-to-image":{inputs:{Image:{type:"URL | base64 | file | SmythFileObject",desc:"(required) image URL, base64 string, uploaded image, or linked image output",request_parameter_name:"inputs",request_parameter_type:"Blob | ArrayBuffer"}},parameters:{prompt:{type:"string",desc:"(Optional) The text prompt to guide the image generation",default:"None"},strength:{type:"number",default:0,desc:"(Optional) The 'strength' parameter is effective only for SD img2img and alt diffusion img2img models. It conceptually indicates the extent of transformation applied to the reference 'image,' with values between 0 and 1. A higher 'strength' adds more noise to the initial 'image,' and the denoising process runs for the specified number of iterations in 'num_inference_steps.' A 'strength' of 1 ignores the 'image,' applying maximum added noise and running denoising for the full set of iterations."},negative_prompt:{type:"string",default:"None",desc:"(Optional) A negative prompt for the image generation"},height:{type:"number",default:"None",desc:"(Optional) The height in pixels of the generated image"},width:{type:"number",default:"None",desc:"(Optional) The width in pixels of the generated image"},num_inference_steps:{type:"number",default:"None",desc:"(Optional) The number of denoising steps. More denoising steps usually lead to a higher quality image at the expense of slower inference."},guidance_scale:{type:"number",default:"None",desc:"(Optional) Guidance scale: Higher guidance scale encourages to generate images that are closely linked to the text `prompt`, usually at the expense of lower image quality."},guess_mode:{type:"boolean",default:"None",desc:"(Optional) guess_mode only works for ControlNet models, defaults to False In this mode, the ControlNet encoder will try best to recognize the content of the input image even if you remove all prompts. The `guidance_scale` between 3.0 and 5.0 is recommended."}},formatRequest:"inputs: {{image}}"},"text-to-speech":{inputs:{Text:{type:"string",desc:"(required) a string to be converted to speech",request_parameter_name:"inputs",request_parameter_type:"string"}},formatRequest:'inputs: "{{text}}"'},"automatic-speech-recognition":{inputs:{Audio:{type:"URL | base64 | SmythFileObject",desc:"(required) audio URL, base64 string, SmythFileObject",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{audio}}"},"audio-to-audio":{inputs:{Audio:{type:"URL | base64 | SmythFileObject",desc:"(required) audio URL, base64 string, SmythFileObject",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{audio}}"},"audio-classification":{inputs:{Audio:{type:"URL | base64 | SmythFileObject",desc:"(required) audio URL, base64 string, SmythFileObject",request_parameter_name:"data",request_parameter_type:"Blob | ArrayBuffer"}},formatRequest:"data: {{audio}}"},"feature-extraction":{inputs:{Text:{type:"string | string[]",desc:"(required) a string or a list of strings to get the features from.",request_parameter_name:"inputs",request_parameter_type:"string | string[]"}},formatRequest:'inputs: "{{text}}"'}},__defProp$$=Object.defineProperty,__defNormalProp$$=(obj,key,value)=>key in obj?__defProp$$(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$$=(obj,key,value)=>__defNormalProp$$(obj,key+"",value);function shouldNestInputs(formatRequestPattern){const trimmedPattern=formatRequestPattern?.trim();return/^(inputs|data):\s*{(?![{])/.test(trimmedPattern)}function validateAndParseJson$1(value,helpers){let parsedJson=null;try{parsedJson=JSON.parse(value)}catch{return helpers.error("string.invalidJson",{value})}if(typeof parsedJson!="object"||parsedJson===null)return helpers.error("string.notJsonObject",{value});for(const key in parsedJson)if(key.trim()==="")return helpers.error("object.emptyKey",{value});return parsedJson}class HuggingFace extends Component{constructor(){super(),__publicField$$(this,"configSchema",Joi.object({accessToken:Joi.string().max(350).required().label("Access Token"),modelName:Joi.string().max(100).required(),modelTask:Joi.string().max(100).required(),inputConfig:Joi.string().allow(""),parameters:Joi.string().custom(validateAndParseJson$1,"custom JSON validation").allow(""),name:Joi.string().max(100).required(),displayName:Joi.string().max(100).required(),desc:Joi.string().max(5e3).required().allow(""),logoUrl:Joi.string().max(500).allow(""),disableCache:Joi.boolean().strict()}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Hugging Face Log ===");const agentId=agent?.id,teamId=agent?.teamId,accessToken=await TemplateStringHelper.create(config2?.data?.accessToken).parseTeamKeysAsync(teamId).asyncResult;if(!accessToken)return{_error:"Please provide a valid Hugging Face Access Token",_debug:logger2.output};const hf=new HfInference(accessToken),task=config2?.data?.modelTask;if(!task)return{_error:"Hugging Face Task is required!",_debug:logger2.output};logger2.debug(`Task: ${kebabToCapitalize(task)}`);let hfFunc=kebabToCamel(task);if(hfFunc==="text2textGeneration"&&(hfFunc="textGeneration"),!hf?.[hfFunc])return{_error:`Inference API does not support for this task - ${kebabToCapitalize(task)}`,_debug:logger2.output};const modelName=config2?.data?.modelName;if(!modelName)return{_error:"Hugging Face Model is required!",_debug:logger2.output};logger2.debug(`Model Name: ${modelName}`);let inputConfig={};const formatRequest=hfParams?.[task]?.formatRequest,_hfParams=hfParams?.[task]?.inputs;if(_hfParams&&Object.keys(_hfParams).length>0){for(const key in _hfParams){const config22=_hfParams[key];inputConfig[key]=config22}typeof inputConfig=="object"&&inputConfig!==null&&(inputConfig={...inputConfig,formatRequest})}(!inputConfig||Object.keys(inputConfig)?.length===0)&&console.log("No inputs config found for Hugging Face Model!");let inputs={};if(!input||Object.keys(input)?.length===0)return{_error:"Please provide a valid input!",_debug:logger2.output};if(typeof input!="object")return{_error:"Invalid input!",_debug:logger2.output};if(typeof input=="object"&&Object.keys(input)?.length>0){for(const key in input)if(inputConfig?.[key]){let value=input[key],name=inputConfig[key].request_parameter_name,type=inputConfig[key].request_parameter_type;if(type&&type?.includes("Blob"))try{const buffer=await BinaryInput.from(value,void 0,void 0,AccessCandidate.agent(agentId)).getBuffer(),blob=new Blob([buffer]);inputs[name]=blob}catch(error){return{_error:error?.message||JSON.stringify(error),_debug:logger2.output}}else inputs[name]=value}}const structuredInputs=shouldNestInputs(inputConfig.formatRequest)?{inputs}:inputs;let inputsLog;if(structuredInputs.inputs&&typeof structuredInputs.inputs=="object"){inputsLog={...structuredInputs.inputs};for(const[key,value]of Object.entries(structuredInputs.inputs||{}))value instanceof Blob&&(inputsLog[key]=`Blob size=${value.size}`)}else inputsLog=structuredInputs;logger2.debug("Inputs: ",inputsLog);let params=JSON.parse(config2?.data?.parameters||"{}");params=convertStringToRespectiveType(params);let parameters={};if(params&&Object.keys(params)?.length>0)for(const key in params){const value=params[key];if(typeof value=="string"){if(value?.toLowerCase()==="none")continue;parameters[key]=TemplateStringHelper.create(value).parse(input).result}else parameters[key]=value}let args={model:modelName,...structuredInputs};const options={};config2?.data?.disableCache&&(options.use_cache=!1),Object.keys(parameters)?.length>0&&(args.parameters=parameters,logger2.debug(`Parameters:
|
|
106
106
|
`,parameters));const modelCallWithRetry=async({retryCount=0,retryLimit=2,retryDelay=1e3})=>{try{(typeof hf[hfFunc]!="function"||retryCount===retryLimit)&&(hfFunc="request");const result=await hf[hfFunc](args,options);let output;return result instanceof Blob?output=await BinaryInput.from(result).getJsonData(AccessCandidate.agent(agent.id)):Array.isArray(result)?output=await Promise.all(result.map(async item=>{if(item.blob instanceof Blob||typeof item.blob=="string"&&isBase64(item.blob)){let binaryInput;item.blob instanceof Blob?binaryInput=BinaryInput.from(item.blob):binaryInput=BinaryInput.from(item.blob,void 0,item["content-type"]);const fileObj=await binaryInput.getJsonData(AccessCandidate.agent(agent.id));return{...item,blob:fileObj}}else return item})):output=result,output}catch(error){if(retryCount<retryLimit)return await delay(retryDelay),modelCallWithRetry({retryCount:retryCount+1,retryLimit,retryDelay:retryDelay*2});throw error}};try{const output=await modelCallWithRetry({retryCount:0,retryLimit:2,retryDelay:5e3});return logger2.debug(`Output:
|
|
107
107
|
`,output),{Output:output,_debug:logger2.output}}catch(error){return console.log("Error on running Hugging Face Model!",error),console.log("Error: args, options ",args,options),{_error:`Error from Hugging Face:
|
|
108
|
-
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}const ImageSettingsConfig={model:Joi.string().max(100).required(),positivePrompt:Joi.string().required().min(2).max(2e3).label("Positive Prompt"),negativePrompt:Joi.string().optional().allow("").min(2).max(2e3).label("Negative Prompt"),width:Joi.number().min(128).max(2048).multiple(64).optional().messages({"number.multiple":"{{#label}} must be divisible by 64 (eg: 128...512, 576, 640...2048). Provided value: {{#value}}"}),height:Joi.number().min(128).max(2048).multiple(64).optional().messages({"number.multiple":"{{#label}} must be divisible by 64 (eg: 128...512, 576, 640...2048). Provided value: {{#value}}"}),outputFormat:Joi.string().valid("JPG","PNG","WEBP").optional(),outputQuality:Joi.number().min(20).max(99).optional().label("Output Quality"),numberResults:Joi.number().min(1).max(20).optional().label("Number of Results"),steps:Joi.number().min(0).max(100).optional().label("Strength"),backgroundColor:Joi.array().items(Joi.number().when("$index",{is:3,then:Joi.number().min(0).max(1),otherwise:Joi.number().min(0).max(255).integer()}).required()).length(4).optional().allow("").label("Background Color").description("RGBA color array [red, green, blue, alpha]. RGB values must be between 0-255, alpha must be between 0-1"),strength:Joi.number().min(0).max(1).optional().label("Strength"),upscaleFactor:Joi.number().min(2).max(4).optional().label("Upscale Factor"),confidence:Joi.number().min(0).max(1).optional().label("Confidence"),maxDetections:Joi.number().min(1).max(20).optional().label("Max Detections"),maskPadding:Joi.number().min(0).max(100).optional().label("Mask Padding"),maskBlur:Joi.number().min(0).max(100).optional().label("Mask Blur"),preProcessorType:Joi.string().valid("canny","depth","mlsd","normalbae","openpose","tile","seg","lineart","lineart_anime","shuffle","scribble","softedge").optional().label("Pre-Processor Type"),ipAdapters:Joi.array().items(Joi.object({model:Joi.string().required().label("IP Adapter Model"),guideImage:Joi.string().required().min(2).max(10485760).label("Guide Image"),weight:Joi.number().required().min(0).max(1).label("IP Adapter Weight")})).optional().label("IP Adapters")};async function getCredentials(candidate,credentialsRequest){typeof credentialsRequest=="string"&&(credentialsRequest={vaultProvider:"",keyName:credentialsRequest});const credentials=await ConnectorService.getVaultConnector(credentialsRequest.vaultProvider||"").requester(candidate).get(credentialsRequest.keyName);if(!credentialsRequest.mapping)return credentials;const mappedCredentials={};for(const[key,value]of Object.entries(credentialsRequest.mapping))mappedCredentials[key]=JSONExpression(credentials,value);return mappedCredentials}function JSONExpression(obj,propertyString){const properties=propertyString.split(/\.|\[|\]\.|\]\[|\]/).filter(Boolean);let currentProperty=obj;for(let property of properties){if(currentProperty==null)return;currentProperty=currentProperty[property]}return currentProperty}var __defProp$_=Object.defineProperty,__defNormalProp$_=(obj,key,value)=>key in obj?__defProp$_(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$_=(obj,key,value)=>__defNormalProp$_(obj,key+"",value);const IMAGE_GEN_COST_MAP={"dall-e-3":{standard:{"1024x1024":.04,"1024x1792":.08,"1792x1024":.08},hd:{"1024x1024":.08,"1024x1792":.12,"1792x1024":.12}},"dall-e-2":{"256x256":.016,"512x512":.018,"1024x1024":.02}};class ImageGenerator extends Component{constructor(){super(),__publicField$_(this,"configSchema",Joi.object({model:Joi.string().max(100).required(),prompt:Joi.string().optional().min(2).max(2e3).label("Prompt"),sizeDalle2:Joi.string().valid("256x256","512x512","1024x1024").optional(),sizeDalle3:Joi.string().valid("1024x1024","1792x1024","1024x1792").optional(),quality:Joi.string().valid("standard","hd","auto","high","medium","low").allow("").optional(),style:Joi.string().valid("vivid","natural").optional(),isRawInputPrompt:Joi.boolean().strict().optional(),negativePrompt:Joi.string().optional().allow("").min(2).max(2e3).label("Negative Prompt"),width:Joi.number().min(128).max(2048).multiple(64).optional().messages({"number.multiple":"{{#label}} must be divisible by 64 (eg: 128...512, 576, 640...2048). Provided value: {{#value}}"}),height:Joi.number().min(128).max(2048).multiple(64).optional().messages({"number.multiple":"{{#label}} must be divisible by 64 (eg: 128...512, 576, 640...2048). Provided value: {{#value}}"}),outputFormat:Joi.string().valid("PNG","JPEG","WEBP","auto","jpeg","png","webp").optional(),strength:ImageSettingsConfig.strength,size:Joi.string().optional().allow("").max(100).label("Size")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Image Generator Log ===");let model=config2?.data?.model;if(!model)return{_error:"Model Not Found: ",_debug:logger2.output};logger2.debug(`Model: ${model}`);let prompt=config2.data?.prompt||input?.Prompt;if(prompt=typeof prompt=="string"?prompt:JSON.stringify(prompt),prompt=TemplateString(prompt).parse(input).result,!prompt)return{_error:"Please provide a prompt or Image",_debug:logger2.output};logger2.debug(`Prompt:
|
|
108
|
+
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}const ImageSettingsConfig={model:Joi.string().max(100).required(),positivePrompt:Joi.string().required().min(2).max(2e3).label("Positive Prompt"),negativePrompt:Joi.string().optional().allow("").min(2).max(2e3).label("Negative Prompt"),width:Joi.number().min(128).max(2048).multiple(64).optional().messages({"number.multiple":"{{#label}} must be divisible by 64 (eg: 128...512, 576, 640...2048). Provided value: {{#value}}"}),height:Joi.number().min(128).max(2048).multiple(64).optional().messages({"number.multiple":"{{#label}} must be divisible by 64 (eg: 128...512, 576, 640...2048). Provided value: {{#value}}"}),outputFormat:Joi.string().valid("JPG","PNG","WEBP").optional(),outputQuality:Joi.number().min(20).max(99).optional().label("Output Quality"),numberResults:Joi.number().min(1).max(20).optional().label("Number of Results"),steps:Joi.number().min(0).max(100).optional().label("Strength"),backgroundColor:Joi.array().items(Joi.number().when("$index",{is:3,then:Joi.number().min(0).max(1),otherwise:Joi.number().min(0).max(255).integer()}).required()).length(4).optional().allow("").label("Background Color").description("RGBA color array [red, green, blue, alpha]. RGB values must be between 0-255, alpha must be between 0-1"),strength:Joi.number().min(0).max(1).optional().label("Strength"),upscaleFactor:Joi.number().min(2).max(4).optional().label("Upscale Factor"),confidence:Joi.number().min(0).max(1).optional().label("Confidence"),maxDetections:Joi.number().min(1).max(20).optional().label("Max Detections"),maskPadding:Joi.number().min(0).max(100).optional().label("Mask Padding"),maskBlur:Joi.number().min(0).max(100).optional().label("Mask Blur"),preProcessorType:Joi.string().valid("canny","depth","mlsd","normalbae","openpose","tile","seg","lineart","lineart_anime","shuffle","scribble","softedge").optional().label("Pre-Processor Type"),ipAdapters:Joi.array().items(Joi.object({model:Joi.string().required().label("IP Adapter Model"),guideImage:Joi.string().required().min(2).max(10485760).label("Guide Image"),weight:Joi.number().required().min(0).max(1).label("IP Adapter Weight")})).optional().label("IP Adapters")};async function getCredentials(candidate,credentialsRequest){typeof credentialsRequest=="string"&&(credentialsRequest={vaultProvider:"",keyName:credentialsRequest});const credentials=await ConnectorService.getVaultConnector(credentialsRequest.vaultProvider||"").requester(candidate).get(credentialsRequest.keyName);if(!credentialsRequest.mapping)return credentials;const mappedCredentials={};for(const[key,value]of Object.entries(credentialsRequest.mapping))mappedCredentials[key]=JSONExpression(credentials,value);return mappedCredentials}function JSONExpression(obj,propertyString){const properties=propertyString.split(/\.|\[|\]\.|\]\[|\]/).filter(Boolean);let currentProperty=obj;for(let property of properties){if(currentProperty==null)return;currentProperty=currentProperty[property]}return currentProperty}var __defProp$_=Object.defineProperty,__defNormalProp$_=(obj,key,value)=>key in obj?__defProp$_(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$_=(obj,key,value)=>__defNormalProp$_(obj,key+"",value);const IMAGE_GEN_COST_MAP={"dall-e-3":{standard:{"1024x1024":.04,"1024x1792":.08,"1792x1024":.08},hd:{"1024x1024":.08,"1024x1792":.12,"1792x1024":.12}},"dall-e-2":{"256x256":.016,"512x512":.018,"1024x1024":.02}},IMAGEN_4_COST_MAP={"imagen-4":.04,"imagen-4-ultra":.06};class ImageGenerator extends Component{constructor(){super(),__publicField$_(this,"configSchema",Joi.object({model:Joi.string().max(100).required(),prompt:Joi.string().optional().min(2).max(2e3).label("Prompt"),sizeDalle2:Joi.string().valid("256x256","512x512","1024x1024").optional(),sizeDalle3:Joi.string().valid("1024x1024","1792x1024","1024x1792").optional(),quality:Joi.string().valid("standard","hd","auto","high","medium","low").allow("").optional(),style:Joi.string().valid("vivid","natural").optional(),isRawInputPrompt:Joi.boolean().strict().optional(),negativePrompt:Joi.string().optional().allow("").min(2).max(2e3).label("Negative Prompt"),width:Joi.number().min(128).max(2048).multiple(64).optional().messages({"number.multiple":"{{#label}} must be divisible by 64 (eg: 128...512, 576, 640...2048). Provided value: {{#value}}"}),height:Joi.number().min(128).max(2048).multiple(64).optional().messages({"number.multiple":"{{#label}} must be divisible by 64 (eg: 128...512, 576, 640...2048). Provided value: {{#value}}"}),outputFormat:Joi.string().valid("PNG","JPEG","WEBP","auto","jpeg","png","webp").optional(),strength:ImageSettingsConfig.strength,size:Joi.string().optional().allow("").max(100).label("Size"),aspectRatio:Joi.string().valid("1:1","3:4","4:3","9:16","16:9").optional().allow("").label("Aspect Ratio"),personGeneration:Joi.string().valid("dont_allow","allow_adult","allow_all").optional().allow("").label("Person Generation")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Image Generator Log ===");let model=config2?.data?.model;if(!model)return{_error:"Model Not Found: ",_debug:logger2.output};logger2.debug(`Model: ${model}`);let prompt=config2.data?.prompt||input?.Prompt;if(prompt=typeof prompt=="string"?prompt:JSON.stringify(prompt),prompt=TemplateString(prompt).parse(input).result,!prompt)return{_error:"Please provide a prompt or Image",_debug:logger2.output};logger2.debug(`Prompt:
|
|
109
109
|
`,prompt);const modelFamily=await getModelFamily(model,agent);if(typeof imageGenerator[modelFamily]!="function")return{_error:`The model '${model}' is not available. Please try a different one.`,_debug:logger2.output};try{const{output}=await imageGenerator[modelFamily]({model,config:config2,input,logger:logger2,agent,prompt});return logger2.debug("Output: ",output),{Output:output,_debug:logger2.output}}catch(error){return{_error:`Generating Image(s)
|
|
110
110
|
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}const imageGenerator={gpt:async({model,prompt,config:config2,logger:logger2,agent,input})=>{let args={model,size:config2?.data?.size||"auto",quality:config2?.data?.quality||"auto"};try{const llmInference=await LLMInference$1.getInstance(model,AccessCandidate.agent(agent.id));if(!llmInference.connector)return{_error:`The model '${model}' is not available. Please try a different one.`,_debug:logger2.output};const provider=await agent.modelsProvider.getProvider(model),files=parseFiles(input,config2),validFiles=files.filter(file=>imageGenerator.isValidImageFile(provider,file.mimetype));if(files.length>0&&validFiles.length===0)throw new Error("Supported image file types are: "+SUPPORTED_MIME_TYPES_MAP[provider]?.imageGen?.join(", "));let response;validFiles.length>0?response=await llmInference.imageEditRequest({query:prompt,files:validFiles,params:{...args,agentId:agent.id}}):response=await llmInference.imageGenRequest({query:prompt,params:{...args,agentId:agent.id}}),response?.usage&&imageGenerator.reportTokenUsage(response.usage,{modelEntryName:model,keySource:model.startsWith(BUILT_IN_MODEL_PREFIX)?APIKeySource.Smyth:APIKeySource.User,agentId:agent.id,teamId:agent.teamId});let output=response?.data?.[0]?.b64_json;const binaryInput=BinaryInput.from(output),agentId=typeof agent=="object"&&agent.id?agent.id:agent;return{output:await binaryInput.getJsonData(AccessCandidate.agent(agentId))}}catch(error){throw new Error(`OpenAI Image Generation Error: ${error?.message||JSON.stringify(error)}`)}},"dall-e":async({model,prompt,config:config2,logger:logger2,agent,input})=>{let _finalPrompt=prompt;if(parseFiles(input,config2).length>0)throw new Error("OpenAI Image Generation Error: DALL-E models do not support image editing or variations. Please use a different model.");const responseFormat=config2?.data?.responseFormat||"url";let args={responseFormat,model},cost=0;if(model==="dall-e-3"){const size=config2?.data?.sizeDalle3||"1024x1024",quality=config2?.data?.quality||"standard",style=config2?.data?.style||"vivid";args.size=size,args.quality=quality,args.style=style,config2?.data?.isRawInputPrompt&&(_finalPrompt=`I NEED to test how the tool works with extremely simple prompts. DO NOT add any detail, just use it AS-IS: ${prompt}`),cost=IMAGE_GEN_COST_MAP[model][quality][size]}else if(model==="dall-e-2"){const size=config2?.data?.sizeDalle2||"256x256",numberOfImages=parseInt(config2?.data?.numberOfImages)||1;args.size=size,args.n=numberOfImages,cost=IMAGE_GEN_COST_MAP[model][size]}const llmInference=await LLMInference$1.getInstance(model,AccessCandidate.agent(agent.id));if(!llmInference.connector)return{_error:`The model '${model}' is not available. Please try a different one.`,_debug:logger2.output};const response=await llmInference.imageGenRequest({query:_finalPrompt,params:{...args,agentId:agent.id}});let output=response?.data?.[0]?.[responseFormat];const revised_prompt=response?.data?.[0]?.revised_prompt;return revised_prompt&&prompt!==revised_prompt&&logger2.debug(`Revised Prompt:
|
|
111
|
-
${revised_prompt}`),imageGenerator.reportUsage({cost},{modelEntryName:model,keySource:APIKeySource.Smyth,agentId:agent.id,teamId:agent.teamId}),{output}},runware:async({model,prompt,config:config2,agent,input})=>{const teamId=agent.teamId,apiKey=await getCredentials(AccessCandidate.team(teamId),"runware");if(!apiKey)throw new Error("Runware API key is missing. Please provide a valid key to continue.");const runware=new Runware({apiKey});await runware.ensureConnection();const negativePrompt=config2?.data?.negativePrompt||"",files=parseFiles(input,config2);let seedImage=Array.isArray(files)?files[0]:files;seedImage=await normalizeImageInput(seedImage);const imageRequestArgs={model:await agent.modelsProvider.getModelId(model),positivePrompt:prompt,width:+config2?.data?.width||1024,height:+config2?.data?.height||1024,numberResults:1,outputType:"URL",outputFormat:config2?.data?.outputFormat||"JPEG",includeCost:!0};seedImage&&(imageRequestArgs.seedImage=seedImage,imageRequestArgs.strength=+config2?.data?.strength||.5),negativePrompt&&(imageRequestArgs.negativePrompt=negativePrompt);try{const firstImage=(await runware.requestImages(imageRequestArgs))[0];let output=firstImage.imageURL;return imageGenerator.reportUsage({cost:firstImage.cost},{modelEntryName:model,keySource:APIKeySource.Smyth,agentId:agent.id,teamId:agent.teamId}),{output}}catch(error){throw new Error(`Runware Image Generation Error: ${error?.message||JSON.stringify(error)}`)}finally{await runware.disconnect()}},reportTokenUsage(usage,metadata){const usageData={sourceId:`api:imagegen.${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,keySource:metadata.keySource,input_tokens_txt:usage?.input_tokens_details?.text_tokens||0,input_tokens_img:usage?.input_tokens_details?.image_tokens||0,output_tokens:usage?.output_tokens,input_tokens_cache_read:usage?.prompt_tokens_details?.cached_tokens||0,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:API",usageData),usageData},reportUsage(usage,metadata){const usageData={sourceId:"api:imagegen.smyth",keySource:metadata.keySource,cost:usage?.cost,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:API",usageData),usageData},isValidImageFile(provider,mimetype){return SUPPORTED_MIME_TYPES_MAP[provider]?.imageGen?.includes(mimetype)}};async function getModelFamily(model,agent){return await isGPTModel(model)?"gpt":await isRunwareModel(model,agent)?"runware":await isDallEModel(model)?"dall-e":null}function isGPTModel(model){return model?.replace(BUILT_IN_MODEL_PREFIX,"")?.startsWith("gpt")}async function isRunwareModel(model,agent){const provider=await agent.modelsProvider.getProvider(model);return provider==="Runware"||provider
|
|
111
|
+
${revised_prompt}`),imageGenerator.reportUsage({cost},{modelEntryName:model,keySource:APIKeySource.Smyth,agentId:agent.id,teamId:agent.teamId}),{output}},runware:async({model,prompt,config:config2,agent,input})=>{const teamId=agent.teamId,apiKey=await getCredentials(AccessCandidate.team(teamId),"runware");if(!apiKey)throw new Error("Runware API key is missing. Please provide a valid key to continue.");const runware=new Runware({apiKey});await runware.ensureConnection();const negativePrompt=config2?.data?.negativePrompt||"",files=parseFiles(input,config2);let seedImage=Array.isArray(files)?files[0]:files;seedImage=await normalizeImageInput(seedImage);const imageRequestArgs={model:await agent.modelsProvider.getModelId(model),positivePrompt:prompt,width:+config2?.data?.width||1024,height:+config2?.data?.height||1024,numberResults:1,outputType:"URL",outputFormat:config2?.data?.outputFormat||"JPEG",includeCost:!0};seedImage&&(imageRequestArgs.seedImage=seedImage,imageRequestArgs.strength=+config2?.data?.strength||.5),negativePrompt&&(imageRequestArgs.negativePrompt=negativePrompt);try{const firstImage=(await runware.requestImages(imageRequestArgs))[0];let output=firstImage.imageURL;return imageGenerator.reportUsage({cost:firstImage.cost},{modelEntryName:model,keySource:APIKeySource.Smyth,agentId:agent.id,teamId:agent.teamId}),{output}}catch(error){throw new Error(`Runware Image Generation Error: ${error?.message||JSON.stringify(error)}`)}finally{await runware.disconnect()}},imagen:async({model,prompt,config:config2,logger:logger2,agent,input})=>{try{const llmInference=await LLMInference$1.getInstance(model,AccessCandidate.agent(agent.id));if(!llmInference.connector)return{_error:`The model '${model}' is not available. Please try a different one.`,_debug:logger2.output};if(parseFiles(input,config2).length>0)throw new Error("Google AI Image Generation Error: Image editing is not supported. Imagen models only support image generation.");let args={model,aspectRatio:config2?.data?.aspectRatio||config2?.data?.size||"1:1",numberOfImages:config2?.data?.numberOfImages||1,personGeneration:config2?.data?.personGeneration||"allow_adult"};const response=await llmInference.imageGenRequest({query:prompt,params:{...args,agentId:agent.id}}),modelName=model.replace(BUILT_IN_MODEL_PREFIX,""),cost=IMAGEN_4_COST_MAP[modelName];if(cost&&cost>0){const numberOfImages=args.numberOfImages||1,totalCost=cost*numberOfImages;imageGenerator.reportUsage({cost:totalCost},{modelEntryName:model,keySource:model.startsWith(BUILT_IN_MODEL_PREFIX)?APIKeySource.Smyth:APIKeySource.User,agentId:agent.id,teamId:agent.teamId})}let output=response?.data?.[0]?.b64_json;if(output){const binaryInput=BinaryInput.from(output),agentId=typeof agent=="object"&&agent.id?agent.id:agent;return{output:await binaryInput.getJsonData(AccessCandidate.agent(agentId))}}else return output=response?.data?.[0]?.url,{output}}catch(error){throw new Error(`Google AI Image Generation Error: ${error?.message||JSON.stringify(error)}`)}},reportTokenUsage(usage,metadata){const usageData={sourceId:`api:imagegen.${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,keySource:metadata.keySource,input_tokens_txt:usage?.input_tokens_details?.text_tokens||0,input_tokens_img:usage?.input_tokens_details?.image_tokens||0,output_tokens:usage?.output_tokens,input_tokens_cache_read:usage?.prompt_tokens_details?.cached_tokens||0,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:API",usageData),usageData},reportUsage(usage,metadata){const usageData={sourceId:"api:imagegen.smyth",keySource:metadata.keySource,cost:usage?.cost,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:API",usageData),usageData},isValidImageFile(provider,mimetype){return SUPPORTED_MIME_TYPES_MAP[provider]?.imageGen?.includes(mimetype)}};async function getModelFamily(model,agent){return await isGPTModel(model)?"gpt":await isRunwareModel(model,agent)?"runware":await isDallEModel(model)?"dall-e":await isGoogleAIModel(model,agent)?"imagen":null}function isGPTModel(model){return model?.replace(BUILT_IN_MODEL_PREFIX,"")?.startsWith("gpt")}async function isRunwareModel(model,agent){const provider=await agent.modelsProvider.getProvider(model);return provider==="Runware"||provider?.toLowerCase()==="Runware".toLowerCase()}function isDallEModel(model){return model?.replace(BUILT_IN_MODEL_PREFIX,"")?.startsWith("dall-e")}async function isGoogleAIModel(model,agent){const provider=await agent.modelsProvider.getProvider(model);return provider==="GoogleAI"||provider?.toLowerCase()==="GoogleAI".toLowerCase()||model?.replace(BUILT_IN_MODEL_PREFIX,"")?.includes("imagen")}function parseFiles(input,config2){const mediaTypes=["Image","Audio","Video","Binary"];return config2.inputs?.filter(_input=>mediaTypes.includes(_input.type))?.flatMap(_input=>{const value=input[_input.name];return Array.isArray(value)?value.map(item=>TemplateString(item).parseRaw(input).result):TemplateString(value).parseRaw(input).result})?.filter(file=>file)||[]}var __defProp$Z=Object.defineProperty,__defNormalProp$Z=(obj,key,value)=>key in obj?__defProp$Z(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$Z=(obj,key,value)=>__defNormalProp$Z(obj,key+"",value);class PromptGenerator extends Component{constructor(){super(),__publicField$Z(this,"configSchema",Joi.object({model:Joi.string().max(200).required(),prompt:Joi.string().required().max(8e6).label("Prompt"),temperature:Joi.number().min(0).max(5).label("Temperature"),maxTokens:Joi.number().min(1).label("Maximum Tokens"),stopSequences:Joi.string().allow("").max(400).label("Stop Sequences"),topP:Joi.number().min(0).max(1).label("Top P"),topK:Joi.number().min(0).max(500).label("Top K"),frequencyPenalty:Joi.number().min(0).max(2).label("Frequency Penalty"),presencePenalty:Joi.number().min(0).max(2).label("Presence Penalty"),responseFormat:Joi.string().valid("json","text").optional().label("Response Format"),passthrough:Joi.boolean().optional().label("Passthrough")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);try{logger2.debug("=== LLM Prompt Log ===");let teamId=agent?.teamId;const passThrough=config2.data.passthrough||!1,model=config2.data.model||"echo",llmInference=await LLMInference$1.getInstance(model,AccessCandidate.agent(agent.id));if(!llmInference.connector)return{_error:`The model '${model}' is not available. Please try a different one.`,_debug:logger2.output};const modelId=await agent.modelsProvider.getModelId(model);logger2.debug(` Model : ${modelId||model}`);let prompt=TemplateString(config2.data.prompt).parse(input).result;logger2.debug(` Prompt
|
|
112
112
|
`,prompt,`
|
|
113
113
|
`),config2.data.responseFormat=config2.data?.responseFormat||"json";let response;if(passThrough?response=await new Promise(async(resolve,reject)=>{let _content="";const eventEmitter=await llmInference.promptStream({query:prompt,params:{...config2,model,agentId:agent.id}}).catch(error=>{console.error("Error on promptStream: ",error),reject(error)});eventEmitter.on("content",content=>{typeof agent.callback=="function"&&agent.callback({content}),agent.sse.send("llm/passthrough/content",content),_content+=content}),eventEmitter.on("thinking",thinking=>{typeof agent.callback=="function"&&agent.callback({thinking}),agent.sse.send("llm/passthrough/thinking",thinking)}),eventEmitter.on("end",()=>{console.log("end"),resolve(_content)})}):response=await llmInference.prompt({query:prompt,params:{...config2,agentId:agent.id}}).catch(error=>({error})),!response)return{_error:" LLM Error = Empty Response!",_debug:logger2.output};if(response?.error){const error=response?.error+" "+(response?.details||"");return logger2.error(" LLM Error=",error),{Reply:response?.data,_error:error,_debug:logger2.output}}logger2.debug(` Response
|
|
114
114
|
`,response);const result={Reply:response};return result._debug=logger2.output,result}catch(error){return{_error:error.message,_debug:logger2.output}}}}async function parseHeaders(input,config2,agent){const teamId=agent?agent.teamId:null,templateSettings=config2?.template?.settings||{},contentType=config2?.data?.contentType||REQUEST_CONTENT_TYPES.none;let headers=typeof config2?.data?.headers=="object"?JSON.stringify(config2?.data?.headers):config2?.data?.headers||"{}";config2.data._templateVars&&templateSettings&&(headers=await TemplateString(headers).parseComponentTemplateVarsAsync(templateSettings).asyncResult,headers=await TemplateString(headers).parse(config2.data._templateVars).result),headers=await TemplateString(headers).parseTeamKeysAsync(teamId).asyncResult,headers=TemplateString(headers).parse(input).clean().result;let jsonHeaders=JSONContent(headers).tryParse();return typeof jsonHeaders!="object"&&(jsonHeaders={"x-smyth-error":"Error parsing headers"}),jsonHeaders=Object.fromEntries(Object.entries(jsonHeaders).map(([key,value])=>[key.toLowerCase(),value])),!jsonHeaders["content-type"]&&contentType!=="none"&&(jsonHeaders["content-type"]=contentType),new AxiosHeaders(jsonHeaders)}async function parseUrl(input,config2,agent){const teamId=agent?agent.teamId:null,templateSettings=config2?.template?.settings||{};let url=config2?.data?.url.replace(/\+/g,"%20");return config2.data._templateVars&&templateSettings&&(url=await TemplateString(url).parseComponentTemplateVarsAsync(templateSettings).asyncResult,url=await TemplateString(url).parse(config2.data._templateVars).result),url=await TemplateString(url).parseTeamKeysAsync(teamId).asyncResult,url=TemplateString(url).parse(input).clean().result,new URL(url).href}async function parseSmythFsUrl(url,agent){const urlObj=new URL(url),searchParams=urlObj.searchParams,publicUrls=[];for(const[key,value]of searchParams.entries())if(value.startsWith("smythfs://")){const pubUrl=await SmythFS.Instance.genTempUrl(value,AccessCandidate.agent(agent.id));publicUrls.push(pubUrl),searchParams.set(key,pubUrl)}return{url:urlObj.href,publicUrls}}async function destroyPublicUrls(publicUrls){try{await Promise.all(publicUrls.map(url=>SmythFS.Instance.destroyTempUrl(url))),console.log("Successfully cleaned up all temp urls for API Call Component")}catch(error){console.warn("Failed to clean up temp urls for API Call Component:",error)}return!0}async function parseData(input,config2,agent){const teamId=agent?agent.teamId:null,templateSettings=config2?.template?.settings||{},contentType=config2?.data?.contentType||REQUEST_CONTENT_TYPES.none;let body=typeof config2?.data?.body=="string"?config2?.data?.body?.trim():config2?.data?.body;if(!body)return{data:null,headers:{}};config2.data._templateVars&&templateSettings&&(body=await TemplateString(body).parseComponentTemplateVarsAsync(templateSettings).asyncResult),body=await TemplateString(body).parseTeamKeysAsync(teamId).asyncResult;const handler={[REQUEST_CONTENT_TYPES.json]:handleJson,[REQUEST_CONTENT_TYPES.urlEncodedFormData]:handleUrlEncoded,[REQUEST_CONTENT_TYPES.multipartFormData]:handleMultipartFormData,[REQUEST_CONTENT_TYPES.binary]:handleBinary,[REQUEST_CONTENT_TYPES.text]:handleText,[REQUEST_CONTENT_TYPES.none]:handleNone}[contentType]||handleNone,{data=null,headers={}}=await handler(body,input,config2,agent);return{data,headers}}async function handleJson(body,input,config2,agent){const data=TemplateString(body).parse(config2.data._templateVars).parse(input).clean().result;return{data:JSONContent(data).tryParse()}}async function handleUrlEncoded(body,input,config2,agent){const data=TemplateString(body).parse(config2.data._templateVars).parse(input).clean().result,jsonData=JSONContent(data).tryParse();if(typeof jsonData=="object"){const params=new URLSearchParams;for(const key in jsonData)params.append(key,String(jsonData[key]));return{data:params.toString()}}return{data:jsonData}}async function handleMultipartFormData(body,input,config2,agent){const formData=new FormData,_body=typeof body=="string"?JSON.parse(body):body;for(const key in _body){let value=_body[key];if(value=typeof value=="boolean"?String(value):value,value=TemplateString(value).parseRaw(input).result,value instanceof BinaryInput){const buffer=await value.getBuffer(),bufferStream=new Readable;bufferStream.push(buffer||null),bufferStream.push(null);const filename=await value.getName()||key;formData.append(key,bufferStream,{filename,contentType:value.mimetype})}else if(value&&typeof value=="object"&&value?.url){const binaryInput=await BinaryInput.from(value.url,"",value?.mimetype),buffer=await binaryInput.getBuffer(),bufferStream=new Readable;bufferStream.push(buffer||null),bufferStream.push(null);const filename=await binaryInput.getName()||key;formData.append(key,bufferStream,{filename,contentType:binaryInput.mimetype})}else value=TemplateString(value).parse(config2.data._templateVars).parse(input).clean().result,value&&formData.append(key,value)}return{data:formData,headers:formData.getHeaders()}}async function handleBinary(body,input,config2,agent){const value=TemplateString(body).parseRaw(input).result;if(value&&value instanceof BinaryInput)return{data:await value.getBuffer(),headers:{"Content-Type":value.mimetype}};if(value&&typeof value=="object"&&value?.url){const binaryInput=await BinaryInput.from(value.url,"",value?.mimetype);return{data:await binaryInput.getBuffer(),headers:{"Content-Type":binaryInput.mimetype}}}return{data:Buffer.from([]),headers:{}}}async function handleNone(body,input,config2,agent){return{data:typeof body=="string"?body:JSON.stringify(body),headers:{}}}function handleText(body,input,config2,agent){return{data:TemplateString(body).parse(config2.data._templateVars).parse(input).clean().result}}async function parseProxy(input,config2,agent){const teamId=agent?agent.teamId:null,templateSettings=config2?.template?.settings||{};let proxy=config2?.data?.proxy;if(!proxy)return!1;proxy=decodeURIComponent(proxy),config2.data._templateVars&&templateSettings&&(proxy=await TemplateString(proxy).parseComponentTemplateVarsAsync(templateSettings).parse(config2.data._templateVars).asyncResult),proxy=await TemplateString(proxy).parseTeamKeysAsync(teamId).asyncResult,proxy=TemplateString(proxy).parse(input).clean().result;const proxyList=proxy.split(/\n|\\n/).filter(p=>p)||[],randomIdx=Math.floor(Math.random()*proxyList?.length),proxyUrl=proxyList[randomIdx]?.trim(),urlObj=new URL(proxyUrl),protocol=urlObj.protocol.replace(":","");let proxyConfig;if(urlObj.protocol.startsWith("socks")){let proxyUrlString=`${protocol}://${urlObj.hostname}:${urlObj.port}`;(protocol==="socks4"||protocol==="socks4a")&&urlObj.username?proxyUrlString=`${protocol}://${urlObj.username}@${urlObj.hostname}:${urlObj.port}`:protocol==="socks5"&&urlObj.username&&(proxyUrlString=`${protocol}://${urlObj.username}:${urlObj.password}@${urlObj.hostname}:${urlObj.port}`),proxyConfig=new SocksProxyAgent(proxyUrlString)}else proxyConfig={protocol,host:urlObj.hostname,port:parseInt(urlObj.port),auth:urlObj.username?{username:urlObj.username,password:urlObj.password}:void 0};return proxyConfig}const mimeTypeCategories={binary:["image/","multipart/form-data","video/","application/msword","application/octet-stream","application/pdf","application/vnd.ms-excel","application/vnd.ms-powerpoint","application/vnd.oasis.opendocument.text","application/vnd.openxmlformats-officedocument","application/zip","application/x-7z-compressed","application/x-rar-compressed","application/x-tar","application/x-bzip","application/x-bzip2","application/x-gzip","application/vnd.android.package-archive","application/vnd.visio","application/x-deb","application/x-rpm","application/x-executable","font/ttf","font/otf","font/woff","font/woff2","model/"],json:["application/graphql","application/json","application/ld+json","application/vnd.api+json"],text:["text/","application/xml","application/xhtml+xml","application/csv","application/x-www-form-urlencoded","application/x-yaml","application/yaml","application/javascript","application/sql","application/rtf"]},contentHandlers={json:parseJson,text:parseText,binary:parseBinary};function parseJson(data){return JSON.parse(Buffer.from(data).toString("utf8")||"{}")}function parseText(data){return Buffer.from(data).toString("utf8")}async function parseBinary(data,contentType,agentId){return await BinaryInput.from(data,null,contentType).getJsonData(AccessCandidate.agent(agentId))}async function parseArrayBufferResponse(response,agent){if(!response?.data)return null;const data=response.data,contentType=response.headers["content-type"],cleanContentType=contentType?.split(";")[0];let handlerType=Object.keys(mimeTypeCategories).find(type=>mimeTypeCategories[type].includes(cleanContentType));handlerType||(handlerType=Object.keys(mimeTypeCategories).find(type=>mimeTypeCategories[type].some(prefix=>cleanContentType?.startsWith(prefix))));const handler=contentHandlers[handlerType];return handler?handler(data,contentType,agent.id):isBinaryMimeType(contentType)||isBinaryData(data)?parseBinary(data,contentType,agent.id):parseText(data)}var __defProp$Y=Object.defineProperty,__defNormalProp$Y=(obj,key,value)=>key in obj?__defProp$Y(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$Y=(obj,key,value)=>__defNormalProp$Y(obj,typeof key!="symbol"?key+"":key,value);const console$p=Logger("AccessTokenManager");let managedVault$1;SystemEvents.on("SRE:Booted",()=>{managedVault$1=ConnectorService.getManagedVaultConnector()});class AccessTokenManager{constructor(clientId,clientSecret,secondaryToken,tokenUrl,expires_in,primaryToken,data,keyId,logger2,agent){__publicField$Y(this,"clientId"),__publicField$Y(this,"clientSecret"),__publicField$Y(this,"primaryToken"),__publicField$Y(this,"secondaryToken"),__publicField$Y(this,"tokenUrl"),__publicField$Y(this,"expires_in"),__publicField$Y(this,"data"),__publicField$Y(this,"keyId"),__publicField$Y(this,"logger"),__publicField$Y(this,"agent"),this.clientId=clientId,this.clientSecret=clientSecret,this.primaryToken=primaryToken,this.secondaryToken=secondaryToken,this.tokenUrl=tokenUrl,this.expires_in=expires_in,this.data=data,this.keyId=keyId,this.logger=logger2,this.agent=agent}async getAccessToken(){try{const currentTime=new Date().getTime();if(!this.secondaryToken&&!this.expires_in)return console$p.log("Using long-lived access token"),this.logger.debug("Using long-lived access token. If authentication failes, please re-authenticate and try again"),this.primaryToken;if(!this.expires_in||currentTime>=Number(this.expires_in)){if(!this.secondaryToken)throw this.logger.debug("Refresh token is missing. Please re authenticate"),console$p.log("Refresh token is missing. Please re authenticate..."),new Error("Reauthentication required");return this.logger.debug("Access token is expired or missing. Refreshing access token..."),console$p.log("Access token is expired or missing. Refreshing access token..."),await this.refreshAccessToken()}else return console$p.log("Access token is still valid"),this.logger.debug("Access token is still valid."),this.primaryToken}catch(error){throw console$p.error("Error fetching access token:",error),this.logger.debug("Error fetching access token"),error}}async refreshAccessToken(){try{const response=await axios.post(this.tokenUrl,new URLSearchParams({client_id:this.clientId,client_secret:this.clientSecret,refresh_token:this.secondaryToken,grant_type:"refresh_token"}).toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}}),newAccessToken=response?.data?.access_token;console$p.log("Access token refreshed successfully."),this.logger.debug("Access token refreshed successfully.");const expiresInMilliseconds=response?.data?.expires_in?response?.data?.expires_in*1e3:response?.data?.expires_in,expirationTimestamp=expiresInMilliseconds&&new Date().getTime()+expiresInMilliseconds;this.data.primary=newAccessToken,this.data.expires_in=expirationTimestamp&&expirationTimestamp?.toString();const save=await managedVault$1.user(AccessCandidate.agent(this.agent.id)).set(this.keyId,JSON.stringify(this.data));return save&&save.status===200?(console$p.log("Access token value is updated successfully."),this.logger.debug("Access token value is updated successfully.")):(console$p.log("Warning: new access token value is not updated."),this.logger.debug("Warning: new access token value is not updated.")),newAccessToken}catch(error){throw console$p.error("Failed to refresh access token:",error),this.logger.debug(`Failed to refresh access token: ${error}`),new Error("Failed to refresh access token.")}}}const console$o=Logger("OAuth.helper");let managedVault;SystemEvents.on("SRE:Booted",()=>{try{managedVault=ConnectorService.getManagedVaultConnector()}catch{console$o.warn("Could not find a compatible ManagedVault connector, OAuth APICalls will not work")}});function extractAdditionalParamsForOAuth1(reqConfig={}){let additionalParams={};const searchParams=new URL(reqConfig.url).searchParams;additionalParams=Object.fromEntries(searchParams.entries());const contentType=reqConfig.headers?.["Content-Type"]||"";if(contentType===REQUEST_CONTENT_TYPES.urlEncodedFormData){if(typeof reqConfig.data=="string"){const formData=new URLSearchParams(reqConfig.data);additionalParams={...additionalParams,...Object.fromEntries(formData)}}}else if(contentType===REQUEST_CONTENT_TYPES.json){if(reqConfig.data){const hash=crypto$1.createHash("sha1").update(JSON.stringify(reqConfig.data)).digest("base64");additionalParams.oauth_body_hash=hash}}else if(contentType===REQUEST_CONTENT_TYPES.multipartFormData){const formData=reqConfig.data;for(const[key,value]of formData.entries())typeof value=="object"&&value!==null&&"size"in value&&"type"in value||(additionalParams[key]=value)}return additionalParams}const buildOAuth1Header=(url,method,oauth1Credentials,additionalParams={})=>{const oauth=new OAuth({consumer:{key:oauth1Credentials.consumerKey,secret:oauth1Credentials.consumerSecret},signature_method:"HMAC-SHA1",hash_function(base_string,key){return crypto$1.createHmac("sha1",key).update(base_string).digest("base64")}}),requestData={url,method,...additionalParams},signedRequest=oauth.authorize(requestData,{key:oauth1Credentials.token,secret:oauth1Credentials.tokenSecret});return oauth.toHeader(signedRequest)},retrieveOAuthTokens=async(agent,config2)=>{let tokenKey=null;try{tokenKey=`OAUTH_${config2.componentId??config2.id}_TOKENS`;try{const result=await managedVault.user(AccessCandidate.agent(agent.id)).get(tokenKey),tokensData=typeof result=="object"?result:JSON.parse(result||"{}");if(!tokensData)throw new Error("Failed to retrieve OAuth tokens from vault. Please authenticate ...");const primaryToken=tokensData.primary,secondaryToken=tokensData.secondary,type=tokensData.type;if(type==="oauth2"&&config2.data.oauthService!=="OAuth2 Client Credentials"&&(secondaryToken||console$o.warn("Warning: refresh_token is missing for OAuth2"),tokensData.expires_in||console$o.warn("Warning: expires_in is missing for OAuth2.")),config2.data.oauthService!=="OAuth2 Client Credentials"&&!primaryToken)throw new Error("Retrieved OAuth tokens do not exist, invalid OR incomplete. Please authenticate ...");const responseData={primaryToken,secondaryToken,type};return type==="oauth"?("consumerKey"in tokensData&&(responseData.consumerKey=tokensData.consumerKey),"consumerSecret"in tokensData&&(responseData.consumerSecret=tokensData.consumerSecret),responseData.team=tokensData.team):type==="oauth2"&&(responseData.tokenURL=tokensData.tokenURL,"clientID"in tokensData&&(responseData.clientID=tokensData.clientID),"clientSecret"in tokensData&&(responseData.clientSecret=tokensData.clientSecret),responseData.expiresIn=tokensData.expires_in??0,responseData.team=tokensData.team),{responseData,data:tokensData,keyId:tokenKey}}catch(error){throw new Error(`Failed to parse retrieved tokens: ${error}`)}}catch(error){throw console$o.error("Error retrieving OAuth tokens:",error),error}},handleOAuthHeaders=async(agent,config2,reqConfig,logger2,additionalParams={},rootUrl)=>{let headers={};const{responseData:oauthTokens,data,keyId}=await retrieveOAuthTokens(agent,config2);try{const keys=["consumerKey","consumerSecret","clientID","clientSecret"];let oAuthConfigString=JSON.stringify({consumerKey:config2.data.consumerKey,consumerSecret:config2.data.consumerSecret,clientID:config2.data.clientID,clientSecret:config2.data.clientSecret,tokenURL:config2.data.tokenURL});oAuthConfigString=await TemplateString(oAuthConfigString).parseTeamKeysAsync(oauthTokens.team||agent.teamId).asyncResult;const oAuthConfig=JSON.parse(oAuthConfigString);if(oAuthConfig.oauthService==="OAuth2 Client Credentials"){const accessToken=await getClientCredentialToken(data,logger2,keyId,oauthTokens,config2,agent);headers.Authorization=`Bearer ${accessToken}`}else if(oauthTokens.type==="oauth"){const oauthHeader=buildOAuth1Header(rootUrl,reqConfig.method,{consumerKey:oAuthConfig.consumerKey,consumerSecret:oAuthConfig.consumerSecret,token:oauthTokens.primaryToken,tokenSecret:oauthTokens.secondaryToken},additionalParams);headers={...reqConfig.headers,...oauthHeader},logger2.debug("OAuth1 access token check success.")}else if(oauthTokens.type==="oauth2"){const accessToken=await new AccessTokenManager(oAuthConfig.clientID,oAuthConfig.clientSecret,oauthTokens.secondaryToken,oAuthConfig.tokenURL,oauthTokens.expiresIn,oauthTokens.primaryToken,data,keyId,logger2,agent).getAccessToken();headers.Authorization=`Bearer ${accessToken}`}return headers}catch(error){throw logger2.error(`Access token check failed: ${error}`),error}};async function getClientCredentialToken(data,logger2,keyId,oauthTokens,config2,agent){const logAndThrowError=message=>{throw logger2.debug(message),new Error(message)};try{data=data[keyId]||{};const{clientID,clientSecret,tokenURL}=config2.data,currentTime=new Date().getTime();if(!oauthTokens.expiresIn||currentTime>=Number(oauthTokens.expiresIn)){(!clientID||!clientSecret||!tokenURL)&&logAndThrowError("Missing client_id, client_secret OR token_url");const params=new URLSearchParams({grant_type:"client_credentials",client_id:clientID,client_secret:clientSecret}),response=await axios.post(tokenURL,params.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded"}});console$o.log("Access token refreshed successfully."),logger2.debug("Access token refreshed successfully.");const newAccessToken=response.data.access_token,expiresInMilliseconds=response.data.expires_in*1e3,expirationTimestamp=currentTime+expiresInMilliseconds;return Object.keys(data).length===0&&(data={primary:"",secondary:"",type:"oauth2",tokenURL,expires_in:"",team:agent.teamId,oauth_info:{oauth_keys_prefix:`OAUTH_${config2.componentId??config2.id}`,service:"oauth2_client_credentials",tokenURL,clientID,clientSecret}}),data.primary=newAccessToken,data.expires_in=expirationTimestamp.toString(),await managedVault.user(AccessCandidate.agent(agent.id)).set(keyId,data),newAccessToken}else return console$o.log("Access token value is still valid."),logger2.debug("Access token value is still valid."),oauthTokens.primaryToken}catch(error){logAndThrowError(`Failed to refresh access token: ${error}`)}}var __defProp$X=Object.defineProperty,__defNormalProp$X=(obj,key,value)=>key in obj?__defProp$X(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$X=(obj,key,value)=>__defNormalProp$X(obj,typeof key!="symbol"?key+"":key,value);class APICall extends Component{constructor(){super(),__publicField$X(this,"schema",{name:"APICall",description:"Use this component to make an API call",inputs:{},outputs:{Headers:{description:"The headers of the API call response",default:!0},Response:{description:"The response of the API call",default:!0}}}),__publicField$X(this,"configSchema",Joi.object({method:Joi.string().valid("GET","POST","PUT","PATCH","DELETE","HEAD","OPTIONS").required().label("Method"),url:Joi.string().max(8192).required().label("URL"),headers:Joi.any().allow("").label("Headers"),contentType:Joi.string().valid("none","application/json","multipart/form-data","binary","application/x-www-form-urlencoded","text/plain","application/xml").label("Content-Type"),body:Joi.any().allow("").label("Body"),_templateSettings:Joi.object().allow(null).label("Template Settings"),_templateVars:Joi.object().allow(null).label("Template Variables"),proxy:Joi.string().allow("").label("Proxy"),oauthService:Joi.string().allow("").label("OAuth Service"),scope:Joi.string().allow("").label("Scope"),authorizationURL:Joi.string().allow("").label("Authorization URL"),tokenURL:Joi.string().allow("").label("Token URL"),clientID:Joi.string().allow("").label("Client ID"),clientSecret:Joi.string().allow("").label("Client Secret"),oauth2CallbackURL:Joi.string().allow("").label("OAuth2 Callback URL"),callbackURL:Joi.string().allow("").label("Callback URL"),requestTokenURL:Joi.string().allow("").label("Request Token URL"),accessTokenURL:Joi.string().allow("").label("Access Token URL"),userAuthorizationURL:Joi.string().allow("").label("User Authorization URL"),consumerKey:Joi.string().allow("").label("Consumer Key"),consumerSecret:Joi.string().allow("").label("Consumer Secret"),oauth1CallbackURL:Joi.string().allow("").label("OAuth1 Callback URL"),authenticate:Joi.string().allow("").label("Authenticate")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);let publicUrls=[];try{logger2.debug("=== API Call Log ===");const method=config2?.data?.method||"get",reqConfig={};reqConfig.method=method,reqConfig.url=await parseUrl(input,config2,agent),{url:reqConfig.url,publicUrls}=await parseSmythFsUrl(reqConfig.url,agent);const{data,headers}=await parseData(input,config2,agent);let dataForDebug;data&&(reqConfig.data=data,dataForDebug=await formatDataForDebug(data)),reqConfig.headers=(await parseHeaders(input,config2,agent)).concat({...headers});const proxyConfig=await parseProxy(input,config2,agent);if(proxyConfig)if(proxyConfig instanceof SocksProxyAgent){const isSecureEndpoint=reqConfig.url?.startsWith("https://");reqConfig[isSecureEndpoint?"httpsAgent":"httpAgent"]=proxyConfig}else reqConfig.proxy=proxyConfig;let Response={},Headers={},_error;try{if(config2?.data?.oauthService&&config2?.data?.oauthService!=="None"){const rootUrl=new URL(reqConfig.url).origin,additionalParams=extractAdditionalParamsForOAuth1(reqConfig),oauthHeaders=await handleOAuthHeaders(agent,config2,reqConfig,logger2,additionalParams,rootUrl);reqConfig.headers=reqConfig.headers.concat({...oauthHeaders})}reqConfig.responseType="arraybuffer",logger2.debug("Making API call",{...reqConfig,data:dataForDebug});const response=await axios.request(reqConfig),parsedRes=await parseArrayBufferResponse(response,agent);logger2.debug("API call Response Headers",response.headers),Response=parsedRes,logger2.debug(`API call Response
|
|
@@ -177,13 +177,13 @@ ${_error}
|
|
|
177
177
|
${error?.message||JSON.stringify(error)}`,_debug:logger2.output}}}}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 OpenAPI extends Component{constructor(){super(),__publicField$L(this,"configSchema",Joi.object({model:Joi.string().optional(),openAiModel:Joi.string().optional(),specUrl:Joi.string().max(2048).uri().required().description("URL of the OpenAPI specification"),descForModel:Joi.string().max(5e3).required().allow("").label("Description for Model"),name:Joi.string().max(500).required().allow(""),desc:Joi.string().max(5e3).required().allow("").label("Description"),logoUrl:Joi.string().max(8192).allow(""),id:Joi.string().max(200),version:Joi.string().max(100).allow(""),domain:Joi.string().max(253).allow("")}))}init(){}async process(input,config2,agent){await super.process(input,config2,agent);const logger2=this.createComponentLogger(agent,config2);logger2.debug("=== Open API Log ===");try{const specUrl=config2?.data?.specUrl;if(!specUrl)return{_error:"Please provide a Open API Specification URL!",_debug:logger2.output};const model=config2?.data?.model||config2?.data?.openAiModel,descForModel=TemplateString(config2?.data?.descForModel).parse(input).result;let prompt="";if(input?.Prompt?prompt=typeof input?.Prompt=="string"?input?.Prompt:JSON.stringify(input?.Prompt):input?.Query&&(prompt=typeof input?.Query=="string"?input?.Query:JSON.stringify(input?.Query)),!prompt)return{_error:"Please provide a prompt",_debug:logger2.output};const result=await new Conversation(model,specUrl,{systemPrompt:descForModel,agentId:agent?.id}).prompt(prompt);return logger2.debug(`Response:
|
|
178
178
|
`,result,`
|
|
179
179
|
`),{Output:result,_debug:logger2.output}}catch(error){return console.error("Error on running Open API: ",error),{_error:`Error on running Open API!
|
|
180
|
-
${error?.message||JSON.stringify(error)}`,_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},ComponentInstances=components,console$n=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$n.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$n.log(`Added ${nonExistingNewRules.length} new lifecycle rules to bucket: ${bucketName}`)}else console$n.log("Lifecycle configuration already exists")}catch(error){if(error.code==="NoSuchLifecycleConfiguration"){console$n.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$n.log("Lifecycle configuration created successfully.")}else console$n.error("Error checking lifecycle configuration:",error),console$n.error("Bucket name provided:",bucketName),console$n.error("Error details:",{name:error.name,message:error.message,code:error.code})}}var __defProp$K=Object.defineProperty,__getOwnPropDesc$j=Object.getOwnPropertyDescriptor,__defNormalProp$K=(obj,key,value)=>key in obj?__defProp$K(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$K(target,key,result),result},__publicField$K=(obj,key,value)=>__defNormalProp$K(obj,typeof key!="symbol"?key+"":key,value);Object.defineProperty(global,"crypto",{value:{getRandomValues:arr=>crypto$1.randomBytes(arr.length)}});const console$m=Logger("S3Storage");class S3Storage extends StorageConnector{constructor(_settings){if(super(_settings),this._settings=_settings,__publicField$K(this,"name","S3Storage"),__publicField$K(this,"client"),__publicField$K(this,"bucket"),__publicField$K(this,"isInitialized",!1),__publicField$K(this,"initializationPromise",null),!_settings.bucket||_settings.bucket.trim()===""){console$m.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$m.warn("S3 client not initialized");return}if(!this.isInitialized)try{await checkAndInstallLifecycleRules(this.bucket,this.client),this.isInitialized=!0}catch(error){throw console$m.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$m.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$m.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$m.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$m.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$m.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$m.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$m.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$m.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$m.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$m.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$J=Object.defineProperty,__getOwnPropDesc$i=Object.getOwnPropertyDescriptor,__defNormalProp$J=(obj,key,value)=>key in obj?__defProp$J(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$J(target,key,result),result},__publicField$J=(obj,key,value)=>__defNormalProp$J(obj,typeof key!="symbol"?key+"":key,value);const console$l=Logger("LocalStorage");class LocalStorage extends StorageConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$J(this,"name","LocalStorage"),__publicField$J(this,"folder"),__publicField$J(this,"storagePrefix","local"),__publicField$J(this,"metadataPrefix",".local.metadata"),__publicField$J(this,"isInitialized",!1),this.folder=this.findStorageFolder(_settings?.folder),this.initialize(),fs__default.existsSync(this.folder)||console$l.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$l.warn("Using alternative storage folder found in : ",_storageFolder),_storageFolder):(console$l.warn("!!! All attempts to find an existing storage folder failed !!!"),console$l.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$l.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$l.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$l.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$l.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$l.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$l.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$l.error("Error setting access rights in local storage",error),error}}async expire(acRequest,resourceId,ttl){console$l.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.None]:[modelInfo.credentials];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$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 console$k=Logger("LLMConnector");class LLMStream extends Readable{constructor(options){super(options),__publicField$I(this,"dataQueue"),__publicField$I(this,"toolsData"),__publicField$I(this,"hasData"),__publicField$I(this,"isReading"),this.dataQueue=[],this.toolsData=[],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$I(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$k.warn(`Vault Connector unavailable for ${candidate.id} `),{request:async params=>{const preparedParams=await this.prepareParams(candidate,params);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}})},streamRequest:async params=>{const preparedParams=await this.prepareParams(candidate,params),requestParams={acRequest:candidate.readRequest,body:preparedParams.body,context:{modelEntryName:preparedParams.modelEntryName,agentId:preparedParams.agentId,teamId:preparedParams.teamId,isUserKey:preparedParams.isUserKey,hasFiles:preparedParams.files?.length>0,modelInfo:preparedParams.modelInfo,credentials:preparedParams.credentials}};let response;return preparedParams.capabilities?.search===!0&&preparedParams.useWebSearch===!0&&preparedParams.modelInfo.provider==="OpenAI"?response=await this.webSearchRequest(requestParams):response=await this.streamRequest(requestParams),response},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.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.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+=`
|
|
180
|
+
${error?.message||JSON.stringify(error)}`,_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},ComponentInstances=components,console$n=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$n.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$n.log(`Added ${nonExistingNewRules.length} new lifecycle rules to bucket: ${bucketName}`)}else console$n.log("Lifecycle configuration already exists")}catch(error){if(error.code==="NoSuchLifecycleConfiguration"){console$n.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$n.log("Lifecycle configuration created successfully.")}else console$n.error("Error checking lifecycle configuration:",error),console$n.error("Bucket name provided:",bucketName),console$n.error("Error details:",{name:error.name,message:error.message,code:error.code})}}var __defProp$K=Object.defineProperty,__getOwnPropDesc$j=Object.getOwnPropertyDescriptor,__defNormalProp$K=(obj,key,value)=>key in obj?__defProp$K(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$K(target,key,result),result},__publicField$K=(obj,key,value)=>__defNormalProp$K(obj,typeof key!="symbol"?key+"":key,value);Object.defineProperty(global,"crypto",{value:{getRandomValues:arr=>crypto$1.randomBytes(arr.length)}});const console$m=Logger("S3Storage");class S3Storage extends StorageConnector{constructor(_settings){if(super(_settings),this._settings=_settings,__publicField$K(this,"name","S3Storage"),__publicField$K(this,"client"),__publicField$K(this,"bucket"),__publicField$K(this,"isInitialized",!1),__publicField$K(this,"initializationPromise",null),!_settings.bucket||_settings.bucket.trim()===""){console$m.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$m.warn("S3 client not initialized");return}if(!this.isInitialized)try{await checkAndInstallLifecycleRules(this.bucket,this.client),this.isInitialized=!0}catch(error){throw console$m.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$m.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$m.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$m.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$m.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$m.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$m.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$m.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$m.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$m.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$m.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$J=Object.defineProperty,__getOwnPropDesc$i=Object.getOwnPropertyDescriptor,__defNormalProp$J=(obj,key,value)=>key in obj?__defProp$J(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$J(target,key,result),result},__publicField$J=(obj,key,value)=>__defNormalProp$J(obj,typeof key!="symbol"?key+"":key,value);const console$l=Logger("LocalStorage");class LocalStorage extends StorageConnector{constructor(_settings){super(_settings),this._settings=_settings,__publicField$J(this,"name","LocalStorage"),__publicField$J(this,"folder"),__publicField$J(this,"storagePrefix","local"),__publicField$J(this,"metadataPrefix",".local.metadata"),__publicField$J(this,"isInitialized",!1),this.folder=this.findStorageFolder(_settings?.folder),this.initialize(),fs__default.existsSync(this.folder)||console$l.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$l.warn("Using alternative storage folder found in : ",_storageFolder),_storageFolder):(console$l.warn("!!! All attempts to find an existing storage folder failed !!!"),console$l.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$l.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$l.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$l.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$l.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$l.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$l.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$l.error("Error setting access rights in local storage",error),error}}async expire(acRequest,resourceId,ttl){console$l.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.None]:[modelInfo.credentials];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$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 console$k=Logger("LLMConnector");class LLMStream extends Readable{constructor(options){super(options),__publicField$I(this,"dataQueue"),__publicField$I(this,"toolsData"),__publicField$I(this,"hasData"),__publicField$I(this,"isReading"),this.dataQueue=[],this.toolsData=[],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$I(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$k.warn(`Vault Connector unavailable for ${candidate.id} `),{request:async params=>{const preparedParams=await this.prepareParams(candidate,params);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}})},streamRequest:async params=>{const preparedParams=await this.prepareParams(candidate,params),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}};let response;return preparedParams.capabilities?.search===!0&&preparedParams.useWebSearch===!0&&preparedParams.modelInfo.provider==="OpenAI"?response=await this.webSearchRequest(requestParams):response=await this.streamRequest(requestParams),response},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+=`
|
|
181
181
|
##
|
|
182
182
|
Expected output format = `+JSON.stringify(outputFormat)+`
|
|
183
|
-
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"}){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]);await modelProviderCandidate.isStandardLLM(model),await modelProviderCandidate.getProvider(model),_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.agentId=candidate.id;const body=await this.reqBodyAdapter(_params);return{..._params,body}}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$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,key+"",value);class EchoConnector extends LLMConnector{constructor(){super(...arguments),__publicField$H(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 webSearchRequest({acRequest,body,context}){throw new Error("Web search is not supported for Echo")}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=>item.type==="text"),textTokens=encode(textObj?.[0]?.text).length,images=prompt?.filter(item=>item.type==="image_url");let imageTokens=0;for(const image of images){const imageUrl=image?.image_url?.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;const maxDimension=Math.max(width,height),minDimension=Math.min(width,height);let scaledMinDimension=minDimension;maxDimension>2048&&(scaledMinDimension=2048/maxDimension*minDimension),scaledMinDimension=Math.floor(768/1024*scaledMinDimension);let tileSize=512,tiles=Math.ceil(scaledMinDimension/tileSize);return minDimension!==scaledMinDimension&&(tiles*=Math.ceil(scaledMinDimension*(maxDimension/minDimension)/tileSize)),tiles*170+85}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$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_WITH_JSON_RESPONSE=["gpt-4.5-preview","gpt-4o-2024-08-06","gpt-4o-mini-2024-07-18","gpt-4-turbo","gpt-3.5-turbo"],costForNormalModels={low:30/1e3,medium:35/1e3,high:50/1e3},costForMiniModels={low:25/1e3,medium:27.5/1e3,high:30/1e3},SEARCH_TOOL={type:"web_search_preview",cost:{"gpt-4.1":costForNormalModels,"gpt-4o":costForNormalModels,"gpt-4o-search":costForNormalModels,"gpt-4.1-mini":costForMiniModels,"gpt-4o-mini":costForMiniModels,"gpt-4o-mini-search":costForMiniModels}};class OpenAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$G(this,"name","LLM:OpenAI"),__publicField$G(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.image),__publicField$G(this,"validDocumentMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.document)}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;try{const openai=await this.getClient(context),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 result=await openai.chat.completions.create(_body),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}}catch(error){throw error}}async streamRequest({acRequest,body,context}){const _body=body,emitter=new EventEmitter$1,usage_data=[],reportedUsage=[];try{const openai=await this.getClient(context),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});let finishReason="stop";const stream=await openai.chat.completions.create({..._body,stream:!0,stream_options:{include_usage:!0}});return(async()=>{let delta={},toolsData=[];for await(const part of stream){delta=part.choices[0]?.delta;const usage=part.usage;if(usage&&usage_data.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]={index,role:"tool",id:(toolsData?.[index]?.id||"")+(toolCall?.id||""),type:(toolsData?.[index]?.type||"")+(toolCall?.type||""),name:(toolsData?.[index]?.name||"")+(toolCall?.function?.name||""),arguments:(toolsData?.[index]?.arguments||"")+(toolCall?.function?.arguments||"")};continue}part.choices[0]?.finish_reason&&(finishReason=part.choices[0]?.finish_reason)}if(toolsData?.length>0){for(let tool of toolsData)tool.type.includes("functionfunction")&&(tool.type="function");emitter.emit(TLLMEvent.ToolInfo,toolsData)}usage_data.forEach(usage=>{const _reported=this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId});reportedUsage.push(_reported)}),finishReason!=="stop"&&emitter.emit("interrupted",finishReason),setTimeout(()=>{emitter.emit("end",toolsData,reportedUsage,finishReason)},100)})(),emitter}catch(error){throw error}}async webSearchRequest({acRequest,body,context}){const _body=body,emitter=new EventEmitter$1,usage_data=[],reportedUsage=[];try{const openai=await this.getClient(context);let finishReason="stop";const stream=await openai.responses.create(_body);return(async()=>{let toolsData=[],currentToolCall=null;for await(const part of stream){if("type"in part)switch(part.type){case"response.output_text.delta":{if(part?.delta){const deltaMsg={role:"assistant",content:part.delta};emitter.emit("data",deltaMsg),emitter.emit("content",part.delta,"assistant")}break}default:break}"response"in part&&part.response?.usage&&usage_data.push(part.response.usage)}const modelName=context.modelEntryName?.replace(BUILT_IN_MODEL_PREFIX,""),searchTool=_body.tools?.[0],cost=SEARCH_TOOL.cost?.[modelName]?.[searchTool?.search_context_size]||0;this.reportUsage({cost,completion_tokens:0,prompt_tokens:0,total_tokens:0},{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}),finishReason!=="stop"&&emitter.emit("interrupted",finishReason),setTimeout(()=>{emitter.emit("end",toolsData,reportedUsage,finishReason)},100)})(),emitter}catch(error){throw error}}async imageGenRequest({acRequest,body,context}){try{return await(await this.getClient(context)).images.generate(body)}catch(error){throw error}}async imageEditRequest({acRequest,body,context}){const _body=body;try{return await(await this.getClient(context)).images.edit(_body)}catch(error){throw error}}async processImageData(files,agentId){const validSources=this.getValidImageFiles(files);return validSources.length===0?[]:await this.getImageData(validSources,agentId)}getValidDocumentFiles(files){const validSources=[];for(let file of files)this.validDocumentMimeTypes.includes(file?.mimetype)&&validSources.push(file);return validSources}async processDocumentData(files,agentId){const validSources=this.getValidDocumentFiles(files);return validSources.length===0?[]:await this.getDocumentData(validSources,agentId)}async reqBodyAdapter(params){return params?.useWebSearch&¶ms.capabilities?.search===!0?this.prepareBodyForWebSearchRequest(params):params.capabilities?.imageGeneration===!0?params?.files?.length>0?this.prepareBodyForImageEditRequest(params):this.prepareBodyForImageGenRequest(params):(params.capabilities?.imageEditing,this.prepareBody(params))}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}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||"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})}getValidImageFiles(files){const validSources=[];for(let file of files)this.validImageMimeTypes.includes(file?.mimetype)&&validSources.push(file);return validSources}async getImageData(files,agentId){try{const imageData=[];for(let file of files){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}catch(error){throw error}}async getDocumentData(files,agentId){try{const documentData=[];for(let file of files){const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),fileData=`data:${file.mimetype};base64,${base64Data}`;documentData.push({type:"file",file:{file_data:fileData,filename:await file.getName()}})}return documentData}catch(error){throw error}}getWebSearchTool(params){const searchCity=params?.webSearchCity,searchCountry=params?.webSearchCountry,searchRegion=params?.webSearchRegion,searchTimezone=params?.webSearchTimezone,location={type:"approximate"};searchCity&&(location.city=searchCity),searchCountry&&(location.country=searchCountry),searchRegion&&(location.region=searchRegion),searchTimezone&&(location.timezone=searchTimezone);const searchTool={type:SEARCH_TOOL.type,search_context_size:params?.webSearchContextSize||"medium"};return Object.keys(location).length>1&&(searchTool.user_location=location),searchTool}async validateTokenLimit({acRequest,maxTokens,promptTokens,context}){await(await this.getProvider(acRequest,context.modelEntryName)).validateTokensLimit({model:context.modelEntryName,promptTokens,completionTokens:maxTokens,hasAPIKey:context.isUserKey})}async getProvider(acRequest,modelEntryName){return ConnectorService.getModelsProviderConnector().requester(acRequest.candidate)}async prepareBodyForWebSearchRequest(params){const body={model:params.model,input:params.messages,stream:!0};params?.max_output_tokens!==void 0&&(body.max_output_tokens=params.max_output_tokens);const searchTool=this.getWebSearchTool(params);return body.tools=[searchTool],params?.toolsConfig?.tool_choice&&(body.tool_choice=params.toolsConfig.tool_choice),body}async prepareBodyForImageGenRequest(params){const{model,size,quality,n,responseFormat,style}=params,body={prompt:params.prompt,model,size,n:n||1};return quality&&(body.quality=quality),responseFormat&&(body.response_format=responseFormat),style&&(body.style=style),body}async prepareBodyForImageEditRequest(params){const{model,size,n,responseFormat}=params,body={prompt:params.prompt,model,size,n:n||1,image:null};responseFormat&&(body.response_format=responseFormat);const 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}return body}async prepareBody(params){const messages=await this.prepareMessages(params);(params?.responseFormat||"")==="json"&&(messages?.[0]?.role===TLLMMessageRole.System?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:TLLMMessageRole.System,content:JSON_RESPONSE_INSTRUCTION}),MODELS_WITH_JSON_RESPONSE.includes(params.model)?params.responseFormat={type:"json_object"}:params.responseFormat=void 0);const body={model:params.model,messages};return params?.toolsConfig?.tools&¶ms?.toolsConfig?.tools?.length>0&&(body.tools=params?.toolsConfig?.tools),params?.toolsConfig?.tool_choice&&(body.tool_choice=params?.toolsConfig?.tool_choice),params?.maxTokens!==void 0&&(body.max_completion_tokens=params.maxTokens),params?.temperature!==void 0&&(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&&(body.presence_penalty=params.presencePenalty),params?.responseFormat&&(body.response_format=params.responseFormat),params?.stopSequences?.length&&(body.stop=params.stopSequences),body}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 validImageFiles=this.getValidImageFiles(_files),validDocumentFiles=this.getValidDocumentFiles(_files),imageData=validImageFiles.length>0?await this.processImageData(validImageFiles,params.agentId):[],documentData=validDocumentFiles.length>0?await this.processDocumentData(validDocumentFiles,params.agentId):[],promptData=[{type:"text",text:(Array.isArray(messages)?messages.pop():{})?.content||""||""},...imageData,...documentData];messages.push({role:"user",content:promptData})}return messages}}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 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$F(this,"name","LLM:GoogleAI"),__publicField$F(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,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 webSearchRequest({acRequest,body,context}){throw new Error("Web search is not supported for Google AI")}async reqBodyAdapter(params){const model=params?.model,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.Function,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}
|
|
183
|
+
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"}){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]);await modelProviderCandidate.isStandardLLM(model),await modelProviderCandidate.getProvider(model),_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.agentId=candidate.id;const body=await this.reqBodyAdapter(_params);return{..._params,body}}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$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,key+"",value);class EchoConnector extends LLMConnector{constructor(){super(...arguments),__publicField$H(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 webSearchRequest({acRequest,body,context}){throw new Error("Web search is not supported for Echo")}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=>item.type==="text"),textTokens=encode(textObj?.[0]?.text).length,images=prompt?.filter(item=>item.type==="image_url");let imageTokens=0;for(const image of images){const imageUrl=image?.image_url?.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;const maxDimension=Math.max(width,height),minDimension=Math.min(width,height);let scaledMinDimension=minDimension;maxDimension>2048&&(scaledMinDimension=2048/maxDimension*minDimension),scaledMinDimension=Math.floor(768/1024*scaledMinDimension);let tileSize=512,tiles=Math.ceil(scaledMinDimension/tileSize);return minDimension!==scaledMinDimension&&(tiles*=Math.ceil(scaledMinDimension*(maxDimension/minDimension)/tileSize)),tiles*170+85}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$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_WITH_JSON_RESPONSE=["gpt-4.5-preview","gpt-4o-2024-08-06","gpt-4o-mini-2024-07-18","gpt-4-turbo","gpt-3.5-turbo"],costForNormalModels={low:30/1e3,medium:35/1e3,high:50/1e3},costForMiniModels={low:25/1e3,medium:27.5/1e3,high:30/1e3},SEARCH_TOOL={type:"web_search_preview",cost:{"gpt-4.1":costForNormalModels,"gpt-4o":costForNormalModels,"gpt-4o-search":costForNormalModels,"gpt-4.1-mini":costForMiniModels,"gpt-4o-mini":costForMiniModels,"gpt-4o-mini-search":costForMiniModels}};class OpenAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$G(this,"name","LLM:OpenAI"),__publicField$G(this,"validImageMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.image),__publicField$G(this,"validDocumentMimeTypes",SUPPORTED_MIME_TYPES_MAP.OpenAI.document)}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;try{const openai=await this.getClient(context),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 result=await openai.chat.completions.create(_body),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}}catch(error){throw error}}async streamRequest({acRequest,body,context}){const _body=body,emitter=new EventEmitter$1,usage_data=[],reportedUsage=[];try{const openai=await this.getClient(context),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});let finishReason="stop";const stream=await openai.chat.completions.create({..._body,stream:!0,stream_options:{include_usage:!0}});return(async()=>{let delta={},toolsData=[];for await(const part of stream){delta=part.choices[0]?.delta;const usage=part.usage;if(usage&&usage_data.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]={index,role:"tool",id:(toolsData?.[index]?.id||"")+(toolCall?.id||""),type:(toolsData?.[index]?.type||"")+(toolCall?.type||""),name:(toolsData?.[index]?.name||"")+(toolCall?.function?.name||""),arguments:(toolsData?.[index]?.arguments||"")+(toolCall?.function?.arguments||"")};continue}part.choices[0]?.finish_reason&&(finishReason=part.choices[0]?.finish_reason)}if(toolsData?.length>0){for(let tool of toolsData)tool.type.includes("functionfunction")&&(tool.type="function");emitter.emit(TLLMEvent.ToolInfo,toolsData)}usage_data.forEach(usage=>{const _reported=this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId});reportedUsage.push(_reported)}),finishReason!=="stop"&&emitter.emit("interrupted",finishReason),setTimeout(()=>{emitter.emit("end",toolsData,reportedUsage,finishReason)},100)})(),emitter}catch(error){throw error}}async webSearchRequest({acRequest,body,context}){const _body=body,emitter=new EventEmitter$1,usage_data=[],reportedUsage=[];try{const openai=await this.getClient(context);let finishReason="stop";const stream=await openai.responses.create(_body);return(async()=>{let toolsData=[],currentToolCall=null;for await(const part of stream){if("type"in part)switch(part.type){case"response.output_text.delta":{if(part?.delta){const deltaMsg={role:"assistant",content:part.delta};emitter.emit("data",deltaMsg),emitter.emit("content",part.delta,"assistant")}break}default:break}"response"in part&&part.response?.usage&&usage_data.push(part.response.usage)}const modelName=context.modelEntryName?.replace(BUILT_IN_MODEL_PREFIX,""),searchTool=_body.tools?.[0],cost=SEARCH_TOOL.cost?.[modelName]?.[searchTool?.search_context_size]||0;this.reportUsage({cost,completion_tokens:0,prompt_tokens:0,total_tokens:0},{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}),finishReason!=="stop"&&emitter.emit("interrupted",finishReason),setTimeout(()=>{emitter.emit("end",toolsData,reportedUsage,finishReason)},100)})(),emitter}catch(error){throw error}}async imageGenRequest({acRequest,body,context}){try{return await(await this.getClient(context)).images.generate(body)}catch(error){throw error}}async imageEditRequest({acRequest,body,context}){const _body=body;try{return await(await this.getClient(context)).images.edit(_body)}catch(error){throw error}}async processImageData(files,agentId){const validSources=this.getValidImageFiles(files);return validSources.length===0?[]:await this.getImageData(validSources,agentId)}getValidDocumentFiles(files){const validSources=[];for(let file of files)this.validDocumentMimeTypes.includes(file?.mimetype)&&validSources.push(file);return validSources}async processDocumentData(files,agentId){const validSources=this.getValidDocumentFiles(files);return validSources.length===0?[]:await this.getDocumentData(validSources,agentId)}async reqBodyAdapter(params){return params?.useWebSearch&¶ms.capabilities?.search===!0?this.prepareBodyForWebSearchRequest(params):params.capabilities?.imageGeneration===!0?params?.files?.length>0?this.prepareBodyForImageEditRequest(params):this.prepareBodyForImageGenRequest(params):(params.capabilities?.imageEditing,this.prepareBody(params))}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}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||"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})}getValidImageFiles(files){const validSources=[];for(let file of files)this.validImageMimeTypes.includes(file?.mimetype)&&validSources.push(file);return validSources}async getImageData(files,agentId){try{const imageData=[];for(let file of files){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}catch(error){throw error}}async getDocumentData(files,agentId){try{const documentData=[];for(let file of files){const base64Data=(await file.readData(AccessCandidate.agent(agentId))).toString("base64"),fileData=`data:${file.mimetype};base64,${base64Data}`;documentData.push({type:"file",file:{file_data:fileData,filename:await file.getName()}})}return documentData}catch(error){throw error}}getWebSearchTool(params){const searchCity=params?.webSearchCity,searchCountry=params?.webSearchCountry,searchRegion=params?.webSearchRegion,searchTimezone=params?.webSearchTimezone,location={type:"approximate"};searchCity&&(location.city=searchCity),searchCountry&&(location.country=searchCountry),searchRegion&&(location.region=searchRegion),searchTimezone&&(location.timezone=searchTimezone);const searchTool={type:SEARCH_TOOL.type,search_context_size:params?.webSearchContextSize||"medium"};return Object.keys(location).length>1&&(searchTool.user_location=location),searchTool}async validateTokenLimit({acRequest,maxTokens,promptTokens,context}){await(await this.getProvider(acRequest,context.modelEntryName)).validateTokensLimit({model:context.modelEntryName,promptTokens,completionTokens:maxTokens,hasAPIKey:context.isUserKey})}async getProvider(acRequest,modelEntryName){return ConnectorService.getModelsProviderConnector().requester(acRequest.candidate)}async prepareBodyForWebSearchRequest(params){const body={model:params.model,input:params.messages,stream:!0};params?.max_output_tokens!==void 0&&(body.max_output_tokens=params.max_output_tokens);const searchTool=this.getWebSearchTool(params);return body.tools=[searchTool],params?.toolsConfig?.tool_choice&&(body.tool_choice=params.toolsConfig.tool_choice),body}async prepareBodyForImageGenRequest(params){const{model,size,quality,n,responseFormat,style}=params,body={prompt:params.prompt,model,size,n:n||1};return quality&&(body.quality=quality),responseFormat&&(body.response_format=responseFormat),style&&(body.style=style),body}async prepareBodyForImageEditRequest(params){const{model,size,n,responseFormat}=params,body={prompt:params.prompt,model,size,n:n||1,image:null};responseFormat&&(body.response_format=responseFormat);const 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}return body}async prepareBody(params){const messages=await this.prepareMessages(params);(params?.responseFormat||"")==="json"&&(messages?.[0]?.role===TLLMMessageRole.System?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:TLLMMessageRole.System,content:JSON_RESPONSE_INSTRUCTION}),MODELS_WITH_JSON_RESPONSE.includes(params.model)?params.responseFormat={type:"json_object"}:params.responseFormat=void 0);const body={model:params.model,messages};return params?.toolsConfig?.tools&¶ms?.toolsConfig?.tools?.length>0&&(body.tools=params?.toolsConfig?.tools),params?.toolsConfig?.tool_choice&&(body.tool_choice=params?.toolsConfig?.tool_choice),params?.maxTokens!==void 0&&(body.max_completion_tokens=params.maxTokens),params?.temperature!==void 0&&(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&&(body.presence_penalty=params.presencePenalty),params?.responseFormat&&(body.response_format=params.responseFormat),params?.stopSequences?.length&&(body.stop=params.stopSequences),body}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 validImageFiles=this.getValidImageFiles(_files),validDocumentFiles=this.getValidDocumentFiles(_files),imageData=validImageFiles.length>0?await this.processImageData(validImageFiles,params.agentId):[],documentData=validDocumentFiles.length>0?await this.processDocumentData(validDocumentFiles,params.agentId):[],promptData=[{type:"text",text:(Array.isArray(messages)?messages.pop():{})?.content||""||""},...imageData,...documentData];messages.push({role:"user",content:promptData})}return messages}}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 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$F(this,"name","LLM:GoogleAI"),__publicField$F(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,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 webSearchRequest({acRequest,body,context}){throw new Error("Web search is not supported for Google AI")}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.Function,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}
|
|
184
184
|
${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};return systemInstruction&&(toolsPrompt.systemInstruction=systemInstruction),params?.toolsConfig?.tools&&(toolsPrompt.tools=params?.toolsConfig?.tools),params?.toolsConfig?.tool_choice&&(toolsPrompt.toolConfig={functionCallingConfig:{mode:params?.toolsConfig?.tool_choice||"auto"}}),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(`
|
|
185
185
|
`)),MODELS_SUPPORT_SYSTEM_INSTRUCTION.includes(model)||(prompt=`${prompt}
|
|
186
|
-
${systemInstruction}`),prompt}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$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,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$E(this,"name","LLM:Anthropic"),__publicField$E(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 webSearchRequest({acRequest,body,context}){throw new Error("Web search requests are not supported by Anthropic")}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}params?.temperature!==void 0&&(body.temperature=params.temperature),params?.topP!==void 0&&(body.top_p=params.topP),params?.topK!==void 0&&(body.top_k=params.topK),params?.stopSequences?.length&&(body.stop_sequences=params.stopSequences),params?.toolsConfig?.tools&¶ms?.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&¶ms.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$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 GroqConnector extends LLMConnector{constructor(){super(...arguments),__publicField$D(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}){try{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}}catch(error){throw error}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1,usage_data=[];try{const 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}catch(error){throw error}}async webSearchRequest({acRequest,body,context}){throw new Error("Web search is not supported for Groq")}async reqBodyAdapter(params){const messages=params?.messages||[],body={model:params.model,messages};return(params?.responseFormat||"")==="json"&&(messages?.[0]?.role==="system"?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:"system",content:JSON_RESPONSE_INSTRUCTION})),params.maxTokens!==void 0&&(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),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}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})}}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 BedrockConnector extends LLMConnector{constructor(){super(...arguments),__publicField$C(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&¤tMessage.currentToolCall&&(currentMessage.currentToolInput+=chunk.contentBlockDelta.delta.toolUse.input,currentMessage.currentToolCall.arguments=currentMessage.currentToolInput),chunk.contentBlockStop&¤tMessage.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 webSearchRequest({acRequest,body,context}){throw new Error("Web search is not supported for Bedrock")}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$B=Object.defineProperty,__defNormalProp$B=(obj,key,value)=>key in obj?__defProp$B(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$B=(obj,key,value)=>__defNormalProp$B(obj,key+"",value);class VertexAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$B(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,googleAuthOptions:{credentials}})}async request({acRequest,body,context}){const messages=body.messages;delete body.messages;try{const result=await(await this.getClient(context)).getGenerativeModel(body).generateContent({contents:messages}),content=result?.response?.candidates?.[0]?.content?.parts?.[0]?.text,usage=result?.response?.usageMetadata;return this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}),{content,finishReason:"stop",useTool:!1,toolsData:[],message:{content,role:"assistant"},usage}}catch(error){throw error}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1;return setTimeout(()=>{try{this.request({acRequest,body,context}).then(response=>{const finishReason=response.finishReason,usage=response.usage;emitter.emit("interrupted",finishReason),emitter.emit("content",response.content),emitter.emit("end",void 0,usage,finishReason)}).catch(error=>{emitter.emit("error",error.message||error.toString())})}catch(error){emitter.emit("error",error.message||error.toString())}},100),emitter}async webSearchRequest({acRequest,body,context}){throw new Error("Web search is not supported for Vertex AI")}async reqBodyAdapter(params){let messages=params?.messages||[],systemInstruction;const{systemMessage,otherMessages}=LLMHelper.separateSystemMessages(messages);"content"in systemMessage&&(systemInstruction=systemMessage.content),messages=otherMessages,(params?.responseFormat||"")==="json"&&(systemInstruction=JSON_RESPONSE_INSTRUCTION);const modelInfo=params.modelInfo;let body={model:modelInfo?.settings?.customModel||modelInfo?.settings?.foundationModel,messages};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),systemInstruction&&(body.systemInstruction=systemInstruction),Object.keys(config2).length>0&&(body.generationConfig=config2),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage.promptTokenCount||0,output_tokens:usage.candidatesTokenCount||0,input_tokens_cache_read:usage.cachedContentTokenCount||0,input_tokens_cache_write:0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){throw new Error("Tool configuration is not currently implemented for Vertex AI")}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{let textBlock=[];return message?.parts?textBlock=message.parts:message?.content&&(textBlock=Array.isArray(message.content)?message.content:[{text:message.content}]),{role:message.role,parts:textBlock}})}}var __defProp$A=Object.defineProperty,__defNormalProp$A=(obj,key,value)=>key in obj?__defProp$A(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$A=(obj,key,value)=>__defNormalProp$A(obj,key+"",value);class PerplexityConnector extends LLMConnector{constructor(){super(...arguments),__publicField$A(this,"name","LLM:Perplexity")}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Perplexity");return axios.create({baseURL:params?.modelInfo?.baseURL,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":"application/json"}})}async request({acRequest,body,context}){try{const response=await(await this.getClient(context)).post("/chat/completions",body),content=response?.data?.choices?.[0]?.message.content,finishReason=response?.data?.choices?.[0]?.finish_reason,usage=response?.data?.usage;return this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}),{content,finishReason,useTool:!1,toolsData:[],message:{content,role:"assistant"},usage}}catch(error){throw error}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1;return setTimeout(()=>{try{this.request({acRequest,body,context}).then(respose=>{const finishReason=respose.finishReason,usage=respose.usage;emitter.emit("interrupted",finishReason),emitter.emit("content",respose.content),emitter.emit("end",void 0,usage,finishReason)}).catch(error=>{emitter.emit("error",error.message||error.toString())})}catch(error){emitter.emit("error",error.message||error.toString())}},100),emitter}async webSearchRequest({acRequest,body,context}){throw new Error("Web search is not supported for Perplexity")}async reqBodyAdapter(params){const messages=params?.messages||[];(params?.responseFormat||"")==="json"&&(messages?.[0]?.role===TLLMMessageRole.System?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:TLLMMessageRole.System,content:JSON_RESPONSE_INSTRUCTION}),delete params.responseFormat);const body={model:params.model,messages};return params?.maxTokens!==void 0&&(body.max_tokens=params.maxTokens),params?.temperature!==void 0&&(body.temperature=params.temperature),params?.topP!==void 0&&(body.top_p=params.topP),params?.topK!==void 0&&(body.top_k=params.topK),params?.frequencyPenalty&&(body.frequency_penalty=params.frequencyPenalty),params?.presencePenalty!==void 0&&(body.presence_penalty=params.presencePenalty),params.responseFormat&&(body.response_format=params.responseFormat),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,reasoning_tokens:usage?.reasoning_tokens||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{type:"function",function:{name,description,parameters:{type:"object",properties,required:requiredFields}}}})),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})}}var __defProp$z=Object.defineProperty,__defNormalProp$z=(obj,key,value)=>key in obj?__defProp$z(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$z=(obj,key,value)=>__defNormalProp$z(obj,key+"",value);class xAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$z(this,"name","LLM:Grok")}async getClient(params){const apiKey=params.credentials?.apiKey,baseURL=params?.modelInfo?.baseURL||"https://api.x.ai/v1";if(!apiKey)throw new Error("Please provide an API key for Grok");return axios.create({baseURL,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":"application/json"}})}async request({acRequest,body,context}){try{const response=await(await this.getClient(context)).post("/chat/completions",body),message=response?.data?.choices?.[0]?.message,finishReason=response?.data?.choices?.[0]?.finish_reason,usage=response?.data?.usage,citations=response?.data?.citations;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);let content=message?.content??"";if(citations&&citations.length>0){const citationsText=`
|
|
186
|
+
${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$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,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$E(this,"name","LLM:Anthropic"),__publicField$E(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 webSearchRequest({acRequest,body,context}){throw new Error("Web search requests are not supported by Anthropic")}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}params?.temperature!==void 0&&(body.temperature=params.temperature),params?.topP!==void 0&&(body.top_p=params.topP),params?.topK!==void 0&&(body.top_k=params.topK),params?.stopSequences?.length&&(body.stop_sequences=params.stopSequences),params?.toolsConfig?.tools&¶ms?.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&¶ms.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$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 GroqConnector extends LLMConnector{constructor(){super(...arguments),__publicField$D(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}){try{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}}catch(error){throw error}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1,usage_data=[];try{const 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}catch(error){throw error}}async webSearchRequest({acRequest,body,context}){throw new Error("Web search is not supported for Groq")}async reqBodyAdapter(params){const messages=params?.messages||[],body={model:params.model,messages};return(params?.responseFormat||"")==="json"&&(messages?.[0]?.role==="system"?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:"system",content:JSON_RESPONSE_INSTRUCTION})),params.maxTokens!==void 0&&(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),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}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})}}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 BedrockConnector extends LLMConnector{constructor(){super(...arguments),__publicField$C(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&¤tMessage.currentToolCall&&(currentMessage.currentToolInput+=chunk.contentBlockDelta.delta.toolUse.input,currentMessage.currentToolCall.arguments=currentMessage.currentToolInput),chunk.contentBlockStop&¤tMessage.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 webSearchRequest({acRequest,body,context}){throw new Error("Web search is not supported for Bedrock")}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$B=Object.defineProperty,__defNormalProp$B=(obj,key,value)=>key in obj?__defProp$B(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$B=(obj,key,value)=>__defNormalProp$B(obj,key+"",value);class VertexAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$B(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,googleAuthOptions:{credentials}})}async request({acRequest,body,context}){const messages=body.messages;delete body.messages;try{const result=await(await this.getClient(context)).getGenerativeModel(body).generateContent({contents:messages}),content=result?.response?.candidates?.[0]?.content?.parts?.[0]?.text,usage=result?.response?.usageMetadata;return this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}),{content,finishReason:"stop",useTool:!1,toolsData:[],message:{content,role:"assistant"},usage}}catch(error){throw error}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1;return setTimeout(()=>{try{this.request({acRequest,body,context}).then(response=>{const finishReason=response.finishReason,usage=response.usage;emitter.emit("interrupted",finishReason),emitter.emit("content",response.content),emitter.emit("end",void 0,usage,finishReason)}).catch(error=>{emitter.emit("error",error.message||error.toString())})}catch(error){emitter.emit("error",error.message||error.toString())}},100),emitter}async webSearchRequest({acRequest,body,context}){throw new Error("Web search is not supported for Vertex AI")}async reqBodyAdapter(params){let messages=params?.messages||[],systemInstruction;const{systemMessage,otherMessages}=LLMHelper.separateSystemMessages(messages);"content"in systemMessage&&(systemInstruction=systemMessage.content),messages=otherMessages,(params?.responseFormat||"")==="json"&&(systemInstruction=JSON_RESPONSE_INSTRUCTION);const modelInfo=params.modelInfo;let body={model:modelInfo?.settings?.customModel||modelInfo?.settings?.foundationModel,messages};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),systemInstruction&&(body.systemInstruction=systemInstruction),Object.keys(config2).length>0&&(body.generationConfig=config2),body}reportUsage(usage,metadata){const usageData={sourceId:`llm:${metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX,"")}`,input_tokens:usage.promptTokenCount||0,output_tokens:usage.candidatesTokenCount||0,input_tokens_cache_read:usage.cachedContentTokenCount||0,input_tokens_cache_write:0,keySource:metadata.keySource,agentId:metadata.agentId,teamId:metadata.teamId};return SystemEvents.emit("USAGE:LLM",usageData),usageData}formatToolsConfig({type="function",toolDefinitions,toolChoice="auto"}){throw new Error("Tool configuration is not currently implemented for Vertex AI")}getConsistentMessages(messages){return LLMHelper.removeDuplicateUserMessages(messages).map(message=>{let textBlock=[];return message?.parts?textBlock=message.parts:message?.content&&(textBlock=Array.isArray(message.content)?message.content:[{text:message.content}]),{role:message.role,parts:textBlock}})}}var __defProp$A=Object.defineProperty,__defNormalProp$A=(obj,key,value)=>key in obj?__defProp$A(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$A=(obj,key,value)=>__defNormalProp$A(obj,key+"",value);class PerplexityConnector extends LLMConnector{constructor(){super(...arguments),__publicField$A(this,"name","LLM:Perplexity")}async getClient(params){const apiKey=params.credentials?.apiKey;if(!apiKey)throw new Error("Please provide an API key for Perplexity");return axios.create({baseURL:params?.modelInfo?.baseURL,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":"application/json"}})}async request({acRequest,body,context}){try{const response=await(await this.getClient(context)).post("/chat/completions",body),content=response?.data?.choices?.[0]?.message.content,finishReason=response?.data?.choices?.[0]?.finish_reason,usage=response?.data?.usage;return this.reportUsage(usage,{modelEntryName:context.modelEntryName,keySource:context.isUserKey?APIKeySource.User:APIKeySource.Smyth,agentId:context.agentId,teamId:context.teamId}),{content,finishReason,useTool:!1,toolsData:[],message:{content,role:"assistant"},usage}}catch(error){throw error}}async streamRequest({acRequest,body,context}){const emitter=new EventEmitter$1;return setTimeout(()=>{try{this.request({acRequest,body,context}).then(respose=>{const finishReason=respose.finishReason,usage=respose.usage;emitter.emit("interrupted",finishReason),emitter.emit("content",respose.content),emitter.emit("end",void 0,usage,finishReason)}).catch(error=>{emitter.emit("error",error.message||error.toString())})}catch(error){emitter.emit("error",error.message||error.toString())}},100),emitter}async webSearchRequest({acRequest,body,context}){throw new Error("Web search is not supported for Perplexity")}async reqBodyAdapter(params){const messages=params?.messages||[];(params?.responseFormat||"")==="json"&&(messages?.[0]?.role===TLLMMessageRole.System?messages[0].content+=JSON_RESPONSE_INSTRUCTION:messages.unshift({role:TLLMMessageRole.System,content:JSON_RESPONSE_INSTRUCTION}),delete params.responseFormat);const body={model:params.model,messages};return params?.maxTokens!==void 0&&(body.max_tokens=params.maxTokens),params?.temperature!==void 0&&(body.temperature=params.temperature),params?.topP!==void 0&&(body.top_p=params.topP),params?.topK!==void 0&&(body.top_k=params.topK),params?.frequencyPenalty&&(body.frequency_penalty=params.frequencyPenalty),params?.presencePenalty!==void 0&&(body.presence_penalty=params.presencePenalty),params.responseFormat&&(body.response_format=params.responseFormat),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,reasoning_tokens:usage?.reasoning_tokens||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{type:"function",function:{name,description,parameters:{type:"object",properties,required:requiredFields}}}})),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})}}var __defProp$z=Object.defineProperty,__defNormalProp$z=(obj,key,value)=>key in obj?__defProp$z(obj,key,{enumerable:!0,configurable:!0,writable:!0,value}):obj[key]=value,__publicField$z=(obj,key,value)=>__defNormalProp$z(obj,key+"",value);class xAIConnector extends LLMConnector{constructor(){super(...arguments),__publicField$z(this,"name","LLM:Grok")}async getClient(params){const apiKey=params.credentials?.apiKey,baseURL=params?.modelInfo?.baseURL||"https://api.x.ai/v1";if(!apiKey)throw new Error("Please provide an API key for Grok");return axios.create({baseURL,headers:{Authorization:`Bearer ${apiKey}`,"Content-Type":"application/json"}})}async request({acRequest,body,context}){try{const response=await(await this.getClient(context)).post("/chat/completions",body),message=response?.data?.choices?.[0]?.message,finishReason=response?.data?.choices?.[0]?.finish_reason,usage=response?.data?.usage,citations=response?.data?.citations;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);let content=message?.content??"";if(citations&&citations.length>0){const citationsText=`
|
|
187
187
|
|
|
188
188
|
**Sources:**
|
|
189
189
|
`+citations.map((url,index)=>`${index+1}. ${url}`).join(`
|