@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,250 +1,250 @@
|
|
|
1
|
-
import EventEmitter from 'events';
|
|
2
|
-
import axios, { AxiosInstance } from 'axios';
|
|
3
|
-
|
|
4
|
-
import { JSON_RESPONSE_INSTRUCTION, BUILT_IN_MODEL_PREFIX } from '@sre/constants';
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
ToolData,
|
|
8
|
-
TLLMMessageBlock,
|
|
9
|
-
TLLMToolResultMessageBlock,
|
|
10
|
-
TLLMMessageRole,
|
|
11
|
-
APIKeySource,
|
|
12
|
-
BasicCredentials,
|
|
13
|
-
ILLMRequestFuncParams,
|
|
14
|
-
TLLMChatResponse,
|
|
15
|
-
ILLMRequestContext,
|
|
16
|
-
TLLMPreparedParams,
|
|
17
|
-
} from '@sre/types/LLM.types';
|
|
18
|
-
import { LLMHelper } from '@sre/LLMManager/LLM.helper';
|
|
19
|
-
|
|
20
|
-
import { LLMConnector } from '../LLMConnector';
|
|
21
|
-
import { SystemEvents } from '@sre/Core/SystemEvents';
|
|
22
|
-
|
|
23
|
-
type ChatCompletionParams = {
|
|
24
|
-
model: string;
|
|
25
|
-
messages: any[];
|
|
26
|
-
max_tokens?: number;
|
|
27
|
-
temperature?: number;
|
|
28
|
-
top_p?: number;
|
|
29
|
-
top_k?: number;
|
|
30
|
-
frequency_penalty?: number;
|
|
31
|
-
presence_penalty?: number;
|
|
32
|
-
response_format?: { type: string };
|
|
33
|
-
};
|
|
34
|
-
type TUsage = {
|
|
35
|
-
prompt_tokens: number;
|
|
36
|
-
completion_tokens: number;
|
|
37
|
-
total_tokens: number;
|
|
38
|
-
prompt_tokens_details?: { cached_tokens?: number };
|
|
39
|
-
reasoning_tokens?: number;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
// TODO [Forhad]: Need to adjust some type definitions
|
|
43
|
-
|
|
44
|
-
export class PerplexityConnector extends LLMConnector {
|
|
45
|
-
public name = 'LLM:Perplexity';
|
|
46
|
-
|
|
47
|
-
private async getClient(params: ILLMRequestContext): Promise<AxiosInstance> {
|
|
48
|
-
const apiKey = (params.credentials as BasicCredentials)?.apiKey;
|
|
49
|
-
|
|
50
|
-
if (!apiKey) throw new Error('Please provide an API key for Perplexity');
|
|
51
|
-
|
|
52
|
-
return axios.create({
|
|
53
|
-
baseURL: params?.modelInfo?.baseURL,
|
|
54
|
-
headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
protected async request({ acRequest, body, context }: ILLMRequestFuncParams): Promise<TLLMChatResponse> {
|
|
59
|
-
try {
|
|
60
|
-
const perplexity = await this.getClient(context);
|
|
61
|
-
const response = await perplexity.post('/chat/completions', body);
|
|
62
|
-
|
|
63
|
-
const content = response?.data?.choices?.[0]?.message.content;
|
|
64
|
-
const finishReason = response?.data?.choices?.[0]?.finish_reason;
|
|
65
|
-
const usage = response?.data?.usage as any;
|
|
66
|
-
|
|
67
|
-
this.reportUsage(usage, {
|
|
68
|
-
modelEntryName: context.modelEntryName,
|
|
69
|
-
keySource: context.isUserKey ? APIKeySource.User : APIKeySource.Smyth,
|
|
70
|
-
agentId: context.agentId,
|
|
71
|
-
teamId: context.teamId,
|
|
72
|
-
});
|
|
73
|
-
|
|
74
|
-
return {
|
|
75
|
-
content,
|
|
76
|
-
finishReason,
|
|
77
|
-
useTool: false,
|
|
78
|
-
toolsData: [],
|
|
79
|
-
message: { content, role: 'assistant' },
|
|
80
|
-
usage,
|
|
81
|
-
};
|
|
82
|
-
} catch (error) {
|
|
83
|
-
throw error;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
protected async streamRequest({ acRequest, body, context }: ILLMRequestFuncParams): Promise<EventEmitter> {
|
|
88
|
-
//throw new Error('Multimodal request is not supported for Perplexity.');
|
|
89
|
-
//fallback to chatRequest
|
|
90
|
-
const emitter = new EventEmitter();
|
|
91
|
-
|
|
92
|
-
setTimeout(() => {
|
|
93
|
-
try {
|
|
94
|
-
this.request({ acRequest, body, context })
|
|
95
|
-
.then((respose) => {
|
|
96
|
-
const finishReason = respose.finishReason;
|
|
97
|
-
const usage = respose.usage;
|
|
98
|
-
|
|
99
|
-
emitter.emit('interrupted', finishReason);
|
|
100
|
-
emitter.emit('content', respose.content);
|
|
101
|
-
emitter.emit('end', undefined, usage, finishReason);
|
|
102
|
-
})
|
|
103
|
-
.catch((error) => {
|
|
104
|
-
emitter.emit('error', error.message || error.toString());
|
|
105
|
-
});
|
|
106
|
-
//emitter.emit('finishReason', respose.finishReason);
|
|
107
|
-
} catch (error) {
|
|
108
|
-
emitter.emit('error', error.message || error.toString());
|
|
109
|
-
}
|
|
110
|
-
}, 100);
|
|
111
|
-
|
|
112
|
-
return emitter;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
protected async reqBodyAdapter(params: TLLMPreparedParams): Promise<ChatCompletionParams> {
|
|
116
|
-
const messages = params?.messages || [];
|
|
117
|
-
|
|
118
|
-
//#region Handle JSON response format
|
|
119
|
-
// TODO: For now attach JSON response instruction, Perplexity has option to provide response_format as parameter. We'll check it later
|
|
120
|
-
const responseFormat = params?.responseFormat || '';
|
|
121
|
-
if (responseFormat === 'json') {
|
|
122
|
-
// We assume that the system message is first item in messages array
|
|
123
|
-
if (messages?.[0]?.role === TLLMMessageRole.System) {
|
|
124
|
-
messages[0].content += JSON_RESPONSE_INSTRUCTION;
|
|
125
|
-
} else {
|
|
126
|
-
messages.unshift({ role: TLLMMessageRole.System, content: JSON_RESPONSE_INSTRUCTION });
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
delete params.responseFormat;
|
|
130
|
-
}
|
|
131
|
-
//#endregion Handle JSON response format
|
|
132
|
-
|
|
133
|
-
const body: ChatCompletionParams = {
|
|
134
|
-
model: params.model as string,
|
|
135
|
-
messages,
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
if (params?.maxTokens !== undefined) body.max_tokens = params.maxTokens;
|
|
139
|
-
if (params?.temperature !== undefined) body.temperature = params.temperature;
|
|
140
|
-
if (params?.topP !== undefined) body.top_p = params.topP;
|
|
141
|
-
if (params?.topK !== undefined) body.top_k = params.topK;
|
|
142
|
-
if (params?.frequencyPenalty) body.frequency_penalty = params.frequencyPenalty;
|
|
143
|
-
if (params?.presencePenalty !== undefined) body.presence_penalty = params.presencePenalty;
|
|
144
|
-
|
|
145
|
-
if (params.responseFormat) {
|
|
146
|
-
body.response_format = params.responseFormat;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return body;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
protected reportUsage(usage: TUsage, metadata: { modelEntryName: string; keySource: APIKeySource; agentId: string; teamId: string }) {
|
|
153
|
-
// SmythOS (built-in) models have a prefix, so we need to remove it to get the model name
|
|
154
|
-
const modelName = metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX, '');
|
|
155
|
-
|
|
156
|
-
const usageData = {
|
|
157
|
-
sourceId: `llm:${modelName}`,
|
|
158
|
-
input_tokens: usage?.prompt_tokens - (usage?.prompt_tokens_details?.cached_tokens || 0),
|
|
159
|
-
output_tokens: usage?.completion_tokens,
|
|
160
|
-
input_tokens_cache_write: 0,
|
|
161
|
-
input_tokens_cache_read: usage?.prompt_tokens_details?.cached_tokens || 0,
|
|
162
|
-
reasoning_tokens: usage?.reasoning_tokens || 0,
|
|
163
|
-
keySource: metadata.keySource,
|
|
164
|
-
agentId: metadata.agentId,
|
|
165
|
-
teamId: metadata.teamId,
|
|
166
|
-
};
|
|
167
|
-
SystemEvents.emit('USAGE:LLM', usageData);
|
|
168
|
-
|
|
169
|
-
return usageData;
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
public formatToolsConfig({ type = 'function', toolDefinitions, toolChoice = 'auto' }) {
|
|
173
|
-
let tools: any[] = [];
|
|
174
|
-
|
|
175
|
-
if (type === 'function') {
|
|
176
|
-
tools = toolDefinitions.map((tool) => {
|
|
177
|
-
const { name, description, properties, requiredFields } = tool;
|
|
178
|
-
|
|
179
|
-
return {
|
|
180
|
-
type: 'function',
|
|
181
|
-
function: {
|
|
182
|
-
name,
|
|
183
|
-
description,
|
|
184
|
-
parameters: {
|
|
185
|
-
type: 'object',
|
|
186
|
-
properties,
|
|
187
|
-
required: requiredFields,
|
|
188
|
-
},
|
|
189
|
-
},
|
|
190
|
-
};
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
return tools?.length > 0 ? { tools, tool_choice: toolChoice || 'auto' } : {};
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
public transformToolMessageBlocks({
|
|
198
|
-
messageBlock,
|
|
199
|
-
toolsData,
|
|
200
|
-
}: {
|
|
201
|
-
messageBlock: TLLMMessageBlock;
|
|
202
|
-
toolsData: ToolData[];
|
|
203
|
-
}): TLLMToolResultMessageBlock[] {
|
|
204
|
-
const messageBlocks: TLLMToolResultMessageBlock[] = [];
|
|
205
|
-
|
|
206
|
-
if (messageBlock) {
|
|
207
|
-
const transformedMessageBlock = {
|
|
208
|
-
...messageBlock,
|
|
209
|
-
content: typeof messageBlock.content === 'object' ? JSON.stringify(messageBlock.content) : messageBlock.content,
|
|
210
|
-
};
|
|
211
|
-
if (transformedMessageBlock.tool_calls) {
|
|
212
|
-
for (let toolCall of transformedMessageBlock.tool_calls) {
|
|
213
|
-
toolCall.function.arguments =
|
|
214
|
-
typeof toolCall.function.arguments === 'object' ? JSON.stringify(toolCall.function.arguments) : toolCall.function.arguments;
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
messageBlocks.push(transformedMessageBlock);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
const transformedToolsData = toolsData.map((toolData) => ({
|
|
221
|
-
tool_call_id: toolData.id,
|
|
222
|
-
role: TLLMMessageRole.Tool, // toolData.role as TLLMMessageRole, //should always be 'tool' for OpenAI
|
|
223
|
-
name: toolData.name,
|
|
224
|
-
content: typeof toolData.result === 'string' ? toolData.result : JSON.stringify(toolData.result), // Ensure content is a string
|
|
225
|
-
}));
|
|
226
|
-
|
|
227
|
-
return [...messageBlocks, ...transformedToolsData];
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
public getConsistentMessages(messages) {
|
|
231
|
-
const _messages = LLMHelper.removeDuplicateUserMessages(messages);
|
|
232
|
-
|
|
233
|
-
return _messages.map((message) => {
|
|
234
|
-
const _message = { ...message };
|
|
235
|
-
let textContent = '';
|
|
236
|
-
|
|
237
|
-
if (message?.parts) {
|
|
238
|
-
textContent = message.parts.map((textBlock) => textBlock?.text || '').join(' ');
|
|
239
|
-
} else if (Array.isArray(message?.content)) {
|
|
240
|
-
textContent = message.content.map((textBlock) => textBlock?.text || '').join(' ');
|
|
241
|
-
} else if (message?.content) {
|
|
242
|
-
textContent = message.content;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
_message.content = textContent;
|
|
246
|
-
|
|
247
|
-
return _message;
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
}
|
|
1
|
+
import EventEmitter from 'events';
|
|
2
|
+
import axios, { AxiosInstance } from 'axios';
|
|
3
|
+
|
|
4
|
+
import { JSON_RESPONSE_INSTRUCTION, BUILT_IN_MODEL_PREFIX } from '@sre/constants';
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
ToolData,
|
|
8
|
+
TLLMMessageBlock,
|
|
9
|
+
TLLMToolResultMessageBlock,
|
|
10
|
+
TLLMMessageRole,
|
|
11
|
+
APIKeySource,
|
|
12
|
+
BasicCredentials,
|
|
13
|
+
ILLMRequestFuncParams,
|
|
14
|
+
TLLMChatResponse,
|
|
15
|
+
ILLMRequestContext,
|
|
16
|
+
TLLMPreparedParams,
|
|
17
|
+
} from '@sre/types/LLM.types';
|
|
18
|
+
import { LLMHelper } from '@sre/LLMManager/LLM.helper';
|
|
19
|
+
|
|
20
|
+
import { LLMConnector } from '../LLMConnector';
|
|
21
|
+
import { SystemEvents } from '@sre/Core/SystemEvents';
|
|
22
|
+
|
|
23
|
+
type ChatCompletionParams = {
|
|
24
|
+
model: string;
|
|
25
|
+
messages: any[];
|
|
26
|
+
max_tokens?: number;
|
|
27
|
+
temperature?: number;
|
|
28
|
+
top_p?: number;
|
|
29
|
+
top_k?: number;
|
|
30
|
+
frequency_penalty?: number;
|
|
31
|
+
presence_penalty?: number;
|
|
32
|
+
response_format?: { type: string };
|
|
33
|
+
};
|
|
34
|
+
type TUsage = {
|
|
35
|
+
prompt_tokens: number;
|
|
36
|
+
completion_tokens: number;
|
|
37
|
+
total_tokens: number;
|
|
38
|
+
prompt_tokens_details?: { cached_tokens?: number };
|
|
39
|
+
reasoning_tokens?: number;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
// TODO [Forhad]: Need to adjust some type definitions
|
|
43
|
+
|
|
44
|
+
export class PerplexityConnector extends LLMConnector {
|
|
45
|
+
public name = 'LLM:Perplexity';
|
|
46
|
+
|
|
47
|
+
private async getClient(params: ILLMRequestContext): Promise<AxiosInstance> {
|
|
48
|
+
const apiKey = (params.credentials as BasicCredentials)?.apiKey;
|
|
49
|
+
|
|
50
|
+
if (!apiKey) throw new Error('Please provide an API key for Perplexity');
|
|
51
|
+
|
|
52
|
+
return axios.create({
|
|
53
|
+
baseURL: params?.modelInfo?.baseURL,
|
|
54
|
+
headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
protected async request({ acRequest, body, context }: ILLMRequestFuncParams): Promise<TLLMChatResponse> {
|
|
59
|
+
try {
|
|
60
|
+
const perplexity = await this.getClient(context);
|
|
61
|
+
const response = await perplexity.post('/chat/completions', body);
|
|
62
|
+
|
|
63
|
+
const content = response?.data?.choices?.[0]?.message.content;
|
|
64
|
+
const finishReason = response?.data?.choices?.[0]?.finish_reason;
|
|
65
|
+
const usage = response?.data?.usage as any;
|
|
66
|
+
|
|
67
|
+
this.reportUsage(usage, {
|
|
68
|
+
modelEntryName: context.modelEntryName,
|
|
69
|
+
keySource: context.isUserKey ? APIKeySource.User : APIKeySource.Smyth,
|
|
70
|
+
agentId: context.agentId,
|
|
71
|
+
teamId: context.teamId,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
content,
|
|
76
|
+
finishReason,
|
|
77
|
+
useTool: false,
|
|
78
|
+
toolsData: [],
|
|
79
|
+
message: { content, role: 'assistant' },
|
|
80
|
+
usage,
|
|
81
|
+
};
|
|
82
|
+
} catch (error) {
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
protected async streamRequest({ acRequest, body, context }: ILLMRequestFuncParams): Promise<EventEmitter> {
|
|
88
|
+
//throw new Error('Multimodal request is not supported for Perplexity.');
|
|
89
|
+
//fallback to chatRequest
|
|
90
|
+
const emitter = new EventEmitter();
|
|
91
|
+
|
|
92
|
+
setTimeout(() => {
|
|
93
|
+
try {
|
|
94
|
+
this.request({ acRequest, body, context })
|
|
95
|
+
.then((respose) => {
|
|
96
|
+
const finishReason = respose.finishReason;
|
|
97
|
+
const usage = respose.usage;
|
|
98
|
+
|
|
99
|
+
emitter.emit('interrupted', finishReason);
|
|
100
|
+
emitter.emit('content', respose.content);
|
|
101
|
+
emitter.emit('end', undefined, usage, finishReason);
|
|
102
|
+
})
|
|
103
|
+
.catch((error) => {
|
|
104
|
+
emitter.emit('error', error.message || error.toString());
|
|
105
|
+
});
|
|
106
|
+
//emitter.emit('finishReason', respose.finishReason);
|
|
107
|
+
} catch (error) {
|
|
108
|
+
emitter.emit('error', error.message || error.toString());
|
|
109
|
+
}
|
|
110
|
+
}, 100);
|
|
111
|
+
|
|
112
|
+
return emitter;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
protected async reqBodyAdapter(params: TLLMPreparedParams): Promise<ChatCompletionParams> {
|
|
116
|
+
const messages = params?.messages || [];
|
|
117
|
+
|
|
118
|
+
//#region Handle JSON response format
|
|
119
|
+
// TODO: For now attach JSON response instruction, Perplexity has option to provide response_format as parameter. We'll check it later
|
|
120
|
+
const responseFormat = params?.responseFormat || '';
|
|
121
|
+
if (responseFormat === 'json') {
|
|
122
|
+
// We assume that the system message is first item in messages array
|
|
123
|
+
if (messages?.[0]?.role === TLLMMessageRole.System) {
|
|
124
|
+
messages[0].content += JSON_RESPONSE_INSTRUCTION;
|
|
125
|
+
} else {
|
|
126
|
+
messages.unshift({ role: TLLMMessageRole.System, content: JSON_RESPONSE_INSTRUCTION });
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
delete params.responseFormat;
|
|
130
|
+
}
|
|
131
|
+
//#endregion Handle JSON response format
|
|
132
|
+
|
|
133
|
+
const body: ChatCompletionParams = {
|
|
134
|
+
model: params.model as string,
|
|
135
|
+
messages,
|
|
136
|
+
};
|
|
137
|
+
|
|
138
|
+
if (params?.maxTokens !== undefined) body.max_tokens = params.maxTokens;
|
|
139
|
+
if (params?.temperature !== undefined) body.temperature = params.temperature;
|
|
140
|
+
if (params?.topP !== undefined) body.top_p = params.topP;
|
|
141
|
+
if (params?.topK !== undefined) body.top_k = params.topK;
|
|
142
|
+
if (params?.frequencyPenalty) body.frequency_penalty = params.frequencyPenalty;
|
|
143
|
+
if (params?.presencePenalty !== undefined) body.presence_penalty = params.presencePenalty;
|
|
144
|
+
|
|
145
|
+
if (params.responseFormat) {
|
|
146
|
+
body.response_format = params.responseFormat;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return body;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
protected reportUsage(usage: TUsage, metadata: { modelEntryName: string; keySource: APIKeySource; agentId: string; teamId: string }) {
|
|
153
|
+
// SmythOS (built-in) models have a prefix, so we need to remove it to get the model name
|
|
154
|
+
const modelName = metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX, '');
|
|
155
|
+
|
|
156
|
+
const usageData = {
|
|
157
|
+
sourceId: `llm:${modelName}`,
|
|
158
|
+
input_tokens: usage?.prompt_tokens - (usage?.prompt_tokens_details?.cached_tokens || 0),
|
|
159
|
+
output_tokens: usage?.completion_tokens,
|
|
160
|
+
input_tokens_cache_write: 0,
|
|
161
|
+
input_tokens_cache_read: usage?.prompt_tokens_details?.cached_tokens || 0,
|
|
162
|
+
reasoning_tokens: usage?.reasoning_tokens || 0,
|
|
163
|
+
keySource: metadata.keySource,
|
|
164
|
+
agentId: metadata.agentId,
|
|
165
|
+
teamId: metadata.teamId,
|
|
166
|
+
};
|
|
167
|
+
SystemEvents.emit('USAGE:LLM', usageData);
|
|
168
|
+
|
|
169
|
+
return usageData;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
public formatToolsConfig({ type = 'function', toolDefinitions, toolChoice = 'auto' }) {
|
|
173
|
+
let tools: any[] = [];
|
|
174
|
+
|
|
175
|
+
if (type === 'function') {
|
|
176
|
+
tools = toolDefinitions.map((tool) => {
|
|
177
|
+
const { name, description, properties, requiredFields } = tool;
|
|
178
|
+
|
|
179
|
+
return {
|
|
180
|
+
type: 'function',
|
|
181
|
+
function: {
|
|
182
|
+
name,
|
|
183
|
+
description,
|
|
184
|
+
parameters: {
|
|
185
|
+
type: 'object',
|
|
186
|
+
properties,
|
|
187
|
+
required: requiredFields,
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return tools?.length > 0 ? { tools, tool_choice: toolChoice || 'auto' } : {};
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
public transformToolMessageBlocks({
|
|
198
|
+
messageBlock,
|
|
199
|
+
toolsData,
|
|
200
|
+
}: {
|
|
201
|
+
messageBlock: TLLMMessageBlock;
|
|
202
|
+
toolsData: ToolData[];
|
|
203
|
+
}): TLLMToolResultMessageBlock[] {
|
|
204
|
+
const messageBlocks: TLLMToolResultMessageBlock[] = [];
|
|
205
|
+
|
|
206
|
+
if (messageBlock) {
|
|
207
|
+
const transformedMessageBlock = {
|
|
208
|
+
...messageBlock,
|
|
209
|
+
content: typeof messageBlock.content === 'object' ? JSON.stringify(messageBlock.content) : messageBlock.content,
|
|
210
|
+
};
|
|
211
|
+
if (transformedMessageBlock.tool_calls) {
|
|
212
|
+
for (let toolCall of transformedMessageBlock.tool_calls) {
|
|
213
|
+
toolCall.function.arguments =
|
|
214
|
+
typeof toolCall.function.arguments === 'object' ? JSON.stringify(toolCall.function.arguments) : toolCall.function.arguments;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
messageBlocks.push(transformedMessageBlock);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const transformedToolsData = toolsData.map((toolData) => ({
|
|
221
|
+
tool_call_id: toolData.id,
|
|
222
|
+
role: TLLMMessageRole.Tool, // toolData.role as TLLMMessageRole, //should always be 'tool' for OpenAI
|
|
223
|
+
name: toolData.name,
|
|
224
|
+
content: typeof toolData.result === 'string' ? toolData.result : JSON.stringify(toolData.result), // Ensure content is a string
|
|
225
|
+
}));
|
|
226
|
+
|
|
227
|
+
return [...messageBlocks, ...transformedToolsData];
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
public getConsistentMessages(messages) {
|
|
231
|
+
const _messages = LLMHelper.removeDuplicateUserMessages(messages);
|
|
232
|
+
|
|
233
|
+
return _messages.map((message) => {
|
|
234
|
+
const _message = { ...message };
|
|
235
|
+
let textContent = '';
|
|
236
|
+
|
|
237
|
+
if (message?.parts) {
|
|
238
|
+
textContent = message.parts.map((textBlock) => textBlock?.text || '').join(' ');
|
|
239
|
+
} else if (Array.isArray(message?.content)) {
|
|
240
|
+
textContent = message.content.map((textBlock) => textBlock?.text || '').join(' ');
|
|
241
|
+
} else if (message?.content) {
|
|
242
|
+
textContent = message.content;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
_message.content = textContent;
|
|
246
|
+
|
|
247
|
+
return _message;
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|