@smythos/sre 1.5.0 → 1.5.2
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 +62 -0
- package/LICENSE +18 -0
- package/package.json +127 -115
- package/src/Components/APICall/APICall.class.ts +155 -0
- package/src/Components/APICall/AccessTokenManager.ts +130 -0
- package/src/Components/APICall/ArrayBufferResponse.helper.ts +58 -0
- package/src/Components/APICall/OAuth.helper.ts +294 -0
- package/src/Components/APICall/mimeTypeCategories.ts +46 -0
- package/src/Components/APICall/parseData.ts +167 -0
- package/src/Components/APICall/parseHeaders.ts +41 -0
- package/src/Components/APICall/parseProxy.ts +68 -0
- package/src/Components/APICall/parseUrl.ts +91 -0
- package/src/Components/APIEndpoint.class.ts +234 -0
- package/src/Components/APIOutput.class.ts +58 -0
- package/src/Components/AgentPlugin.class.ts +102 -0
- package/src/Components/Async.class.ts +155 -0
- package/src/Components/Await.class.ts +90 -0
- package/src/Components/Classifier.class.ts +158 -0
- package/src/Components/Component.class.ts +94 -0
- package/src/Components/ComponentHost.class.ts +38 -0
- package/src/Components/DataSourceCleaner.class.ts +92 -0
- package/src/Components/DataSourceIndexer.class.ts +181 -0
- package/src/Components/DataSourceLookup.class.ts +141 -0
- package/src/Components/FEncDec.class.ts +29 -0
- package/src/Components/FHash.class.ts +33 -0
- package/src/Components/FSign.class.ts +80 -0
- package/src/Components/FSleep.class.ts +25 -0
- package/src/Components/FTimestamp.class.ts +25 -0
- package/src/Components/FileStore.class.ts +75 -0
- package/src/Components/ForEach.class.ts +97 -0
- package/src/Components/GPTPlugin.class.ts +70 -0
- package/src/Components/GenAILLM.class.ts +395 -0
- package/src/Components/HuggingFace.class.ts +314 -0
- package/src/Components/Image/imageSettings.config.ts +70 -0
- package/src/Components/ImageGenerator.class.ts +407 -0
- package/src/Components/JSONFilter.class.ts +54 -0
- package/src/Components/LLMAssistant.class.ts +213 -0
- package/src/Components/LogicAND.class.ts +28 -0
- package/src/Components/LogicAtLeast.class.ts +85 -0
- package/src/Components/LogicAtMost.class.ts +86 -0
- package/src/Components/LogicOR.class.ts +29 -0
- package/src/Components/LogicXOR.class.ts +34 -0
- package/src/Components/MCPClient.class.ts +112 -0
- package/src/Components/PromptGenerator.class.ts +122 -0
- package/src/Components/ScrapflyWebScrape.class.ts +159 -0
- package/src/Components/TavilyWebSearch.class.ts +98 -0
- package/src/Components/index.ts +77 -0
- package/src/Core/AgentProcess.helper.ts +240 -0
- package/src/Core/Connector.class.ts +123 -0
- package/src/Core/ConnectorsService.ts +192 -0
- package/src/Core/DummyConnector.ts +49 -0
- package/src/Core/HookService.ts +105 -0
- package/src/Core/SmythRuntime.class.ts +292 -0
- package/src/Core/SystemEvents.ts +15 -0
- package/src/Core/boot.ts +55 -0
- package/src/config.ts +15 -0
- package/src/constants.ts +125 -0
- package/src/data/hugging-face.params.json +580 -0
- package/src/helpers/BinaryInput.helper.ts +324 -0
- package/src/helpers/Conversation.helper.ts +1094 -0
- package/src/helpers/JsonContent.helper.ts +97 -0
- package/src/helpers/LocalCache.helper.ts +97 -0
- package/src/helpers/Log.helper.ts +234 -0
- package/src/helpers/OpenApiParser.helper.ts +150 -0
- package/src/helpers/S3Cache.helper.ts +129 -0
- package/src/helpers/SmythURI.helper.ts +5 -0
- package/src/helpers/TemplateString.helper.ts +243 -0
- package/src/helpers/TypeChecker.helper.ts +329 -0
- package/src/index.ts +179 -0
- package/src/index.ts.bak +179 -0
- package/src/subsystems/AgentManager/Agent.class.ts +1108 -0
- package/src/subsystems/AgentManager/Agent.helper.ts +3 -0
- package/src/subsystems/AgentManager/AgentData.service/AgentDataConnector.ts +230 -0
- package/src/subsystems/AgentManager/AgentData.service/connectors/CLIAgentDataConnector.class.ts +66 -0
- package/src/subsystems/AgentManager/AgentData.service/connectors/LocalAgentDataConnector.class.ts +142 -0
- package/src/subsystems/AgentManager/AgentData.service/connectors/NullAgentData.class.ts +39 -0
- package/src/subsystems/AgentManager/AgentData.service/index.ts +18 -0
- package/src/subsystems/AgentManager/AgentLogger.class.ts +297 -0
- package/src/subsystems/AgentManager/AgentRequest.class.ts +51 -0
- package/src/subsystems/AgentManager/AgentRuntime.class.ts +559 -0
- package/src/subsystems/AgentManager/AgentSSE.class.ts +101 -0
- package/src/subsystems/AgentManager/AgentSettings.class.ts +52 -0
- package/src/subsystems/AgentManager/Component.service/ComponentConnector.ts +32 -0
- package/src/subsystems/AgentManager/Component.service/connectors/LocalComponentConnector.class.ts +59 -0
- package/src/subsystems/AgentManager/Component.service/index.ts +11 -0
- package/src/subsystems/AgentManager/EmbodimentSettings.class.ts +47 -0
- package/src/subsystems/AgentManager/ForkedAgent.class.ts +153 -0
- package/src/subsystems/AgentManager/OSResourceMonitor.ts +77 -0
- package/src/subsystems/ComputeManager/Code.service/CodeConnector.ts +99 -0
- package/src/subsystems/ComputeManager/Code.service/connectors/AWSLambdaCode.class.ts +63 -0
- package/src/subsystems/ComputeManager/Code.service/index.ts +11 -0
- package/src/subsystems/IO/CLI.service/CLIConnector.ts +47 -0
- package/src/subsystems/IO/CLI.service/index.ts +9 -0
- package/src/subsystems/IO/Log.service/LogConnector.ts +32 -0
- package/src/subsystems/IO/Log.service/connectors/ConsoleLog.class.ts +28 -0
- package/src/subsystems/IO/Log.service/index.ts +13 -0
- package/src/subsystems/IO/NKV.service/NKVConnector.ts +41 -0
- package/src/subsystems/IO/NKV.service/connectors/NKVRAM.class.ts +204 -0
- package/src/subsystems/IO/NKV.service/connectors/NKVRedis.class.ts +182 -0
- package/src/subsystems/IO/NKV.service/index.ts +12 -0
- package/src/subsystems/IO/Router.service/RouterConnector.ts +21 -0
- package/src/subsystems/IO/Router.service/connectors/ExpressRouter.class.ts +48 -0
- package/src/subsystems/IO/Router.service/connectors/NullRouter.class.ts +40 -0
- package/src/subsystems/IO/Router.service/index.ts +11 -0
- package/src/subsystems/IO/Storage.service/SmythFS.class.ts +472 -0
- package/src/subsystems/IO/Storage.service/StorageConnector.ts +66 -0
- package/src/subsystems/IO/Storage.service/connectors/LocalStorage.class.ts +305 -0
- package/src/subsystems/IO/Storage.service/connectors/S3Storage.class.ts +418 -0
- package/src/subsystems/IO/Storage.service/index.ts +13 -0
- package/src/subsystems/IO/VectorDB.service/VectorDBConnector.ts +108 -0
- package/src/subsystems/IO/VectorDB.service/connectors/MilvusVectorDB.class.ts +450 -0
- package/src/subsystems/IO/VectorDB.service/connectors/PineconeVectorDB.class.ts +373 -0
- package/src/subsystems/IO/VectorDB.service/connectors/RAMVecrtorDB.class.ts +420 -0
- package/src/subsystems/IO/VectorDB.service/embed/BaseEmbedding.ts +106 -0
- package/src/subsystems/IO/VectorDB.service/embed/OpenAIEmbedding.ts +109 -0
- package/src/subsystems/IO/VectorDB.service/embed/index.ts +21 -0
- package/src/subsystems/IO/VectorDB.service/index.ts +14 -0
- package/src/subsystems/LLMManager/LLM.helper.ts +221 -0
- package/src/subsystems/LLMManager/LLM.inference.ts +335 -0
- package/src/subsystems/LLMManager/LLM.service/LLMConnector.ts +374 -0
- package/src/subsystems/LLMManager/LLM.service/LLMCredentials.helper.ts +145 -0
- package/src/subsystems/LLMManager/LLM.service/connectors/Anthropic.class.ts +632 -0
- package/src/subsystems/LLMManager/LLM.service/connectors/Bedrock.class.ts +405 -0
- package/src/subsystems/LLMManager/LLM.service/connectors/Echo.class.ts +81 -0
- package/src/subsystems/LLMManager/LLM.service/connectors/GoogleAI.class.ts +689 -0
- package/src/subsystems/LLMManager/LLM.service/connectors/Groq.class.ts +257 -0
- package/src/subsystems/LLMManager/LLM.service/connectors/OpenAI.class.ts +848 -0
- package/src/subsystems/LLMManager/LLM.service/connectors/Perplexity.class.ts +255 -0
- package/src/subsystems/LLMManager/LLM.service/connectors/VertexAI.class.ts +193 -0
- package/src/subsystems/LLMManager/LLM.service/index.ts +43 -0
- package/src/subsystems/LLMManager/ModelsProvider.service/ModelsProviderConnector.ts +281 -0
- package/src/subsystems/LLMManager/ModelsProvider.service/connectors/SmythModelsProvider.class.ts +229 -0
- package/src/subsystems/LLMManager/ModelsProvider.service/index.ts +11 -0
- package/src/subsystems/LLMManager/custom-models.ts +854 -0
- package/src/subsystems/LLMManager/models.ts +2539 -0
- package/src/subsystems/LLMManager/paramMappings.ts +69 -0
- package/src/subsystems/MemoryManager/Cache.service/CacheConnector.ts +86 -0
- package/src/subsystems/MemoryManager/Cache.service/connectors/LocalStorageCache.class.ts +297 -0
- package/src/subsystems/MemoryManager/Cache.service/connectors/RAMCache.class.ts +201 -0
- package/src/subsystems/MemoryManager/Cache.service/connectors/RedisCache.class.ts +252 -0
- package/src/subsystems/MemoryManager/Cache.service/connectors/S3Cache.class.ts +373 -0
- package/src/subsystems/MemoryManager/Cache.service/index.ts +15 -0
- package/src/subsystems/MemoryManager/LLMCache.ts +72 -0
- package/src/subsystems/MemoryManager/LLMContext.ts +125 -0
- package/src/subsystems/MemoryManager/RuntimeContext.ts +249 -0
- package/src/subsystems/Security/AccessControl/ACL.class.ts +208 -0
- package/src/subsystems/Security/AccessControl/AccessCandidate.class.ts +76 -0
- package/src/subsystems/Security/AccessControl/AccessRequest.class.ts +52 -0
- package/src/subsystems/Security/Account.service/AccountConnector.ts +41 -0
- package/src/subsystems/Security/Account.service/connectors/AWSAccount.class.ts +76 -0
- package/src/subsystems/Security/Account.service/connectors/DummyAccount.class.ts +130 -0
- package/src/subsystems/Security/Account.service/connectors/JSONFileAccount.class.ts +159 -0
- package/src/subsystems/Security/Account.service/index.ts +14 -0
- package/src/subsystems/Security/Credentials.helper.ts +62 -0
- package/src/subsystems/Security/ManagedVault.service/ManagedVaultConnector.ts +34 -0
- package/src/subsystems/Security/ManagedVault.service/connectors/NullManagedVault.class.ts +57 -0
- package/src/subsystems/Security/ManagedVault.service/connectors/SecretManagerManagedVault.ts +154 -0
- package/src/subsystems/Security/ManagedVault.service/index.ts +12 -0
- package/src/subsystems/Security/SecureConnector.class.ts +110 -0
- package/src/subsystems/Security/Vault.service/Vault.helper.ts +30 -0
- package/src/subsystems/Security/Vault.service/VaultConnector.ts +26 -0
- package/src/subsystems/Security/Vault.service/connectors/HashicorpVault.class.ts +46 -0
- package/src/subsystems/Security/Vault.service/connectors/JSONFileVault.class.ts +166 -0
- package/src/subsystems/Security/Vault.service/connectors/NullVault.class.ts +54 -0
- package/src/subsystems/Security/Vault.service/connectors/SecretsManager.class.ts +140 -0
- package/src/subsystems/Security/Vault.service/index.ts +12 -0
- package/src/types/ACL.types.ts +104 -0
- package/src/types/AWS.types.ts +9 -0
- package/src/types/Agent.types.ts +61 -0
- package/src/types/AgentLogger.types.ts +17 -0
- package/src/types/Cache.types.ts +1 -0
- package/src/types/Common.types.ts +3 -0
- package/src/types/LLM.types.ts +419 -0
- package/src/types/Redis.types.ts +8 -0
- package/src/types/SRE.types.ts +64 -0
- package/src/types/Security.types.ts +18 -0
- package/src/types/Storage.types.ts +5 -0
- package/src/types/VectorDB.types.ts +78 -0
- package/src/utils/base64.utils.ts +275 -0
- package/src/utils/cli.utils.ts +68 -0
- package/src/utils/data.utils.ts +263 -0
- package/src/utils/date-time.utils.ts +22 -0
- package/src/utils/general.utils.ts +238 -0
- package/src/utils/index.ts +12 -0
- package/src/utils/numbers.utils.ts +13 -0
- package/src/utils/oauth.utils.ts +35 -0
- package/src/utils/string.utils.ts +414 -0
- package/src/utils/url.utils.ts +19 -0
- package/src/utils/validation.utils.ts +74 -0
|
@@ -0,0 +1,255 @@
|
|
|
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
|
+
TLLMParams,
|
|
8
|
+
ToolData,
|
|
9
|
+
TLLMMessageBlock,
|
|
10
|
+
TLLMToolResultMessageBlock,
|
|
11
|
+
TLLMMessageRole,
|
|
12
|
+
APIKeySource,
|
|
13
|
+
BasicCredentials,
|
|
14
|
+
ILLMRequestFuncParams,
|
|
15
|
+
TLLMChatResponse,
|
|
16
|
+
TLLMConnectorParams,
|
|
17
|
+
ILLMRequestContext,
|
|
18
|
+
} from '@sre/types/LLM.types';
|
|
19
|
+
import { LLMHelper } from '@sre/LLMManager/LLM.helper';
|
|
20
|
+
|
|
21
|
+
import { LLMConnector } from '../LLMConnector';
|
|
22
|
+
import { SystemEvents } from '@sre/Core/SystemEvents';
|
|
23
|
+
|
|
24
|
+
type ChatCompletionParams = {
|
|
25
|
+
model: string;
|
|
26
|
+
messages: any[];
|
|
27
|
+
max_tokens?: number;
|
|
28
|
+
temperature?: number;
|
|
29
|
+
top_p?: number;
|
|
30
|
+
top_k?: number;
|
|
31
|
+
frequency_penalty?: number;
|
|
32
|
+
presence_penalty?: number;
|
|
33
|
+
response_format?: { type: string };
|
|
34
|
+
};
|
|
35
|
+
type TUsage = {
|
|
36
|
+
prompt_tokens: number;
|
|
37
|
+
completion_tokens: number;
|
|
38
|
+
total_tokens: number;
|
|
39
|
+
prompt_tokens_details?: { cached_tokens?: number };
|
|
40
|
+
reasoning_tokens?: number;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
// TODO [Forhad]: Need to adjust some type definitions
|
|
44
|
+
|
|
45
|
+
export class PerplexityConnector extends LLMConnector {
|
|
46
|
+
public name = 'LLM:Perplexity';
|
|
47
|
+
|
|
48
|
+
private async getClient(params: ILLMRequestContext): Promise<AxiosInstance> {
|
|
49
|
+
const apiKey = (params.credentials as BasicCredentials)?.apiKey;
|
|
50
|
+
|
|
51
|
+
if (!apiKey) throw new Error('Please provide an API key for Perplexity');
|
|
52
|
+
|
|
53
|
+
return axios.create({
|
|
54
|
+
baseURL: params?.modelInfo?.baseURL,
|
|
55
|
+
headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
protected async request({ acRequest, body, context }: ILLMRequestFuncParams): Promise<TLLMChatResponse> {
|
|
60
|
+
try {
|
|
61
|
+
const perplexity = await this.getClient(context);
|
|
62
|
+
const response = await perplexity.post('/chat/completions', body);
|
|
63
|
+
|
|
64
|
+
const content = response?.data?.choices?.[0]?.message.content;
|
|
65
|
+
const finishReason = response?.data?.choices?.[0]?.finish_reason;
|
|
66
|
+
const usage = response?.data?.usage as any;
|
|
67
|
+
|
|
68
|
+
this.reportUsage(usage, {
|
|
69
|
+
modelEntryName: context.modelEntryName,
|
|
70
|
+
keySource: context.isUserKey ? APIKeySource.User : APIKeySource.Smyth,
|
|
71
|
+
agentId: context.agentId,
|
|
72
|
+
teamId: context.teamId,
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
content,
|
|
77
|
+
finishReason,
|
|
78
|
+
useTool: false,
|
|
79
|
+
toolsData: [],
|
|
80
|
+
message: { content, role: 'assistant' },
|
|
81
|
+
usage,
|
|
82
|
+
};
|
|
83
|
+
} catch (error) {
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
protected async streamRequest({ acRequest, body, context }: ILLMRequestFuncParams): Promise<EventEmitter> {
|
|
89
|
+
//throw new Error('Multimodal request is not supported for Perplexity.');
|
|
90
|
+
//fallback to chatRequest
|
|
91
|
+
const emitter = new EventEmitter();
|
|
92
|
+
|
|
93
|
+
setTimeout(() => {
|
|
94
|
+
try {
|
|
95
|
+
this.request({ acRequest, body, context })
|
|
96
|
+
.then((respose) => {
|
|
97
|
+
const finishReason = respose.finishReason;
|
|
98
|
+
const usage = respose.usage;
|
|
99
|
+
|
|
100
|
+
emitter.emit('interrupted', finishReason);
|
|
101
|
+
emitter.emit('content', respose.content);
|
|
102
|
+
emitter.emit('end', undefined, usage, finishReason);
|
|
103
|
+
})
|
|
104
|
+
.catch((error) => {
|
|
105
|
+
emitter.emit('error', error.message || error.toString());
|
|
106
|
+
});
|
|
107
|
+
//emitter.emit('finishReason', respose.finishReason);
|
|
108
|
+
} catch (error) {
|
|
109
|
+
emitter.emit('error', error.message || error.toString());
|
|
110
|
+
}
|
|
111
|
+
}, 100);
|
|
112
|
+
|
|
113
|
+
return emitter;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
protected async webSearchRequest({ acRequest, body, context }: ILLMRequestFuncParams): Promise<EventEmitter> {
|
|
117
|
+
throw new Error('Web search is not supported for Perplexity');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
protected async reqBodyAdapter(params: TLLMParams): Promise<ChatCompletionParams> {
|
|
121
|
+
const messages = params?.messages || [];
|
|
122
|
+
|
|
123
|
+
//#region Handle JSON response format
|
|
124
|
+
// TODO: For now attach JSON response instruction, Perplexity has option to provide response_format as parameter. We'll check it later
|
|
125
|
+
const responseFormat = params?.responseFormat || '';
|
|
126
|
+
if (responseFormat === 'json') {
|
|
127
|
+
// We assume that the system message is first item in messages array
|
|
128
|
+
if (messages?.[0]?.role === TLLMMessageRole.System) {
|
|
129
|
+
messages[0].content += JSON_RESPONSE_INSTRUCTION;
|
|
130
|
+
} else {
|
|
131
|
+
messages.unshift({ role: TLLMMessageRole.System, content: JSON_RESPONSE_INSTRUCTION });
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
delete params.responseFormat;
|
|
135
|
+
}
|
|
136
|
+
//#endregion Handle JSON response format
|
|
137
|
+
|
|
138
|
+
const body: ChatCompletionParams = {
|
|
139
|
+
model: params.model as string,
|
|
140
|
+
messages,
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
if (params?.maxTokens !== undefined) body.max_tokens = params.maxTokens;
|
|
144
|
+
if (params?.temperature !== undefined) body.temperature = params.temperature;
|
|
145
|
+
if (params?.topP !== undefined) body.top_p = params.topP;
|
|
146
|
+
if (params?.topK !== undefined) body.top_k = params.topK;
|
|
147
|
+
if (params?.frequencyPenalty) body.frequency_penalty = params.frequencyPenalty;
|
|
148
|
+
if (params?.presencePenalty !== undefined) body.presence_penalty = params.presencePenalty;
|
|
149
|
+
|
|
150
|
+
if (params.responseFormat) {
|
|
151
|
+
body.response_format = params.responseFormat;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return body;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
protected reportUsage(usage: TUsage, metadata: { modelEntryName: string; keySource: APIKeySource; agentId: string; teamId: string }) {
|
|
158
|
+
// SmythOS (built-in) models have a prefix, so we need to remove it to get the model name
|
|
159
|
+
const modelName = metadata.modelEntryName.replace(BUILT_IN_MODEL_PREFIX, '');
|
|
160
|
+
|
|
161
|
+
const usageData = {
|
|
162
|
+
sourceId: `llm:${modelName}`,
|
|
163
|
+
input_tokens: usage?.prompt_tokens - (usage?.prompt_tokens_details?.cached_tokens || 0),
|
|
164
|
+
output_tokens: usage?.completion_tokens,
|
|
165
|
+
input_tokens_cache_write: 0,
|
|
166
|
+
input_tokens_cache_read: usage?.prompt_tokens_details?.cached_tokens || 0,
|
|
167
|
+
reasoning_tokens: usage?.reasoning_tokens || 0,
|
|
168
|
+
keySource: metadata.keySource,
|
|
169
|
+
agentId: metadata.agentId,
|
|
170
|
+
teamId: metadata.teamId,
|
|
171
|
+
};
|
|
172
|
+
SystemEvents.emit('USAGE:LLM', usageData);
|
|
173
|
+
|
|
174
|
+
return usageData;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
public formatToolsConfig({ type = 'function', toolDefinitions, toolChoice = 'auto' }) {
|
|
178
|
+
let tools: any[] = [];
|
|
179
|
+
|
|
180
|
+
if (type === 'function') {
|
|
181
|
+
tools = toolDefinitions.map((tool) => {
|
|
182
|
+
const { name, description, properties, requiredFields } = tool;
|
|
183
|
+
|
|
184
|
+
return {
|
|
185
|
+
type: 'function',
|
|
186
|
+
function: {
|
|
187
|
+
name,
|
|
188
|
+
description,
|
|
189
|
+
parameters: {
|
|
190
|
+
type: 'object',
|
|
191
|
+
properties,
|
|
192
|
+
required: requiredFields,
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return tools?.length > 0 ? { tools, tool_choice: toolChoice || 'auto' } : {};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
public transformToolMessageBlocks({
|
|
203
|
+
messageBlock,
|
|
204
|
+
toolsData,
|
|
205
|
+
}: {
|
|
206
|
+
messageBlock: TLLMMessageBlock;
|
|
207
|
+
toolsData: ToolData[];
|
|
208
|
+
}): TLLMToolResultMessageBlock[] {
|
|
209
|
+
const messageBlocks: TLLMToolResultMessageBlock[] = [];
|
|
210
|
+
|
|
211
|
+
if (messageBlock) {
|
|
212
|
+
const transformedMessageBlock = {
|
|
213
|
+
...messageBlock,
|
|
214
|
+
content: typeof messageBlock.content === 'object' ? JSON.stringify(messageBlock.content) : messageBlock.content,
|
|
215
|
+
};
|
|
216
|
+
if (transformedMessageBlock.tool_calls) {
|
|
217
|
+
for (let toolCall of transformedMessageBlock.tool_calls) {
|
|
218
|
+
toolCall.function.arguments =
|
|
219
|
+
typeof toolCall.function.arguments === 'object' ? JSON.stringify(toolCall.function.arguments) : toolCall.function.arguments;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
messageBlocks.push(transformedMessageBlock);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const transformedToolsData = toolsData.map((toolData) => ({
|
|
226
|
+
tool_call_id: toolData.id,
|
|
227
|
+
role: TLLMMessageRole.Tool, // toolData.role as TLLMMessageRole, //should always be 'tool' for OpenAI
|
|
228
|
+
name: toolData.name,
|
|
229
|
+
content: typeof toolData.result === 'string' ? toolData.result : JSON.stringify(toolData.result), // Ensure content is a string
|
|
230
|
+
}));
|
|
231
|
+
|
|
232
|
+
return [...messageBlocks, ...transformedToolsData];
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
public getConsistentMessages(messages) {
|
|
236
|
+
const _messages = LLMHelper.removeDuplicateUserMessages(messages);
|
|
237
|
+
|
|
238
|
+
return _messages.map((message) => {
|
|
239
|
+
const _message = { ...message };
|
|
240
|
+
let textContent = '';
|
|
241
|
+
|
|
242
|
+
if (message?.parts) {
|
|
243
|
+
textContent = message.parts.map((textBlock) => textBlock?.text || '').join(' ');
|
|
244
|
+
} else if (Array.isArray(message?.content)) {
|
|
245
|
+
textContent = message.content.map((textBlock) => textBlock?.text || '').join(' ');
|
|
246
|
+
} else if (message?.content) {
|
|
247
|
+
textContent = message.content;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
_message.content = textContent;
|
|
251
|
+
|
|
252
|
+
return _message;
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { VertexAI, type GenerationConfig, type UsageMetadata } from '@google-cloud/vertexai';
|
|
2
|
+
import EventEmitter from 'events';
|
|
3
|
+
|
|
4
|
+
import { JSON_RESPONSE_INSTRUCTION, BUILT_IN_MODEL_PREFIX } from '@sre/constants';
|
|
5
|
+
import {
|
|
6
|
+
TLLMParams,
|
|
7
|
+
TCustomLLMModel,
|
|
8
|
+
APIKeySource,
|
|
9
|
+
TVertexAISettings,
|
|
10
|
+
ILLMRequestFuncParams,
|
|
11
|
+
TGoogleAIRequestBody,
|
|
12
|
+
TLLMConnectorParams,
|
|
13
|
+
ILLMRequestContext,
|
|
14
|
+
} from '@sre/types/LLM.types';
|
|
15
|
+
import { LLMHelper } from '@sre/LLMManager/LLM.helper';
|
|
16
|
+
|
|
17
|
+
import { LLMConnector } from '../LLMConnector';
|
|
18
|
+
import { SystemEvents } from '@sre/Core/SystemEvents';
|
|
19
|
+
|
|
20
|
+
//TODO: [AHMED/FORHAD]: test the usage reporting for VertexAI because by the time we were implementing the feature of usage reporting
|
|
21
|
+
// we had no access to VertexAI so we assumed it is working (potential bug)
|
|
22
|
+
|
|
23
|
+
export class VertexAIConnector extends LLMConnector {
|
|
24
|
+
public name = 'LLM:VertexAI';
|
|
25
|
+
|
|
26
|
+
private async getClient(params: ILLMRequestContext): Promise<VertexAI> {
|
|
27
|
+
const credentials = params.credentials as any;
|
|
28
|
+
const modelInfo = params.modelInfo as TCustomLLMModel;
|
|
29
|
+
const projectId = (modelInfo?.settings as TVertexAISettings)?.projectId;
|
|
30
|
+
const region = modelInfo?.settings?.region;
|
|
31
|
+
|
|
32
|
+
return new VertexAI({
|
|
33
|
+
project: projectId,
|
|
34
|
+
location: region,
|
|
35
|
+
googleAuthOptions: {
|
|
36
|
+
credentials: credentials as any,
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
protected async request({ acRequest, body, context }: ILLMRequestFuncParams): Promise<any> {
|
|
42
|
+
const messages = body.messages;
|
|
43
|
+
delete body.messages;
|
|
44
|
+
|
|
45
|
+
try {
|
|
46
|
+
const vertexAI = await this.getClient(context);
|
|
47
|
+
const generativeModel = vertexAI.getGenerativeModel(body);
|
|
48
|
+
|
|
49
|
+
const result = await generativeModel.generateContent({ contents: messages });
|
|
50
|
+
const content = result?.response?.candidates?.[0]?.content?.parts?.[0]?.text;
|
|
51
|
+
const usage = result?.response?.usageMetadata;
|
|
52
|
+
|
|
53
|
+
this.reportUsage(usage, {
|
|
54
|
+
modelEntryName: context.modelEntryName,
|
|
55
|
+
keySource: context.isUserKey ? APIKeySource.User : APIKeySource.Smyth,
|
|
56
|
+
agentId: context.agentId,
|
|
57
|
+
teamId: context.teamId,
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
content,
|
|
62
|
+
finishReason: 'stop',
|
|
63
|
+
useTool: false,
|
|
64
|
+
toolsData: [],
|
|
65
|
+
message: { content, role: 'assistant' },
|
|
66
|
+
usage,
|
|
67
|
+
};
|
|
68
|
+
} catch (error) {
|
|
69
|
+
throw error;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
protected async streamRequest({ acRequest, body, context }: ILLMRequestFuncParams): Promise<EventEmitter> {
|
|
74
|
+
// Simulate streaming similar to Perplexity's approach - fallback to regular request
|
|
75
|
+
const emitter = new EventEmitter();
|
|
76
|
+
|
|
77
|
+
setTimeout(() => {
|
|
78
|
+
try {
|
|
79
|
+
this.request({ acRequest, body, context })
|
|
80
|
+
.then((response) => {
|
|
81
|
+
const finishReason = response.finishReason;
|
|
82
|
+
const usage = response.usage;
|
|
83
|
+
|
|
84
|
+
// Emit the content as a stream-like response
|
|
85
|
+
emitter.emit('interrupted', finishReason);
|
|
86
|
+
emitter.emit('content', response.content);
|
|
87
|
+
emitter.emit('end', undefined, usage, finishReason);
|
|
88
|
+
})
|
|
89
|
+
.catch((error) => {
|
|
90
|
+
emitter.emit('error', error.message || error.toString());
|
|
91
|
+
});
|
|
92
|
+
} catch (error) {
|
|
93
|
+
emitter.emit('error', error.message || error.toString());
|
|
94
|
+
}
|
|
95
|
+
}, 100);
|
|
96
|
+
|
|
97
|
+
return emitter;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
protected async webSearchRequest({ acRequest, body, context }: ILLMRequestFuncParams): Promise<EventEmitter> {
|
|
101
|
+
throw new Error('Web search is not supported for Vertex AI');
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
protected async reqBodyAdapter(params: TLLMParams): Promise<TGoogleAIRequestBody> {
|
|
105
|
+
let messages = params?.messages || [];
|
|
106
|
+
|
|
107
|
+
//#region Separate system message and add JSON response instruction if needed
|
|
108
|
+
let systemInstruction;
|
|
109
|
+
const { systemMessage, otherMessages } = LLMHelper.separateSystemMessages(messages);
|
|
110
|
+
|
|
111
|
+
if ('content' in systemMessage) {
|
|
112
|
+
systemInstruction = systemMessage.content;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
messages = otherMessages;
|
|
116
|
+
|
|
117
|
+
const responseFormat = params?.responseFormat || '';
|
|
118
|
+
if (responseFormat === 'json') {
|
|
119
|
+
systemInstruction = JSON_RESPONSE_INSTRUCTION;
|
|
120
|
+
}
|
|
121
|
+
//#endregion Separate system message and add JSON response instruction if needed
|
|
122
|
+
|
|
123
|
+
const modelInfo = params.modelInfo as TCustomLLMModel;
|
|
124
|
+
|
|
125
|
+
let body: TGoogleAIRequestBody = {
|
|
126
|
+
model: modelInfo?.settings?.customModel || modelInfo?.settings?.foundationModel,
|
|
127
|
+
messages,
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const config: GenerationConfig = {};
|
|
131
|
+
|
|
132
|
+
if (params?.maxTokens !== undefined) config.maxOutputTokens = params.maxTokens;
|
|
133
|
+
if (params?.temperature !== undefined) config.temperature = params.temperature;
|
|
134
|
+
if (params?.topP !== undefined) config.topP = params.topP;
|
|
135
|
+
if (params?.topK !== undefined) config.topK = params.topK;
|
|
136
|
+
if (params?.stopSequences?.length) config.stopSequences = params.stopSequences;
|
|
137
|
+
|
|
138
|
+
if (systemInstruction) {
|
|
139
|
+
body.systemInstruction = systemInstruction;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (Object.keys(config).length > 0) {
|
|
143
|
+
body.generationConfig = config as any;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return body;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
protected reportUsage(
|
|
150
|
+
usage: UsageMetadata & { cachedContentTokenCount?: number },
|
|
151
|
+
metadata: { modelEntryName: string; keySource: APIKeySource; agentId: string; teamId: string }
|
|
152
|
+
) {
|
|
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.promptTokenCount || 0,
|
|
159
|
+
output_tokens: usage.candidatesTokenCount || 0,
|
|
160
|
+
input_tokens_cache_read: usage.cachedContentTokenCount || 0,
|
|
161
|
+
input_tokens_cache_write: 0,
|
|
162
|
+
keySource: metadata.keySource,
|
|
163
|
+
agentId: metadata.agentId,
|
|
164
|
+
teamId: metadata.teamId,
|
|
165
|
+
};
|
|
166
|
+
SystemEvents.emit('USAGE:LLM', usageData);
|
|
167
|
+
|
|
168
|
+
return usageData;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
public formatToolsConfig({ type = 'function', toolDefinitions, toolChoice = 'auto' }) {
|
|
172
|
+
throw new Error('Tool configuration is not currently implemented for Vertex AI');
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
public getConsistentMessages(messages) {
|
|
176
|
+
const _messages = LLMHelper.removeDuplicateUserMessages(messages);
|
|
177
|
+
|
|
178
|
+
return _messages.map((message) => {
|
|
179
|
+
let textBlock = [];
|
|
180
|
+
|
|
181
|
+
if (message?.parts) {
|
|
182
|
+
textBlock = message.parts;
|
|
183
|
+
} else if (message?.content) {
|
|
184
|
+
textBlock = Array.isArray(message.content) ? message.content : [{ text: message.content as string }];
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return {
|
|
188
|
+
role: message.role,
|
|
189
|
+
parts: textBlock,
|
|
190
|
+
};
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//==[ SRE: LLM ]======================
|
|
2
|
+
|
|
3
|
+
import { ConnectorService, ConnectorServiceProvider } from '@sre/Core/ConnectorsService';
|
|
4
|
+
import { TConnectorService } from '@sre/types/SRE.types';
|
|
5
|
+
import { EchoConnector } from './connectors/Echo.class';
|
|
6
|
+
import { OpenAIConnector } from './connectors/OpenAI.class';
|
|
7
|
+
import { GoogleAIConnector } from './connectors/GoogleAI.class';
|
|
8
|
+
import { AnthropicConnector } from './connectors/Anthropic.class';
|
|
9
|
+
import { GroqConnector } from './connectors/Groq.class';
|
|
10
|
+
import { BedrockConnector } from './connectors/Bedrock.class';
|
|
11
|
+
import { VertexAIConnector } from './connectors/VertexAI.class';
|
|
12
|
+
import { PerplexityConnector } from './connectors/Perplexity.class';
|
|
13
|
+
|
|
14
|
+
export class LLMService extends ConnectorServiceProvider {
|
|
15
|
+
public register() {
|
|
16
|
+
ConnectorService.register(TConnectorService.LLM, 'Echo', EchoConnector);
|
|
17
|
+
ConnectorService.register(TConnectorService.LLM, 'OpenAI', OpenAIConnector);
|
|
18
|
+
ConnectorService.register(TConnectorService.LLM, 'DeepSeek', OpenAIConnector);
|
|
19
|
+
ConnectorService.register(TConnectorService.LLM, 'GoogleAI', GoogleAIConnector);
|
|
20
|
+
ConnectorService.register(TConnectorService.LLM, 'Anthropic', AnthropicConnector);
|
|
21
|
+
ConnectorService.register(TConnectorService.LLM, 'Groq', GroqConnector);
|
|
22
|
+
ConnectorService.register(TConnectorService.LLM, 'TogetherAI', OpenAIConnector);
|
|
23
|
+
ConnectorService.register(TConnectorService.LLM, 'Bedrock', BedrockConnector);
|
|
24
|
+
ConnectorService.register(TConnectorService.LLM, 'VertexAI', VertexAIConnector);
|
|
25
|
+
ConnectorService.register(TConnectorService.LLM, 'xAI', OpenAIConnector);
|
|
26
|
+
ConnectorService.register(TConnectorService.LLM, 'Perplexity', PerplexityConnector);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public init() {
|
|
30
|
+
//auto initialize built-in models
|
|
31
|
+
ConnectorService.init(TConnectorService.LLM, 'Echo');
|
|
32
|
+
ConnectorService.init(TConnectorService.LLM, 'OpenAI');
|
|
33
|
+
ConnectorService.init(TConnectorService.LLM, 'DeepSeek');
|
|
34
|
+
ConnectorService.init(TConnectorService.LLM, 'GoogleAI');
|
|
35
|
+
ConnectorService.init(TConnectorService.LLM, 'Anthropic');
|
|
36
|
+
ConnectorService.init(TConnectorService.LLM, 'Groq');
|
|
37
|
+
ConnectorService.init(TConnectorService.LLM, 'TogetherAI');
|
|
38
|
+
ConnectorService.init(TConnectorService.LLM, 'Bedrock');
|
|
39
|
+
ConnectorService.init(TConnectorService.LLM, 'VertexAI');
|
|
40
|
+
ConnectorService.init(TConnectorService.LLM, 'xAI');
|
|
41
|
+
ConnectorService.init(TConnectorService.LLM, 'Perplexity');
|
|
42
|
+
}
|
|
43
|
+
}
|