@smythos/sre 1.5.53 → 1.5.54
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 +98 -98
- package/LICENSE +18 -18
- package/README.md +135 -135
- package/dist/bundle-analysis-lazy.html +4949 -0
- package/dist/bundle-analysis.html +4949 -0
- 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 +1 -6
- package/dist/types/utils/package-manager.utils.d.ts +26 -0
- package/package.json +1 -1
- package/src/Components/APICall/APICall.class.ts +157 -157
- package/src/Components/APICall/AccessTokenManager.ts +166 -166
- package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -58
- package/src/Components/APICall/OAuth.helper.ts +447 -447
- 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 +138 -138
- 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 +590 -590
- 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 +3 -3
- package/src/index.ts.bak +3 -3
- 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 +301 -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 -488
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/ChatCompletionsApiInterface.ts +524 -524
- 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 +1145 -1145
- package/src/subsystems/LLMManager/LLM.service/connectors/openai/apiInterfaces/constants.ts +13 -13
- 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 -32
- 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 -496
- 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/types/subsystems/LLMManager/ModelsProvider.service/connectors/SmythModelsProvider.class.d.ts +0 -39
|
@@ -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
|
+
}
|
|
@@ -1,123 +1,123 @@
|
|
|
1
|
-
import { IAgent as Agent } from '@sre/types/Agent.types';
|
|
2
|
-
import { Component } from './Component.class';
|
|
3
|
-
import Joi from 'joi';
|
|
4
|
-
import { ConnectorService } from '@sre/Core/ConnectorsService';
|
|
5
|
-
import { AWSCredentials, AWSRegionConfig } from '@sre/types/AWS.types';
|
|
6
|
-
import { calculateExecutionCost, generateCodeFromLegacyComponent, getLambdaCredentials, reportUsage } from '@sre/helpers/AWSLambdaCode.helper';
|
|
7
|
-
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
8
|
-
|
|
9
|
-
export class ServerlessCode extends Component {
|
|
10
|
-
|
|
11
|
-
protected configSchema = Joi.object({
|
|
12
|
-
code_imports: Joi.string().max(1000).allow('').label('Imports'),
|
|
13
|
-
code_body: Joi.string().max(500000).allow('').label('Code'),
|
|
14
|
-
code: Joi.string().max(500000).allow('').label('Code').optional(),
|
|
15
|
-
deploy_btn: Joi.string().max(500000).allow('').label('Deploy').optional(),
|
|
16
|
-
accessKeyId: Joi.string().max(100).allow('').label('AWS Access Key ID').optional(),
|
|
17
|
-
secretAccessKey: Joi.string().max(200).allow('').label('AWS Secret Access Key').optional(),
|
|
18
|
-
region: Joi.string().label('AWS Region').optional(),
|
|
19
|
-
_templateSettings: Joi.object().allow(null).label('Template Settings'),
|
|
20
|
-
_templateVars: Joi.object().allow(null).label('Template Variables'),
|
|
21
|
-
function_label: Joi.string().max(100).allow('').label('Function Label').optional(),
|
|
22
|
-
function_label_end: Joi.string().allow(null).label('Function Label End').optional(),
|
|
23
|
-
use_own_keys: Joi.boolean().label('Use Own Keys').optional(),
|
|
24
|
-
pricing_note: Joi.string().allow(null).label('Pricing Note').optional(),
|
|
25
|
-
});
|
|
26
|
-
constructor() {
|
|
27
|
-
super();
|
|
28
|
-
}
|
|
29
|
-
init() { }
|
|
30
|
-
|
|
31
|
-
async process(input, config, agent: Agent) {
|
|
32
|
-
await new Promise(resolve => setTimeout(resolve, 10000));
|
|
33
|
-
await super.process(input, config, agent);
|
|
34
|
-
const logger = this.createComponentLogger(agent, config);
|
|
35
|
-
try {
|
|
36
|
-
logger.debug(`=== Serverless Code Log ===`);
|
|
37
|
-
let Output: any = {};
|
|
38
|
-
let _error = undefined;
|
|
39
|
-
const componentInputs = agent.components[config.id]?.inputs || {};
|
|
40
|
-
|
|
41
|
-
let codeInputs = {};
|
|
42
|
-
for (let field of componentInputs) {
|
|
43
|
-
const _type = typeof input[field.name];
|
|
44
|
-
switch (_type) {
|
|
45
|
-
case 'string':
|
|
46
|
-
try {
|
|
47
|
-
codeInputs[field.name] = JSON.parse(input[field.name].replace(/\\"/g, '"'));
|
|
48
|
-
} catch (error) {
|
|
49
|
-
codeInputs[field.name] = `${input[field.name]}`;
|
|
50
|
-
}
|
|
51
|
-
break;
|
|
52
|
-
case 'number':
|
|
53
|
-
case 'boolean':
|
|
54
|
-
codeInputs[field.name] = input[field.name];
|
|
55
|
-
break;
|
|
56
|
-
default:
|
|
57
|
-
codeInputs[field.name] = input[field.name];
|
|
58
|
-
break;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
logger.debug(`\nInput Variables: \n${JSON.stringify(codeInputs, null, 2)}\n`);
|
|
63
|
-
|
|
64
|
-
let codeConnector = ConnectorService.getCodeConnector();
|
|
65
|
-
let codeCredentials: AWSCredentials & AWSRegionConfig & { isUserProvidedKeys: boolean } =
|
|
66
|
-
await getLambdaCredentials(agent, config);
|
|
67
|
-
|
|
68
|
-
if (codeCredentials.isUserProvidedKeys) {
|
|
69
|
-
codeConnector = codeConnector.instance({
|
|
70
|
-
region: codeCredentials.region,
|
|
71
|
-
accessKeyId: codeCredentials.accessKeyId,
|
|
72
|
-
secretAccessKey: codeCredentials.secretAccessKey,
|
|
73
|
-
})
|
|
74
|
-
}
|
|
75
|
-
let code = config?.data?.code;
|
|
76
|
-
if (!code) {
|
|
77
|
-
code = generateCodeFromLegacyComponent(config.data.code_body, config.data.code_imports, Object.keys(codeInputs))
|
|
78
|
-
}
|
|
79
|
-
// Deploy lambda function if it doesn't exist or the code hash is different
|
|
80
|
-
await codeConnector.agent(agent.id)
|
|
81
|
-
.deploy(config.id, {
|
|
82
|
-
code,
|
|
83
|
-
inputs: codeInputs,
|
|
84
|
-
}, {
|
|
85
|
-
runtime: 'nodejs',
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
try {
|
|
89
|
-
const executionResponse = await codeConnector.agent(agent.id).execute(config.id, codeInputs);
|
|
90
|
-
const executionTime = executionResponse.executionTime;
|
|
91
|
-
logger.debug(
|
|
92
|
-
`Code result:\n ${typeof executionResponse.output === 'object' ? JSON.stringify(executionResponse.output, null, 2) : executionResponse.output
|
|
93
|
-
}\n`,
|
|
94
|
-
);
|
|
95
|
-
logger.debug(`Execution time: ${executionTime}ms\n`);
|
|
96
|
-
|
|
97
|
-
const cost = calculateExecutionCost(executionTime);
|
|
98
|
-
if (!codeCredentials.isUserProvidedKeys) {
|
|
99
|
-
const accountConnector = ConnectorService.getAccountConnector();
|
|
100
|
-
const agentTeam = await accountConnector.getCandidateTeam(AccessCandidate.agent(agent.id));
|
|
101
|
-
reportUsage({ cost, agentId: agent.id, teamId: agentTeam });
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (executionResponse.success) {
|
|
105
|
-
Output = executionResponse.output;
|
|
106
|
-
} else {
|
|
107
|
-
Output = undefined;
|
|
108
|
-
_error = executionResponse.errors;
|
|
109
|
-
}
|
|
110
|
-
} catch (error: any) {
|
|
111
|
-
logger.error(`Error running code \n${error}\n`);
|
|
112
|
-
_error = error?.response?.data || error?.message || error.toString();
|
|
113
|
-
Output = undefined; //prevents running next component if the code execution failed
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
return { Output, _error, _debug: logger.output };
|
|
117
|
-
} catch (err: any) {
|
|
118
|
-
const _error = err?.response?.data || err?.message || err.toString();
|
|
119
|
-
logger.error(` Error running code \n${_error}\n`);
|
|
120
|
-
return { Output: undefined, _error, _debug: logger.output };
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
}
|
|
1
|
+
import { IAgent as Agent } from '@sre/types/Agent.types';
|
|
2
|
+
import { Component } from './Component.class';
|
|
3
|
+
import Joi from 'joi';
|
|
4
|
+
import { ConnectorService } from '@sre/Core/ConnectorsService';
|
|
5
|
+
import { AWSCredentials, AWSRegionConfig } from '@sre/types/AWS.types';
|
|
6
|
+
import { calculateExecutionCost, generateCodeFromLegacyComponent, getLambdaCredentials, reportUsage } from '@sre/helpers/AWSLambdaCode.helper';
|
|
7
|
+
import { AccessCandidate } from '@sre/Security/AccessControl/AccessCandidate.class';
|
|
8
|
+
|
|
9
|
+
export class ServerlessCode extends Component {
|
|
10
|
+
|
|
11
|
+
protected configSchema = Joi.object({
|
|
12
|
+
code_imports: Joi.string().max(1000).allow('').label('Imports'),
|
|
13
|
+
code_body: Joi.string().max(500000).allow('').label('Code'),
|
|
14
|
+
code: Joi.string().max(500000).allow('').label('Code').optional(),
|
|
15
|
+
deploy_btn: Joi.string().max(500000).allow('').label('Deploy').optional(),
|
|
16
|
+
accessKeyId: Joi.string().max(100).allow('').label('AWS Access Key ID').optional(),
|
|
17
|
+
secretAccessKey: Joi.string().max(200).allow('').label('AWS Secret Access Key').optional(),
|
|
18
|
+
region: Joi.string().label('AWS Region').optional(),
|
|
19
|
+
_templateSettings: Joi.object().allow(null).label('Template Settings'),
|
|
20
|
+
_templateVars: Joi.object().allow(null).label('Template Variables'),
|
|
21
|
+
function_label: Joi.string().max(100).allow('').label('Function Label').optional(),
|
|
22
|
+
function_label_end: Joi.string().allow(null).label('Function Label End').optional(),
|
|
23
|
+
use_own_keys: Joi.boolean().label('Use Own Keys').optional(),
|
|
24
|
+
pricing_note: Joi.string().allow(null).label('Pricing Note').optional(),
|
|
25
|
+
});
|
|
26
|
+
constructor() {
|
|
27
|
+
super();
|
|
28
|
+
}
|
|
29
|
+
init() { }
|
|
30
|
+
|
|
31
|
+
async process(input, config, agent: Agent) {
|
|
32
|
+
await new Promise(resolve => setTimeout(resolve, 10000));
|
|
33
|
+
await super.process(input, config, agent);
|
|
34
|
+
const logger = this.createComponentLogger(agent, config);
|
|
35
|
+
try {
|
|
36
|
+
logger.debug(`=== Serverless Code Log ===`);
|
|
37
|
+
let Output: any = {};
|
|
38
|
+
let _error = undefined;
|
|
39
|
+
const componentInputs = agent.components[config.id]?.inputs || {};
|
|
40
|
+
|
|
41
|
+
let codeInputs = {};
|
|
42
|
+
for (let field of componentInputs) {
|
|
43
|
+
const _type = typeof input[field.name];
|
|
44
|
+
switch (_type) {
|
|
45
|
+
case 'string':
|
|
46
|
+
try {
|
|
47
|
+
codeInputs[field.name] = JSON.parse(input[field.name].replace(/\\"/g, '"'));
|
|
48
|
+
} catch (error) {
|
|
49
|
+
codeInputs[field.name] = `${input[field.name]}`;
|
|
50
|
+
}
|
|
51
|
+
break;
|
|
52
|
+
case 'number':
|
|
53
|
+
case 'boolean':
|
|
54
|
+
codeInputs[field.name] = input[field.name];
|
|
55
|
+
break;
|
|
56
|
+
default:
|
|
57
|
+
codeInputs[field.name] = input[field.name];
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
logger.debug(`\nInput Variables: \n${JSON.stringify(codeInputs, null, 2)}\n`);
|
|
63
|
+
|
|
64
|
+
let codeConnector = ConnectorService.getCodeConnector();
|
|
65
|
+
let codeCredentials: AWSCredentials & AWSRegionConfig & { isUserProvidedKeys: boolean } =
|
|
66
|
+
await getLambdaCredentials(agent, config);
|
|
67
|
+
|
|
68
|
+
if (codeCredentials.isUserProvidedKeys) {
|
|
69
|
+
codeConnector = codeConnector.instance({
|
|
70
|
+
region: codeCredentials.region,
|
|
71
|
+
accessKeyId: codeCredentials.accessKeyId,
|
|
72
|
+
secretAccessKey: codeCredentials.secretAccessKey,
|
|
73
|
+
})
|
|
74
|
+
}
|
|
75
|
+
let code = config?.data?.code;
|
|
76
|
+
if (!code) {
|
|
77
|
+
code = generateCodeFromLegacyComponent(config.data.code_body, config.data.code_imports, Object.keys(codeInputs))
|
|
78
|
+
}
|
|
79
|
+
// Deploy lambda function if it doesn't exist or the code hash is different
|
|
80
|
+
await codeConnector.agent(agent.id)
|
|
81
|
+
.deploy(config.id, {
|
|
82
|
+
code,
|
|
83
|
+
inputs: codeInputs,
|
|
84
|
+
}, {
|
|
85
|
+
runtime: 'nodejs',
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
const executionResponse = await codeConnector.agent(agent.id).execute(config.id, codeInputs);
|
|
90
|
+
const executionTime = executionResponse.executionTime;
|
|
91
|
+
logger.debug(
|
|
92
|
+
`Code result:\n ${typeof executionResponse.output === 'object' ? JSON.stringify(executionResponse.output, null, 2) : executionResponse.output
|
|
93
|
+
}\n`,
|
|
94
|
+
);
|
|
95
|
+
logger.debug(`Execution time: ${executionTime}ms\n`);
|
|
96
|
+
|
|
97
|
+
const cost = calculateExecutionCost(executionTime);
|
|
98
|
+
if (!codeCredentials.isUserProvidedKeys) {
|
|
99
|
+
const accountConnector = ConnectorService.getAccountConnector();
|
|
100
|
+
const agentTeam = await accountConnector.getCandidateTeam(AccessCandidate.agent(agent.id));
|
|
101
|
+
reportUsage({ cost, agentId: agent.id, teamId: agentTeam });
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (executionResponse.success) {
|
|
105
|
+
Output = executionResponse.output;
|
|
106
|
+
} else {
|
|
107
|
+
Output = undefined;
|
|
108
|
+
_error = executionResponse.errors;
|
|
109
|
+
}
|
|
110
|
+
} catch (error: any) {
|
|
111
|
+
logger.error(`Error running code \n${error}\n`);
|
|
112
|
+
_error = error?.response?.data || error?.message || error.toString();
|
|
113
|
+
Output = undefined; //prevents running next component if the code execution failed
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
return { Output, _error, _debug: logger.output };
|
|
117
|
+
} catch (err: any) {
|
|
118
|
+
const _error = err?.response?.data || err?.message || err.toString();
|
|
119
|
+
logger.error(` Error running code \n${_error}\n`);
|
|
120
|
+
return { Output: undefined, _error, _debug: logger.output };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|