@smythos/sre 1.5.44 → 1.5.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG +90 -90
- package/LICENSE +18 -18
- package/README.md +135 -135
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/types/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.d.ts +13 -1
- package/dist/types/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ResponsesApiInterface.d.ts +46 -27
- package/dist/types/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.d.ts +4 -2
- package/dist/types/subsystems/LLMManager/LLM.service/connectors/openai/types.d.ts +0 -4
- package/dist/types/subsystems/LLMManager/ModelsProvider.service/connectors/SmythModelsProvider.class.d.ts +39 -0
- package/dist/types/types/LLM.types.d.ts +1 -0
- package/package.json +1 -1
- package/src/Components/APICall/APICall.class.ts +156 -156
- package/src/Components/APICall/AccessTokenManager.ts +130 -130
- package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -58
- package/src/Components/APICall/OAuth.helper.ts +294 -294
- package/src/Components/APICall/mimeTypeCategories.ts +46 -46
- package/src/Components/APICall/parseData.ts +167 -167
- package/src/Components/APICall/parseHeaders.ts +41 -41
- package/src/Components/APICall/parseProxy.ts +68 -68
- package/src/Components/APICall/parseUrl.ts +91 -91
- package/src/Components/APIEndpoint.class.ts +234 -234
- package/src/Components/APIOutput.class.ts +58 -58
- package/src/Components/AgentPlugin.class.ts +102 -102
- package/src/Components/Async.class.ts +155 -155
- package/src/Components/Await.class.ts +90 -90
- package/src/Components/Classifier.class.ts +158 -158
- package/src/Components/Component.class.ts +132 -132
- package/src/Components/ComponentHost.class.ts +38 -38
- package/src/Components/DataSourceCleaner.class.ts +92 -92
- package/src/Components/DataSourceIndexer.class.ts +181 -181
- package/src/Components/DataSourceLookup.class.ts +161 -161
- package/src/Components/ECMASandbox.class.ts +71 -71
- package/src/Components/FEncDec.class.ts +29 -29
- package/src/Components/FHash.class.ts +33 -33
- package/src/Components/FSign.class.ts +80 -80
- package/src/Components/FSleep.class.ts +25 -25
- package/src/Components/FTimestamp.class.ts +25 -25
- package/src/Components/FileStore.class.ts +78 -78
- package/src/Components/ForEach.class.ts +97 -97
- package/src/Components/GPTPlugin.class.ts +70 -70
- package/src/Components/GenAILLM.class.ts +586 -586
- package/src/Components/HuggingFace.class.ts +314 -314
- package/src/Components/Image/imageSettings.config.ts +70 -70
- package/src/Components/ImageGenerator.class.ts +502 -502
- package/src/Components/JSONFilter.class.ts +54 -54
- package/src/Components/LLMAssistant.class.ts +213 -213
- package/src/Components/LogicAND.class.ts +28 -28
- package/src/Components/LogicAtLeast.class.ts +85 -85
- package/src/Components/LogicAtMost.class.ts +86 -86
- package/src/Components/LogicOR.class.ts +29 -29
- package/src/Components/LogicXOR.class.ts +34 -34
- package/src/Components/MCPClient.class.ts +112 -112
- package/src/Components/MemoryDeleteKeyVal.class.ts +70 -70
- package/src/Components/MemoryReadKeyVal.class.ts +66 -66
- package/src/Components/MemoryWriteKeyVal.class.ts +62 -62
- package/src/Components/MemoryWriteObject.class.ts +97 -97
- package/src/Components/MultimodalLLM.class.ts +128 -128
- package/src/Components/OpenAPI.class.ts +72 -72
- package/src/Components/PromptGenerator.class.ts +122 -122
- package/src/Components/ScrapflyWebScrape.class.ts +159 -159
- package/src/Components/ServerlessCode.class.ts +123 -123
- package/src/Components/TavilyWebSearch.class.ts +98 -98
- package/src/Components/VisionLLM.class.ts +104 -104
- package/src/Components/ZapierAction.class.ts +127 -127
- package/src/Components/index.ts +97 -97
- package/src/Core/AgentProcess.helper.ts +240 -240
- package/src/Core/Connector.class.ts +123 -123
- package/src/Core/ConnectorsService.ts +197 -197
- package/src/Core/DummyConnector.ts +49 -49
- package/src/Core/HookService.ts +105 -105
- package/src/Core/SmythRuntime.class.ts +235 -235
- package/src/Core/SystemEvents.ts +16 -16
- package/src/Core/boot.ts +56 -56
- package/src/config.ts +15 -15
- package/src/constants.ts +126 -126
- package/src/data/hugging-face.params.json +579 -579
- package/src/helpers/AWSLambdaCode.helper.ts +587 -587
- package/src/helpers/BinaryInput.helper.ts +331 -331
- package/src/helpers/Conversation.helper.ts +1119 -1119
- package/src/helpers/ECMASandbox.helper.ts +54 -54
- package/src/helpers/JsonContent.helper.ts +97 -97
- package/src/helpers/LocalCache.helper.ts +97 -97
- package/src/helpers/Log.helper.ts +274 -274
- package/src/helpers/OpenApiParser.helper.ts +150 -150
- package/src/helpers/S3Cache.helper.ts +147 -147
- package/src/helpers/SmythURI.helper.ts +5 -5
- package/src/helpers/Sysconfig.helper.ts +77 -77
- package/src/helpers/TemplateString.helper.ts +243 -243
- package/src/helpers/TypeChecker.helper.ts +329 -329
- package/src/index.ts +196 -196
- package/src/index.ts.bak +196 -196
- package/src/subsystems/AgentManager/Agent.class.ts +1114 -1114
- package/src/subsystems/AgentManager/Agent.helper.ts +3 -3
- package/src/subsystems/AgentManager/AgentData.service/AgentDataConnector.ts +230 -230
- package/src/subsystems/AgentManager/AgentData.service/connectors/CLIAgentDataConnector.class.ts +66 -66
- package/src/subsystems/AgentManager/AgentData.service/connectors/LocalAgentDataConnector.class.ts +142 -142
- package/src/subsystems/AgentManager/AgentData.service/connectors/NullAgentData.class.ts +39 -39
- package/src/subsystems/AgentManager/AgentData.service/index.ts +18 -18
- package/src/subsystems/AgentManager/AgentLogger.class.ts +297 -297
- package/src/subsystems/AgentManager/AgentRequest.class.ts +51 -51
- package/src/subsystems/AgentManager/AgentRuntime.class.ts +559 -559
- package/src/subsystems/AgentManager/AgentSSE.class.ts +101 -101
- package/src/subsystems/AgentManager/AgentSettings.class.ts +52 -52
- package/src/subsystems/AgentManager/Component.service/ComponentConnector.ts +32 -32
- package/src/subsystems/AgentManager/Component.service/connectors/LocalComponentConnector.class.ts +60 -60
- package/src/subsystems/AgentManager/Component.service/index.ts +11 -11
- package/src/subsystems/AgentManager/EmbodimentSettings.class.ts +47 -47
- package/src/subsystems/AgentManager/ForkedAgent.class.ts +154 -154
- package/src/subsystems/AgentManager/OSResourceMonitor.ts +77 -77
- package/src/subsystems/ComputeManager/Code.service/CodeConnector.ts +98 -98
- package/src/subsystems/ComputeManager/Code.service/connectors/AWSLambdaCode.class.ts +172 -172
- package/src/subsystems/ComputeManager/Code.service/connectors/ECMASandbox.class.ts +131 -131
- package/src/subsystems/ComputeManager/Code.service/index.ts +13 -13
- package/src/subsystems/IO/CLI.service/CLIConnector.ts +47 -47
- package/src/subsystems/IO/CLI.service/index.ts +9 -9
- package/src/subsystems/IO/Log.service/LogConnector.ts +32 -32
- package/src/subsystems/IO/Log.service/connectors/ConsoleLog.class.ts +28 -28
- package/src/subsystems/IO/Log.service/index.ts +13 -13
- package/src/subsystems/IO/NKV.service/NKVConnector.ts +43 -43
- package/src/subsystems/IO/NKV.service/connectors/NKVLocalStorage.class.ts +234 -234
- package/src/subsystems/IO/NKV.service/connectors/NKVRAM.class.ts +204 -204
- package/src/subsystems/IO/NKV.service/connectors/NKVRedis.class.ts +182 -182
- package/src/subsystems/IO/NKV.service/index.ts +14 -14
- package/src/subsystems/IO/Router.service/RouterConnector.ts +21 -21
- package/src/subsystems/IO/Router.service/connectors/ExpressRouter.class.ts +48 -48
- package/src/subsystems/IO/Router.service/connectors/NullRouter.class.ts +40 -40
- package/src/subsystems/IO/Router.service/index.ts +11 -11
- package/src/subsystems/IO/Storage.service/SmythFS.class.ts +489 -489
- package/src/subsystems/IO/Storage.service/StorageConnector.ts +66 -66
- package/src/subsystems/IO/Storage.service/connectors/LocalStorage.class.ts +327 -327
- package/src/subsystems/IO/Storage.service/connectors/S3Storage.class.ts +482 -482
- package/src/subsystems/IO/Storage.service/index.ts +13 -13
- package/src/subsystems/IO/VectorDB.service/VectorDBConnector.ts +108 -108
- package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +454 -454
- package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +384 -384
- package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +421 -421
- package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +107 -107
- package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +109 -109
- package/src/subsystems/IO/VectorDB.service/embed/index.ts +21 -21
- package/src/subsystems/IO/VectorDB.service/index.ts +14 -14
- package/src/subsystems/LLMManager/LLM.helper.ts +251 -251
- package/src/subsystems/LLMManager/LLM.inference.ts +339 -339
- package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +489 -489
- package/src/subsystems/LLMManager/LLM.service/LLMCredentials.helper.ts +171 -171
- package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +659 -659
- package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +400 -400
- package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +77 -77
- package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +757 -757
- package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +304 -304
- package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +250 -250
- package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +423 -423
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/OpenAIConnector.class.ts +488 -455
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ChatCompletionsApiInterface.ts +528 -528
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterface.ts +100 -100
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/OpenAIApiInterfaceFactory.ts +81 -81
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ResponsesApiInterface.ts +1168 -862
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.ts +13 -37
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/index.ts +4 -4
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/utils.ts +11 -11
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/types.ts +32 -37
- package/src/subsystems/LLMManager/LLM.service/connectors/xAI.class.ts +471 -471
- package/src/subsystems/LLMManager/LLM.service/index.ts +44 -44
- package/src/subsystems/LLMManager/ModelsProvider.service/ModelsProviderConnector.ts +300 -300
- package/src/subsystems/LLMManager/ModelsProvider.service/connectors/JSONModelsProvider.class.ts +252 -252
- package/src/subsystems/LLMManager/ModelsProvider.service/index.ts +11 -11
- package/src/subsystems/LLMManager/custom-models.ts +854 -854
- package/src/subsystems/LLMManager/models.ts +2540 -2540
- package/src/subsystems/LLMManager/paramMappings.ts +69 -69
- package/src/subsystems/MemoryManager/Cache.service/CacheConnector.ts +86 -86
- package/src/subsystems/MemoryManager/Cache.service/connectors/LocalStorageCache.class.ts +297 -297
- package/src/subsystems/MemoryManager/Cache.service/connectors/RAMCache.class.ts +201 -201
- package/src/subsystems/MemoryManager/Cache.service/connectors/RedisCache.class.ts +252 -252
- package/src/subsystems/MemoryManager/Cache.service/connectors/S3Cache.class.ts +373 -373
- package/src/subsystems/MemoryManager/Cache.service/index.ts +15 -15
- package/src/subsystems/MemoryManager/LLMCache.ts +72 -72
- package/src/subsystems/MemoryManager/LLMContext.ts +124 -124
- package/src/subsystems/MemoryManager/LLMMemory.service/LLMMemoryConnector.ts +26 -26
- package/src/subsystems/MemoryManager/RuntimeContext.ts +266 -266
- package/src/subsystems/Security/AccessControl/ACL.class.ts +208 -208
- package/src/subsystems/Security/AccessControl/AccessCandidate.class.ts +82 -82
- package/src/subsystems/Security/AccessControl/AccessRequest.class.ts +52 -52
- package/src/subsystems/Security/Account.service/AccountConnector.ts +44 -44
- package/src/subsystems/Security/Account.service/connectors/AWSAccount.class.ts +76 -76
- package/src/subsystems/Security/Account.service/connectors/DummyAccount.class.ts +130 -130
- package/src/subsystems/Security/Account.service/connectors/JSONFileAccount.class.ts +159 -159
- package/src/subsystems/Security/Account.service/index.ts +14 -14
- package/src/subsystems/Security/Credentials.helper.ts +62 -62
- package/src/subsystems/Security/ManagedVault.service/ManagedVaultConnector.ts +38 -38
- package/src/subsystems/Security/ManagedVault.service/connectors/NullManagedVault.class.ts +53 -53
- package/src/subsystems/Security/ManagedVault.service/connectors/SecretManagerManagedVault.ts +154 -154
- package/src/subsystems/Security/ManagedVault.service/index.ts +12 -12
- package/src/subsystems/Security/SecureConnector.class.ts +110 -110
- package/src/subsystems/Security/Vault.service/Vault.helper.ts +30 -30
- package/src/subsystems/Security/Vault.service/VaultConnector.ts +29 -29
- package/src/subsystems/Security/Vault.service/connectors/HashicorpVault.class.ts +46 -46
- package/src/subsystems/Security/Vault.service/connectors/JSONFileVault.class.ts +221 -221
- package/src/subsystems/Security/Vault.service/connectors/NullVault.class.ts +54 -54
- package/src/subsystems/Security/Vault.service/connectors/SecretsManager.class.ts +140 -140
- package/src/subsystems/Security/Vault.service/index.ts +12 -12
- package/src/types/ACL.types.ts +104 -104
- package/src/types/AWS.types.ts +10 -10
- package/src/types/Agent.types.ts +61 -61
- package/src/types/AgentLogger.types.ts +17 -17
- package/src/types/Cache.types.ts +1 -1
- package/src/types/Common.types.ts +2 -2
- package/src/types/LLM.types.ts +496 -495
- package/src/types/Redis.types.ts +8 -8
- package/src/types/SRE.types.ts +64 -64
- package/src/types/Security.types.ts +14 -14
- package/src/types/Storage.types.ts +5 -5
- package/src/types/VectorDB.types.ts +86 -86
- package/src/utils/base64.utils.ts +275 -275
- package/src/utils/cli.utils.ts +68 -68
- package/src/utils/data.utils.ts +322 -322
- package/src/utils/date-time.utils.ts +22 -22
- package/src/utils/general.utils.ts +238 -238
- package/src/utils/index.ts +12 -12
- package/src/utils/lazy-client.ts +261 -261
- package/src/utils/numbers.utils.ts +13 -13
- package/src/utils/oauth.utils.ts +35 -35
- package/src/utils/string.utils.ts +414 -414
- package/src/utils/url.utils.ts +19 -19
- package/src/utils/validation.utils.ts +74 -74
- package/dist/bundle-analysis-lazy.html +0 -4949
- package/dist/bundle-analysis.html +0 -4949
- package/dist/types/utils/package-manager.utils.d.ts +0 -26
|
@@ -1,122 +1,122 @@
|
|
|
1
|
-
import Joi from 'joi';
|
|
2
|
-
import { IAgent as Agent } from '@sre/types/Agent.types';
|
|
3
|
-
import { LLMInference } from '@sre/LLMManager/LLM.inference';
|
|
4
|
-
import { TemplateString } from '@sre/helpers/TemplateString.helper';
|
|
5
|
-
import { Component } from './Component.class';
|
|
6
|
-
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
7
|
-
|
|
8
|
-
//TODO : better handling of context window exceeding max length
|
|
9
|
-
|
|
10
|
-
export class PromptGenerator extends Component {
|
|
11
|
-
protected configSchema = Joi.object({
|
|
12
|
-
model: Joi.string().max(200).required(),
|
|
13
|
-
prompt: Joi.string().required().max(8_000_000).label('Prompt'), // 2M tokens is around 8M characters
|
|
14
|
-
temperature: Joi.number().min(0).max(5).label('Temperature'), // max temperature is 2 for OpenAI and togetherAI but 5 for cohere
|
|
15
|
-
maxTokens: Joi.number().min(1).label('Maximum Tokens'),
|
|
16
|
-
stopSequences: Joi.string().allow('').max(400).label('Stop Sequences'),
|
|
17
|
-
topP: Joi.number().min(0).max(1).label('Top P'),
|
|
18
|
-
topK: Joi.number().min(0).max(500).label('Top K'), // max top_k is 100 for togetherAI but 500 for cohere
|
|
19
|
-
frequencyPenalty: Joi.number().min(0).max(2).label('Frequency Penalty'),
|
|
20
|
-
presencePenalty: Joi.number().min(0).max(2).label('Presence Penalty'),
|
|
21
|
-
responseFormat: Joi.string().valid('json', 'text').optional().label('Response Format'),
|
|
22
|
-
passthrough: Joi.boolean().optional().label('Passthrough'),
|
|
23
|
-
});
|
|
24
|
-
constructor() {
|
|
25
|
-
super();
|
|
26
|
-
}
|
|
27
|
-
init() {}
|
|
28
|
-
async process(input, config, agent: Agent) {
|
|
29
|
-
await super.process(input, config, agent);
|
|
30
|
-
|
|
31
|
-
//let debugLog = agent.agentRuntime?.debug ? [] : undefined;
|
|
32
|
-
const logger = this.createComponentLogger(agent, config);
|
|
33
|
-
|
|
34
|
-
try {
|
|
35
|
-
logger.debug(`=== LLM Prompt Log ===`);
|
|
36
|
-
let teamId = agent?.teamId;
|
|
37
|
-
|
|
38
|
-
const passThrough: boolean = config.data.passthrough || false;
|
|
39
|
-
const model: string = config.data.model || 'echo';
|
|
40
|
-
const llmInference: LLMInference = await LLMInference.getInstance(model, AccessCandidate.agent(agent.id));
|
|
41
|
-
|
|
42
|
-
// if the llm is undefined, then it means we removed the model from our system
|
|
43
|
-
if (!llmInference.connector) {
|
|
44
|
-
return {
|
|
45
|
-
_error: `The model '${model}' is not available. Please try a different one.`,
|
|
46
|
-
_debug: logger.output,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
const modelId = await agent.modelsProvider.getModelId(model);
|
|
51
|
-
logger.debug(` Model : ${modelId || model}`);
|
|
52
|
-
|
|
53
|
-
let prompt: any = TemplateString(config.data.prompt).parse(input).result;
|
|
54
|
-
|
|
55
|
-
logger.debug(` Prompt\n`, prompt, '\n');
|
|
56
|
-
|
|
57
|
-
// default to json response format
|
|
58
|
-
config.data.responseFormat = config.data?.responseFormat || 'json';
|
|
59
|
-
|
|
60
|
-
// request to LLM
|
|
61
|
-
let response: any;
|
|
62
|
-
if (passThrough) {
|
|
63
|
-
const contentPromise = new Promise(async (resolve, reject) => {
|
|
64
|
-
let _content = '';
|
|
65
|
-
const eventEmitter: any = await llmInference
|
|
66
|
-
.promptStream({
|
|
67
|
-
query: prompt,
|
|
68
|
-
params: { ...config, model, agentId: agent.id },
|
|
69
|
-
})
|
|
70
|
-
.catch((error) => {
|
|
71
|
-
console.error('Error on promptStream: ', error);
|
|
72
|
-
reject(error);
|
|
73
|
-
});
|
|
74
|
-
eventEmitter.on('content', (content) => {
|
|
75
|
-
if (typeof agent.callback === 'function') {
|
|
76
|
-
agent.callback({ content });
|
|
77
|
-
}
|
|
78
|
-
agent.sse.send('llm/passthrough/content', content);
|
|
79
|
-
_content += content;
|
|
80
|
-
});
|
|
81
|
-
eventEmitter.on('thinking', (thinking) => {
|
|
82
|
-
if (typeof agent.callback === 'function') {
|
|
83
|
-
agent.callback({ thinking });
|
|
84
|
-
}
|
|
85
|
-
agent.sse.send('llm/passthrough/thinking', thinking);
|
|
86
|
-
});
|
|
87
|
-
eventEmitter.on('end', () => {
|
|
88
|
-
console.log('end');
|
|
89
|
-
resolve(_content);
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
response = await contentPromise;
|
|
93
|
-
} else {
|
|
94
|
-
response = await llmInference
|
|
95
|
-
.prompt({ query: prompt, params: { ...config, agentId: agent.id } })
|
|
96
|
-
.catch((error) => ({ error: error }));
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// in case we have the response but it's empty string, undefined or null
|
|
100
|
-
if (!response) {
|
|
101
|
-
return { _error: ' LLM Error = Empty Response!', _debug: logger.output };
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (response?.error) {
|
|
105
|
-
const error = response?.error + ' ' + (response?.details || '');
|
|
106
|
-
logger.error(` LLM Error=`, error);
|
|
107
|
-
|
|
108
|
-
return { Reply: response?.data, _error: error, _debug: logger.output };
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
logger.debug(' Response \n', response);
|
|
112
|
-
|
|
113
|
-
const result = { Reply: response };
|
|
114
|
-
|
|
115
|
-
result['_debug'] = logger.output;
|
|
116
|
-
|
|
117
|
-
return result;
|
|
118
|
-
} catch (error) {
|
|
119
|
-
return { _error: error.message, _debug: logger.output };
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
1
|
+
import Joi from 'joi';
|
|
2
|
+
import { IAgent as Agent } from '@sre/types/Agent.types';
|
|
3
|
+
import { LLMInference } from '@sre/LLMManager/LLM.inference';
|
|
4
|
+
import { TemplateString } from '@sre/helpers/TemplateString.helper';
|
|
5
|
+
import { Component } from './Component.class';
|
|
6
|
+
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
7
|
+
|
|
8
|
+
//TODO : better handling of context window exceeding max length
|
|
9
|
+
|
|
10
|
+
export class PromptGenerator extends Component {
|
|
11
|
+
protected configSchema = Joi.object({
|
|
12
|
+
model: Joi.string().max(200).required(),
|
|
13
|
+
prompt: Joi.string().required().max(8_000_000).label('Prompt'), // 2M tokens is around 8M characters
|
|
14
|
+
temperature: Joi.number().min(0).max(5).label('Temperature'), // max temperature is 2 for OpenAI and togetherAI but 5 for cohere
|
|
15
|
+
maxTokens: Joi.number().min(1).label('Maximum Tokens'),
|
|
16
|
+
stopSequences: Joi.string().allow('').max(400).label('Stop Sequences'),
|
|
17
|
+
topP: Joi.number().min(0).max(1).label('Top P'),
|
|
18
|
+
topK: Joi.number().min(0).max(500).label('Top K'), // max top_k is 100 for togetherAI but 500 for cohere
|
|
19
|
+
frequencyPenalty: Joi.number().min(0).max(2).label('Frequency Penalty'),
|
|
20
|
+
presencePenalty: Joi.number().min(0).max(2).label('Presence Penalty'),
|
|
21
|
+
responseFormat: Joi.string().valid('json', 'text').optional().label('Response Format'),
|
|
22
|
+
passthrough: Joi.boolean().optional().label('Passthrough'),
|
|
23
|
+
});
|
|
24
|
+
constructor() {
|
|
25
|
+
super();
|
|
26
|
+
}
|
|
27
|
+
init() {}
|
|
28
|
+
async process(input, config, agent: Agent) {
|
|
29
|
+
await super.process(input, config, agent);
|
|
30
|
+
|
|
31
|
+
//let debugLog = agent.agentRuntime?.debug ? [] : undefined;
|
|
32
|
+
const logger = this.createComponentLogger(agent, config);
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
logger.debug(`=== LLM Prompt Log ===`);
|
|
36
|
+
let teamId = agent?.teamId;
|
|
37
|
+
|
|
38
|
+
const passThrough: boolean = config.data.passthrough || false;
|
|
39
|
+
const model: string = config.data.model || 'echo';
|
|
40
|
+
const llmInference: LLMInference = await LLMInference.getInstance(model, AccessCandidate.agent(agent.id));
|
|
41
|
+
|
|
42
|
+
// if the llm is undefined, then it means we removed the model from our system
|
|
43
|
+
if (!llmInference.connector) {
|
|
44
|
+
return {
|
|
45
|
+
_error: `The model '${model}' is not available. Please try a different one.`,
|
|
46
|
+
_debug: logger.output,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const modelId = await agent.modelsProvider.getModelId(model);
|
|
51
|
+
logger.debug(` Model : ${modelId || model}`);
|
|
52
|
+
|
|
53
|
+
let prompt: any = TemplateString(config.data.prompt).parse(input).result;
|
|
54
|
+
|
|
55
|
+
logger.debug(` Prompt\n`, prompt, '\n');
|
|
56
|
+
|
|
57
|
+
// default to json response format
|
|
58
|
+
config.data.responseFormat = config.data?.responseFormat || 'json';
|
|
59
|
+
|
|
60
|
+
// request to LLM
|
|
61
|
+
let response: any;
|
|
62
|
+
if (passThrough) {
|
|
63
|
+
const contentPromise = new Promise(async (resolve, reject) => {
|
|
64
|
+
let _content = '';
|
|
65
|
+
const eventEmitter: any = await llmInference
|
|
66
|
+
.promptStream({
|
|
67
|
+
query: prompt,
|
|
68
|
+
params: { ...config, model, agentId: agent.id },
|
|
69
|
+
})
|
|
70
|
+
.catch((error) => {
|
|
71
|
+
console.error('Error on promptStream: ', error);
|
|
72
|
+
reject(error);
|
|
73
|
+
});
|
|
74
|
+
eventEmitter.on('content', (content) => {
|
|
75
|
+
if (typeof agent.callback === 'function') {
|
|
76
|
+
agent.callback({ content });
|
|
77
|
+
}
|
|
78
|
+
agent.sse.send('llm/passthrough/content', content);
|
|
79
|
+
_content += content;
|
|
80
|
+
});
|
|
81
|
+
eventEmitter.on('thinking', (thinking) => {
|
|
82
|
+
if (typeof agent.callback === 'function') {
|
|
83
|
+
agent.callback({ thinking });
|
|
84
|
+
}
|
|
85
|
+
agent.sse.send('llm/passthrough/thinking', thinking);
|
|
86
|
+
});
|
|
87
|
+
eventEmitter.on('end', () => {
|
|
88
|
+
console.log('end');
|
|
89
|
+
resolve(_content);
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
response = await contentPromise;
|
|
93
|
+
} else {
|
|
94
|
+
response = await llmInference
|
|
95
|
+
.prompt({ query: prompt, params: { ...config, agentId: agent.id } })
|
|
96
|
+
.catch((error) => ({ error: error }));
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// in case we have the response but it's empty string, undefined or null
|
|
100
|
+
if (!response) {
|
|
101
|
+
return { _error: ' LLM Error = Empty Response!', _debug: logger.output };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (response?.error) {
|
|
105
|
+
const error = response?.error + ' ' + (response?.details || '');
|
|
106
|
+
logger.error(` LLM Error=`, error);
|
|
107
|
+
|
|
108
|
+
return { Reply: response?.data, _error: error, _debug: logger.output };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
logger.debug(' Response \n', response);
|
|
112
|
+
|
|
113
|
+
const result = { Reply: response };
|
|
114
|
+
|
|
115
|
+
result['_debug'] = logger.output;
|
|
116
|
+
|
|
117
|
+
return result;
|
|
118
|
+
} catch (error) {
|
|
119
|
+
return { _error: error.message, _debug: logger.output };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -1,159 +1,159 @@
|
|
|
1
|
-
import { IAgent as Agent } from '@sre/types/Agent.types';
|
|
2
|
-
import { Component } from './Component.class';
|
|
3
|
-
import Joi from 'joi';
|
|
4
|
-
import SREConfig from '@sre/config';
|
|
5
|
-
import axios from 'axios';
|
|
6
|
-
import { SystemEvents } from '@sre/Core/SystemEvents';
|
|
7
|
-
import { AccessCandidate } from '../subsystems/Security/AccessControl/AccessCandidate.class';
|
|
8
|
-
import { getCredentials } from '../subsystems/Security/Credentials.helper';
|
|
9
|
-
// const CREDITS_PER_URL = 0.2;
|
|
10
|
-
|
|
11
|
-
export class ScrapflyWebScrape extends Component {
|
|
12
|
-
protected configSchema = Joi.object({
|
|
13
|
-
// includeImages: Joi.boolean().default(false).label('Include Image Results'),
|
|
14
|
-
antiScrapingProtection: Joi.boolean().default(false).label('Enable Anti-Scraping Protection'),
|
|
15
|
-
javascriptRendering: Joi.boolean().default(false).label('Enable JavaScript Rendering'),
|
|
16
|
-
autoScroll: Joi.boolean().default(false).label('Enable Auto Scroll'),
|
|
17
|
-
format: Joi.string().default('markdown').label('Format').optional(),
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
constructor() {
|
|
21
|
-
super();
|
|
22
|
-
}
|
|
23
|
-
init() {}
|
|
24
|
-
async process(input, config, agent: Agent) {
|
|
25
|
-
await super.process(input, config, agent);
|
|
26
|
-
|
|
27
|
-
const logger = this.createComponentLogger(agent, config);
|
|
28
|
-
try {
|
|
29
|
-
logger.debug(`=== Web Scrape Log ===`);
|
|
30
|
-
let Output: any = {};
|
|
31
|
-
let _error = undefined;
|
|
32
|
-
const scrapeUrls = this.extractUrls(input);
|
|
33
|
-
logger.debug('Payload:', JSON.stringify(config.data));
|
|
34
|
-
logger.debug(`Vaild URLs: ${JSON.stringify(scrapeUrls)}`);
|
|
35
|
-
const teamId = agent.teamId;
|
|
36
|
-
const key = await getCredentials(AccessCandidate.team(teamId), 'scrapfly');
|
|
37
|
-
|
|
38
|
-
const scrapeResults = await Promise.all(scrapeUrls.map((url) => this.scrapeURL(url, config.data, key)));
|
|
39
|
-
const results = scrapeResults
|
|
40
|
-
.filter((result) => result.success)
|
|
41
|
-
.map((result) => {
|
|
42
|
-
return { url: result.url, content: result.content };
|
|
43
|
-
});
|
|
44
|
-
const failedResults = scrapeResults
|
|
45
|
-
.filter((result) => !result.success)
|
|
46
|
-
.map((result) => {
|
|
47
|
-
return { url: result.url, error: result.error };
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
Output = { Results: results, FailedURLs: failedResults };
|
|
51
|
-
const totalCredits = scrapeResults.reduce((acc, result) => acc + (result.cost || 0), 0);
|
|
52
|
-
this.reportUsage({
|
|
53
|
-
urlsScraped: results?.length,
|
|
54
|
-
agentId: agent.id,
|
|
55
|
-
teamId: agent.teamId,
|
|
56
|
-
totalCredits,
|
|
57
|
-
});
|
|
58
|
-
return { ...Output, _error, _debug: logger.output };
|
|
59
|
-
} catch (err: any) {
|
|
60
|
-
const _error = err?.message || err?.response?.data || err.toString();
|
|
61
|
-
logger.error(` Error scraping web \n${_error}\n`);
|
|
62
|
-
return { Output: undefined, _error, _debug: logger.output };
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
async scrapeURL(url, data, key) {
|
|
67
|
-
try {
|
|
68
|
-
const response = await axios({
|
|
69
|
-
method: 'get',
|
|
70
|
-
url: 'https://api.scrapfly.io/scrape',
|
|
71
|
-
params: {
|
|
72
|
-
url: encodeURIComponent(url),
|
|
73
|
-
key,
|
|
74
|
-
cost_budget: 80,
|
|
75
|
-
...(data.format ? { format: data.format } : { format: 'markdown' }),
|
|
76
|
-
...(data.antiScrapingProtection && { asp: true }),
|
|
77
|
-
...(data.javascriptRendering && { render_js: true }),
|
|
78
|
-
...(data.autoScroll && { auto_scroll: true, render_js: true }),
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
return {
|
|
82
|
-
content: response.data?.result?.content,
|
|
83
|
-
success: true,
|
|
84
|
-
url,
|
|
85
|
-
cost: response.data?.context?.cost?.total || 0,
|
|
86
|
-
};
|
|
87
|
-
} catch (error) {
|
|
88
|
-
return {
|
|
89
|
-
content: undefined,
|
|
90
|
-
success: false,
|
|
91
|
-
error: error?.response?.data?.result?.error?.message || 'Failed to scrape URL',
|
|
92
|
-
url,
|
|
93
|
-
cost: 0,
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
extractUrls(input: any) {
|
|
99
|
-
const scrapeUrls = [];
|
|
100
|
-
for (const key in input) {
|
|
101
|
-
if (Object.prototype.hasOwnProperty.call(input, key)) {
|
|
102
|
-
const inputItem = input[key];
|
|
103
|
-
if (typeof inputItem === 'string') {
|
|
104
|
-
try {
|
|
105
|
-
let urls = JSON.parse(inputItem);
|
|
106
|
-
for (const url of urls) {
|
|
107
|
-
if (this.isValidUrl(url)) {
|
|
108
|
-
scrapeUrls.push(url.trim());
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
} catch (error) {
|
|
112
|
-
const commaSeparatedUrls = inputItem.split(',');
|
|
113
|
-
for (const url of commaSeparatedUrls) {
|
|
114
|
-
if (this.isValidUrl(url)) {
|
|
115
|
-
scrapeUrls.push(url.trim());
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
} else if (typeof inputItem === 'object') {
|
|
120
|
-
for (const url of inputItem) {
|
|
121
|
-
if (this.isValidUrl(url)) {
|
|
122
|
-
scrapeUrls.push(url.trim());
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
return scrapeUrls;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
isValidUrl(urlString: string) {
|
|
132
|
-
try {
|
|
133
|
-
const urlToCheck = urlString;
|
|
134
|
-
new URL(urlToCheck);
|
|
135
|
-
return true;
|
|
136
|
-
} catch (error) {
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
protected reportUsage({
|
|
142
|
-
urlsScraped,
|
|
143
|
-
agentId,
|
|
144
|
-
teamId,
|
|
145
|
-
totalCredits,
|
|
146
|
-
}: {
|
|
147
|
-
urlsScraped: number;
|
|
148
|
-
agentId: string;
|
|
149
|
-
teamId: string;
|
|
150
|
-
totalCredits: number;
|
|
151
|
-
}) {
|
|
152
|
-
SystemEvents.emit('USAGE:API', {
|
|
153
|
-
sourceId: 'api:webscrape.smyth',
|
|
154
|
-
credits: totalCredits,
|
|
155
|
-
agentId,
|
|
156
|
-
teamId,
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
}
|
|
1
|
+
import { IAgent as Agent } from '@sre/types/Agent.types';
|
|
2
|
+
import { Component } from './Component.class';
|
|
3
|
+
import Joi from 'joi';
|
|
4
|
+
import SREConfig from '@sre/config';
|
|
5
|
+
import axios from 'axios';
|
|
6
|
+
import { SystemEvents } from '@sre/Core/SystemEvents';
|
|
7
|
+
import { AccessCandidate } from '../subsystems/Security/AccessControl/AccessCandidate.class';
|
|
8
|
+
import { getCredentials } from '../subsystems/Security/Credentials.helper';
|
|
9
|
+
// const CREDITS_PER_URL = 0.2;
|
|
10
|
+
|
|
11
|
+
export class ScrapflyWebScrape extends Component {
|
|
12
|
+
protected configSchema = Joi.object({
|
|
13
|
+
// includeImages: Joi.boolean().default(false).label('Include Image Results'),
|
|
14
|
+
antiScrapingProtection: Joi.boolean().default(false).label('Enable Anti-Scraping Protection'),
|
|
15
|
+
javascriptRendering: Joi.boolean().default(false).label('Enable JavaScript Rendering'),
|
|
16
|
+
autoScroll: Joi.boolean().default(false).label('Enable Auto Scroll'),
|
|
17
|
+
format: Joi.string().default('markdown').label('Format').optional(),
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
constructor() {
|
|
21
|
+
super();
|
|
22
|
+
}
|
|
23
|
+
init() {}
|
|
24
|
+
async process(input, config, agent: Agent) {
|
|
25
|
+
await super.process(input, config, agent);
|
|
26
|
+
|
|
27
|
+
const logger = this.createComponentLogger(agent, config);
|
|
28
|
+
try {
|
|
29
|
+
logger.debug(`=== Web Scrape Log ===`);
|
|
30
|
+
let Output: any = {};
|
|
31
|
+
let _error = undefined;
|
|
32
|
+
const scrapeUrls = this.extractUrls(input);
|
|
33
|
+
logger.debug('Payload:', JSON.stringify(config.data));
|
|
34
|
+
logger.debug(`Vaild URLs: ${JSON.stringify(scrapeUrls)}`);
|
|
35
|
+
const teamId = agent.teamId;
|
|
36
|
+
const key = await getCredentials(AccessCandidate.team(teamId), 'scrapfly');
|
|
37
|
+
|
|
38
|
+
const scrapeResults = await Promise.all(scrapeUrls.map((url) => this.scrapeURL(url, config.data, key)));
|
|
39
|
+
const results = scrapeResults
|
|
40
|
+
.filter((result) => result.success)
|
|
41
|
+
.map((result) => {
|
|
42
|
+
return { url: result.url, content: result.content };
|
|
43
|
+
});
|
|
44
|
+
const failedResults = scrapeResults
|
|
45
|
+
.filter((result) => !result.success)
|
|
46
|
+
.map((result) => {
|
|
47
|
+
return { url: result.url, error: result.error };
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
Output = { Results: results, FailedURLs: failedResults };
|
|
51
|
+
const totalCredits = scrapeResults.reduce((acc, result) => acc + (result.cost || 0), 0);
|
|
52
|
+
this.reportUsage({
|
|
53
|
+
urlsScraped: results?.length,
|
|
54
|
+
agentId: agent.id,
|
|
55
|
+
teamId: agent.teamId,
|
|
56
|
+
totalCredits,
|
|
57
|
+
});
|
|
58
|
+
return { ...Output, _error, _debug: logger.output };
|
|
59
|
+
} catch (err: any) {
|
|
60
|
+
const _error = err?.message || err?.response?.data || err.toString();
|
|
61
|
+
logger.error(` Error scraping web \n${_error}\n`);
|
|
62
|
+
return { Output: undefined, _error, _debug: logger.output };
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async scrapeURL(url, data, key) {
|
|
67
|
+
try {
|
|
68
|
+
const response = await axios({
|
|
69
|
+
method: 'get',
|
|
70
|
+
url: 'https://api.scrapfly.io/scrape',
|
|
71
|
+
params: {
|
|
72
|
+
url: encodeURIComponent(url),
|
|
73
|
+
key,
|
|
74
|
+
cost_budget: 80,
|
|
75
|
+
...(data.format ? { format: data.format } : { format: 'markdown' }),
|
|
76
|
+
...(data.antiScrapingProtection && { asp: true }),
|
|
77
|
+
...(data.javascriptRendering && { render_js: true }),
|
|
78
|
+
...(data.autoScroll && { auto_scroll: true, render_js: true }),
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
return {
|
|
82
|
+
content: response.data?.result?.content,
|
|
83
|
+
success: true,
|
|
84
|
+
url,
|
|
85
|
+
cost: response.data?.context?.cost?.total || 0,
|
|
86
|
+
};
|
|
87
|
+
} catch (error) {
|
|
88
|
+
return {
|
|
89
|
+
content: undefined,
|
|
90
|
+
success: false,
|
|
91
|
+
error: error?.response?.data?.result?.error?.message || 'Failed to scrape URL',
|
|
92
|
+
url,
|
|
93
|
+
cost: 0,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
extractUrls(input: any) {
|
|
99
|
+
const scrapeUrls = [];
|
|
100
|
+
for (const key in input) {
|
|
101
|
+
if (Object.prototype.hasOwnProperty.call(input, key)) {
|
|
102
|
+
const inputItem = input[key];
|
|
103
|
+
if (typeof inputItem === 'string') {
|
|
104
|
+
try {
|
|
105
|
+
let urls = JSON.parse(inputItem);
|
|
106
|
+
for (const url of urls) {
|
|
107
|
+
if (this.isValidUrl(url)) {
|
|
108
|
+
scrapeUrls.push(url.trim());
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
} catch (error) {
|
|
112
|
+
const commaSeparatedUrls = inputItem.split(',');
|
|
113
|
+
for (const url of commaSeparatedUrls) {
|
|
114
|
+
if (this.isValidUrl(url)) {
|
|
115
|
+
scrapeUrls.push(url.trim());
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
} else if (typeof inputItem === 'object') {
|
|
120
|
+
for (const url of inputItem) {
|
|
121
|
+
if (this.isValidUrl(url)) {
|
|
122
|
+
scrapeUrls.push(url.trim());
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return scrapeUrls;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
isValidUrl(urlString: string) {
|
|
132
|
+
try {
|
|
133
|
+
const urlToCheck = urlString;
|
|
134
|
+
new URL(urlToCheck);
|
|
135
|
+
return true;
|
|
136
|
+
} catch (error) {
|
|
137
|
+
return false;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
protected reportUsage({
|
|
142
|
+
urlsScraped,
|
|
143
|
+
agentId,
|
|
144
|
+
teamId,
|
|
145
|
+
totalCredits,
|
|
146
|
+
}: {
|
|
147
|
+
urlsScraped: number;
|
|
148
|
+
agentId: string;
|
|
149
|
+
teamId: string;
|
|
150
|
+
totalCredits: number;
|
|
151
|
+
}) {
|
|
152
|
+
SystemEvents.emit('USAGE:API', {
|
|
153
|
+
sourceId: 'api:webscrape.smyth',
|
|
154
|
+
credits: totalCredits,
|
|
155
|
+
agentId,
|
|
156
|
+
teamId,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|