@scenemesh/entity-engine-aimodule 1.0.0
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/LICENSE +21 -0
- package/README.md +854 -0
- package/dist/ai-core-LBGYFGOK.mjs +17 -0
- package/dist/ai-core-LBGYFGOK.mjs.map +1 -0
- package/dist/ai-core-UGJWSCQN.js +17 -0
- package/dist/ai-core-UGJWSCQN.js.map +1 -0
- package/dist/ai-core-manager-B3Z34RHA.mjs +9 -0
- package/dist/ai-core-manager-B3Z34RHA.mjs.map +1 -0
- package/dist/ai-core-manager-W7SSDCG5.js +9 -0
- package/dist/ai-core-manager-W7SSDCG5.js.map +1 -0
- package/dist/ai-embeddings-5ED5LDXX.mjs +17 -0
- package/dist/ai-embeddings-5ED5LDXX.mjs.map +1 -0
- package/dist/ai-embeddings-WCXZMMTZ.js +17 -0
- package/dist/ai-embeddings-WCXZMMTZ.js.map +1 -0
- package/dist/ai-form-renderer-24IWNMX5.js +233 -0
- package/dist/ai-form-renderer-24IWNMX5.js.map +1 -0
- package/dist/ai-form-renderer-BORQABF2.mjs +233 -0
- package/dist/ai-form-renderer-BORQABF2.mjs.map +1 -0
- package/dist/ai-provider-3PSCVEEN.mjs +17 -0
- package/dist/ai-provider-3PSCVEEN.mjs.map +1 -0
- package/dist/ai-provider-WMPMVZFL.js +17 -0
- package/dist/ai-provider-WMPMVZFL.js.map +1 -0
- package/dist/ai-renderer-7WGGWH5D.mjs +134 -0
- package/dist/ai-renderer-7WGGWH5D.mjs.map +1 -0
- package/dist/ai-renderer-OILYWAJV.js +134 -0
- package/dist/ai-renderer-OILYWAJV.js.map +1 -0
- package/dist/ai-settings-DGCFPK3U.js +15 -0
- package/dist/ai-settings-DGCFPK3U.js.map +1 -0
- package/dist/ai-settings-DTXEAB64.mjs +15 -0
- package/dist/ai-settings-DTXEAB64.mjs.map +1 -0
- package/dist/ai-structured-EGZ26ZS4.mjs +13 -0
- package/dist/ai-structured-EGZ26ZS4.mjs.map +1 -0
- package/dist/ai-structured-N2FZLO4A.js +13 -0
- package/dist/ai-structured-N2FZLO4A.js.map +1 -0
- package/dist/ai-tools-B3R77HZ3.js +19 -0
- package/dist/ai-tools-B3R77HZ3.js.map +1 -0
- package/dist/ai-tools-JAPVYQGE.mjs +19 -0
- package/dist/ai-tools-JAPVYQGE.mjs.map +1 -0
- package/dist/ai.module-GAHVCBTP.js +7 -0
- package/dist/ai.module-GAHVCBTP.js.map +1 -0
- package/dist/ai.module-TTPMTPB3.mjs +7 -0
- package/dist/ai.module-TTPMTPB3.mjs.map +1 -0
- package/dist/chunk-25C2NRSD.mjs +611 -0
- package/dist/chunk-25C2NRSD.mjs.map +1 -0
- package/dist/chunk-4JQ7UOXH.js +427 -0
- package/dist/chunk-4JQ7UOXH.js.map +1 -0
- package/dist/chunk-6IUKES2L.js +290 -0
- package/dist/chunk-6IUKES2L.js.map +1 -0
- package/dist/chunk-COWPK7XN.mjs +834 -0
- package/dist/chunk-COWPK7XN.mjs.map +1 -0
- package/dist/chunk-CTEXPMVZ.js +512 -0
- package/dist/chunk-CTEXPMVZ.js.map +1 -0
- package/dist/chunk-DXQTHA75.js +573 -0
- package/dist/chunk-DXQTHA75.js.map +1 -0
- package/dist/chunk-DZFQ6I23.js +72 -0
- package/dist/chunk-DZFQ6I23.js.map +1 -0
- package/dist/chunk-J323UTPE.mjs +650 -0
- package/dist/chunk-J323UTPE.mjs.map +1 -0
- package/dist/chunk-LHNNALVF.js +834 -0
- package/dist/chunk-LHNNALVF.js.map +1 -0
- package/dist/chunk-O7SZSMXV.js +1621 -0
- package/dist/chunk-O7SZSMXV.js.map +1 -0
- package/dist/chunk-OTNOFOVW.js +650 -0
- package/dist/chunk-OTNOFOVW.js.map +1 -0
- package/dist/chunk-PRIGZEI4.mjs +72 -0
- package/dist/chunk-PRIGZEI4.mjs.map +1 -0
- package/dist/chunk-SBSZ3IPB.mjs +573 -0
- package/dist/chunk-SBSZ3IPB.mjs.map +1 -0
- package/dist/chunk-SXPA6SSD.mjs +1621 -0
- package/dist/chunk-SXPA6SSD.mjs.map +1 -0
- package/dist/chunk-T5A4KAVS.mjs +512 -0
- package/dist/chunk-T5A4KAVS.mjs.map +1 -0
- package/dist/chunk-TDRKKUNT.mjs +357 -0
- package/dist/chunk-TDRKKUNT.mjs.map +1 -0
- package/dist/chunk-TJFNODPE.js +357 -0
- package/dist/chunk-TJFNODPE.js.map +1 -0
- package/dist/chunk-V2SSI3SL.mjs +427 -0
- package/dist/chunk-V2SSI3SL.mjs.map +1 -0
- package/dist/chunk-X42L6MTY.mjs +290 -0
- package/dist/chunk-X42L6MTY.mjs.map +1 -0
- package/dist/chunk-YSVMY77H.js +611 -0
- package/dist/chunk-YSVMY77H.js.map +1 -0
- package/dist/core-ANYRS6EF.mjs +73 -0
- package/dist/core-ANYRS6EF.mjs.map +1 -0
- package/dist/core-K5K34DCS.js +73 -0
- package/dist/core-K5K34DCS.js.map +1 -0
- package/dist/core-index.d.mts +1668 -0
- package/dist/core-index.d.ts +1668 -0
- package/dist/core-index.js +101 -0
- package/dist/core-index.js.map +1 -0
- package/dist/core-index.mjs +101 -0
- package/dist/core-index.mjs.map +1 -0
- package/dist/index.d.mts +2911 -0
- package/dist/index.d.ts +2911 -0
- package/dist/index.js +1177 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +1177 -0
- package/dist/index.mjs.map +1 -0
- package/dist/tools-352X7A6X.mjs +366 -0
- package/dist/tools-352X7A6X.mjs.map +1 -0
- package/dist/tools-YLEX6GNO.js +366 -0
- package/dist/tools-YLEX6GNO.js.map +1 -0
- package/dist/ui-index.d.mts +627 -0
- package/dist/ui-index.d.ts +627 -0
- package/dist/ui-index.js +2354 -0
- package/dist/ui-index.js.map +1 -0
- package/dist/ui-index.mjs +2353 -0
- package/dist/ui-index.mjs.map +1 -0
- package/package.json +105 -0
|
@@ -0,0 +1,650 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }// src/core/ai-provider.ts
|
|
2
|
+
var _events = require('events');
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
var _ai = require('ai');
|
|
9
|
+
var AIProviderManagement = class extends _events.EventEmitter {
|
|
10
|
+
// AISettingsManager - 延迟初始化
|
|
11
|
+
constructor() {
|
|
12
|
+
super();
|
|
13
|
+
this.initialized = false;
|
|
14
|
+
this.registry = null;
|
|
15
|
+
this.customProviders = /* @__PURE__ */ new Map();
|
|
16
|
+
this.modelAliases = /* @__PURE__ */ new Map();
|
|
17
|
+
this.healthStatus = /* @__PURE__ */ new Map();
|
|
18
|
+
this.usageStats = /* @__PURE__ */ new Map();
|
|
19
|
+
this.defaultLanguageModel = null;
|
|
20
|
+
this.defaultEmbeddingModel = null;
|
|
21
|
+
this.globalProvider = null;
|
|
22
|
+
// 新增:嵌入和设置管理相关属性
|
|
23
|
+
this.embeddingModelConfigs = /* @__PURE__ */ new Map();
|
|
24
|
+
this.modelSettingsPresets = /* @__PURE__ */ new Map();
|
|
25
|
+
this.embeddingsIntegration = null;
|
|
26
|
+
this.settingsManagement = null;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* 初始化
|
|
30
|
+
*/
|
|
31
|
+
async initialize() {
|
|
32
|
+
if (this.initialized) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
this.emit("ai_provider:initializing");
|
|
37
|
+
const { AIEmbeddingsIntegration } = await Promise.resolve().then(() => _interopRequireWildcard(require("./ai-embeddings-WCXZMMTZ.js")));
|
|
38
|
+
const { AISettingsManagement } = await Promise.resolve().then(() => _interopRequireWildcard(require("./ai-settings-DGCFPK3U.js")));
|
|
39
|
+
this.embeddingsIntegration = new AIEmbeddingsIntegration();
|
|
40
|
+
this.settingsManagement = new AISettingsManagement();
|
|
41
|
+
await this.embeddingsIntegration.initialize();
|
|
42
|
+
await this.settingsManagement.initialize();
|
|
43
|
+
await this.setupDefaultProviders();
|
|
44
|
+
this.initialized = true;
|
|
45
|
+
this.emit("ai_provider:initialized");
|
|
46
|
+
} catch (error) {
|
|
47
|
+
this.emit("ai_provider:initialization_failed", { error });
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* 设置默认提供商 - 从环境变量加载配置
|
|
53
|
+
*/
|
|
54
|
+
async setupDefaultProviders() {
|
|
55
|
+
try {
|
|
56
|
+
const qwenApiKey = process.env.EEAI_QWEN_API_KEY;
|
|
57
|
+
const qwenBaseUrl = process.env.EEAI_QWEN_BASE_URL || "https://dashscope.aliyuncs.com/compatible-mode/v1";
|
|
58
|
+
if (!qwenApiKey) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const { createOpenAICompatible } = await Promise.resolve().then(() => _interopRequireWildcard(require("@ai-sdk/openai-compatible")));
|
|
62
|
+
const qwenProvider = createOpenAICompatible({
|
|
63
|
+
name: "qwen",
|
|
64
|
+
baseURL: qwenBaseUrl,
|
|
65
|
+
apiKey: qwenApiKey
|
|
66
|
+
});
|
|
67
|
+
const registryConfig = {
|
|
68
|
+
providers: {
|
|
69
|
+
qwen: qwenProvider
|
|
70
|
+
},
|
|
71
|
+
options: {
|
|
72
|
+
separator: ":"
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
this.registry = _ai.createProviderRegistry.call(void 0,
|
|
76
|
+
registryConfig.providers,
|
|
77
|
+
registryConfig.options
|
|
78
|
+
);
|
|
79
|
+
this.defaultLanguageModel = this.registry.languageModel("qwen:qwen-plus-2025-01-25");
|
|
80
|
+
try {
|
|
81
|
+
this.defaultEmbeddingModel = this.registry.textEmbeddingModel("qwen:text-embedding-v1");
|
|
82
|
+
} catch (e2) {
|
|
83
|
+
}
|
|
84
|
+
this.emit("ai_provider:default_providers_setup", {
|
|
85
|
+
providers: ["qwen"],
|
|
86
|
+
defaultModel: "qwen:qwen-plus-2025-01-25",
|
|
87
|
+
embeddingModel: "qwen:text-embedding-v1"
|
|
88
|
+
});
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.error("Failed to setup default providers:", error);
|
|
91
|
+
this.emit("ai_provider:default_providers_setup_failed", { error: error.message });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Custom Providers
|
|
95
|
+
/**
|
|
96
|
+
* Create custom provider
|
|
97
|
+
*/
|
|
98
|
+
createCustomProvider(id, config) {
|
|
99
|
+
if (!this.initialized) {
|
|
100
|
+
throw new Error("AIProviderManagement not initialized. Call initialize() first.");
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
this.emit("ai_provider:custom_provider_creating", { id, config });
|
|
104
|
+
const languageModels = {};
|
|
105
|
+
if (config.languageModels) {
|
|
106
|
+
Object.entries(config.languageModels).forEach(([modelId, modelConfig]) => {
|
|
107
|
+
if (modelConfig && typeof modelConfig === "object" && "model" in modelConfig) {
|
|
108
|
+
languageModels[modelId] = _ai.wrapLanguageModel.call(void 0, {
|
|
109
|
+
model: modelConfig.model,
|
|
110
|
+
middleware: modelConfig.middleware || _ai.defaultSettingsMiddleware.call(void 0, {
|
|
111
|
+
settings: modelConfig.settings || {}
|
|
112
|
+
})
|
|
113
|
+
});
|
|
114
|
+
} else if (modelConfig) {
|
|
115
|
+
languageModels[modelId] = modelConfig;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
const customProviderInstance = _ai.customProvider.call(void 0, {
|
|
120
|
+
languageModels,
|
|
121
|
+
embeddingModels: config.embeddingModels,
|
|
122
|
+
imageModels: config.imageModels,
|
|
123
|
+
fallbackProvider: config.fallbackProvider
|
|
124
|
+
});
|
|
125
|
+
this.customProviders.set(id, customProviderInstance);
|
|
126
|
+
this.emit("ai_provider:custom_provider_created", {
|
|
127
|
+
id,
|
|
128
|
+
languageModels: Object.keys(languageModels),
|
|
129
|
+
embeddingModels: Object.keys(config.embeddingModels || {}),
|
|
130
|
+
imageModels: Object.keys(config.imageModels || {}),
|
|
131
|
+
hasFallback: !!config.fallbackProvider
|
|
132
|
+
});
|
|
133
|
+
return customProviderInstance;
|
|
134
|
+
} catch (error) {
|
|
135
|
+
this.emit("ai_provider:custom_provider_creation_failed", { id, error: error.message });
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Create model alias
|
|
141
|
+
*/
|
|
142
|
+
createModelAlias(aliasConfig) {
|
|
143
|
+
const provider = this.customProviders.get(aliasConfig.providerId);
|
|
144
|
+
if (!provider) {
|
|
145
|
+
throw new Error(`Provider '${aliasConfig.providerId}' not found`);
|
|
146
|
+
}
|
|
147
|
+
this.modelAliases.set(aliasConfig.alias, aliasConfig);
|
|
148
|
+
this.emit("ai_provider:model_alias_created", aliasConfig);
|
|
149
|
+
return _optionalChain([provider, 'access', _ => _.languageModel, 'optionalCall', _2 => _2(aliasConfig.modelId)]);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Create model with predefined settings
|
|
153
|
+
*/
|
|
154
|
+
createModelWithSettings(originalModel, settings) {
|
|
155
|
+
return _ai.wrapLanguageModel.call(void 0, {
|
|
156
|
+
model: originalModel,
|
|
157
|
+
middleware: _ai.defaultSettingsMiddleware.call(void 0, {
|
|
158
|
+
settings
|
|
159
|
+
})
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
// Provider Registry
|
|
163
|
+
/**
|
|
164
|
+
* Create provider registry
|
|
165
|
+
*/
|
|
166
|
+
createProviderRegistry(config) {
|
|
167
|
+
if (!this.initialized) {
|
|
168
|
+
throw new Error("AIProviderManagement not initialized. Call initialize() first.");
|
|
169
|
+
}
|
|
170
|
+
try {
|
|
171
|
+
this.emit("ai_provider:registry_creating", {
|
|
172
|
+
providers: Object.keys(config.providers),
|
|
173
|
+
separator: _optionalChain([config, 'access', _3 => _3.options, 'optionalAccess', _4 => _4.separator]) || ":"
|
|
174
|
+
});
|
|
175
|
+
this.registry = _ai.createProviderRegistry.call(void 0,
|
|
176
|
+
config.providers,
|
|
177
|
+
config.options
|
|
178
|
+
);
|
|
179
|
+
this.emit("ai_provider:registry_created", {
|
|
180
|
+
providerCount: Object.keys(config.providers).length,
|
|
181
|
+
separator: _optionalChain([config, 'access', _5 => _5.options, 'optionalAccess', _6 => _6.separator]) || ":"
|
|
182
|
+
});
|
|
183
|
+
return this.registry;
|
|
184
|
+
} catch (error) {
|
|
185
|
+
this.emit("ai_provider:registry_creation_failed", { error: error.message });
|
|
186
|
+
throw error;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Get language model from registry
|
|
191
|
+
*/
|
|
192
|
+
getLanguageModel(modelId) {
|
|
193
|
+
try {
|
|
194
|
+
if (!modelId && this.defaultLanguageModel) {
|
|
195
|
+
return this.defaultLanguageModel;
|
|
196
|
+
}
|
|
197
|
+
if (this.registry && modelId) {
|
|
198
|
+
try {
|
|
199
|
+
const model = this.registry.languageModel(modelId);
|
|
200
|
+
this.recordModelUsage(modelId);
|
|
201
|
+
return model;
|
|
202
|
+
} catch (registryError) {
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (modelId) {
|
|
206
|
+
const qwenProvider = this.customProviders.get("qwen");
|
|
207
|
+
if (qwenProvider && qwenProvider.languageModel) {
|
|
208
|
+
const model = qwenProvider.languageModel(modelId);
|
|
209
|
+
if (model) {
|
|
210
|
+
this.recordModelUsage(modelId);
|
|
211
|
+
return model;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (modelId.includes(":")) {
|
|
215
|
+
const [providerId, actualModelId] = modelId.split(":");
|
|
216
|
+
const provider = this.customProviders.get(providerId);
|
|
217
|
+
if (provider && provider.languageModel) {
|
|
218
|
+
const model = provider.languageModel(actualModelId);
|
|
219
|
+
if (model) {
|
|
220
|
+
this.recordModelUsage(modelId);
|
|
221
|
+
return model;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (this.defaultLanguageModel) {
|
|
227
|
+
return this.defaultLanguageModel;
|
|
228
|
+
}
|
|
229
|
+
return null;
|
|
230
|
+
} catch (error) {
|
|
231
|
+
this.emit("ai_provider:model_access_failed", { modelId, error: error.message });
|
|
232
|
+
return this.defaultLanguageModel;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get text embedding model from registry
|
|
237
|
+
*/
|
|
238
|
+
getTextEmbeddingModel(modelId) {
|
|
239
|
+
try {
|
|
240
|
+
if (!modelId && this.defaultEmbeddingModel) {
|
|
241
|
+
return this.defaultEmbeddingModel;
|
|
242
|
+
}
|
|
243
|
+
if (!this.registry) {
|
|
244
|
+
throw new Error("Provider registry not created. Call initialize() first.");
|
|
245
|
+
}
|
|
246
|
+
if (!modelId) {
|
|
247
|
+
throw new Error("Model ID is required when no default embedding model is available");
|
|
248
|
+
}
|
|
249
|
+
const model = this.registry.textEmbeddingModel(modelId);
|
|
250
|
+
this.recordModelUsage(modelId);
|
|
251
|
+
return model;
|
|
252
|
+
} catch (error) {
|
|
253
|
+
this.emit("ai_provider:embedding_model_access_failed", { modelId, error: error.message });
|
|
254
|
+
if (modelId && this.defaultEmbeddingModel) {
|
|
255
|
+
return this.defaultEmbeddingModel;
|
|
256
|
+
}
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* 从注册表获取图像模型 - 官方用法
|
|
262
|
+
*/
|
|
263
|
+
getImageModel(modelId) {
|
|
264
|
+
if (!this.registry) {
|
|
265
|
+
throw new Error("Provider registry not created. Call createProviderRegistry() first.");
|
|
266
|
+
}
|
|
267
|
+
try {
|
|
268
|
+
const model = this.registry.imageModel(modelId);
|
|
269
|
+
this.recordModelUsage(modelId);
|
|
270
|
+
return model;
|
|
271
|
+
} catch (error) {
|
|
272
|
+
this.emit("ai_provider:image_model_access_failed", { modelId, error: error.message });
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
// Global Provider Management
|
|
277
|
+
/**
|
|
278
|
+
* Set global default provider
|
|
279
|
+
*/
|
|
280
|
+
setGlobalProvider(provider) {
|
|
281
|
+
globalThis.AI_SDK_DEFAULT_PROVIDER = provider;
|
|
282
|
+
this.globalProvider = provider;
|
|
283
|
+
this.emit("ai_provider:global_provider_set", {
|
|
284
|
+
providerId: provider.providerId || "unknown"
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Get current global provider
|
|
289
|
+
*/
|
|
290
|
+
getGlobalProvider() {
|
|
291
|
+
return this.globalProvider || globalThis.AI_SDK_DEFAULT_PROVIDER || null;
|
|
292
|
+
}
|
|
293
|
+
// Health Monitoring
|
|
294
|
+
/**
|
|
295
|
+
* Check provider health status
|
|
296
|
+
*/
|
|
297
|
+
async checkProviderHealth(providerId) {
|
|
298
|
+
const startTime = Date.now();
|
|
299
|
+
try {
|
|
300
|
+
const provider = this.customProviders.get(providerId);
|
|
301
|
+
const isHealthy = !!provider;
|
|
302
|
+
const status = {
|
|
303
|
+
providerId,
|
|
304
|
+
isHealthy,
|
|
305
|
+
latency: Date.now() - startTime,
|
|
306
|
+
lastCheck: /* @__PURE__ */ new Date()
|
|
307
|
+
};
|
|
308
|
+
this.healthStatus.set(providerId, status);
|
|
309
|
+
this.emit("ai_provider:health_check_completed", status);
|
|
310
|
+
return status;
|
|
311
|
+
} catch (error) {
|
|
312
|
+
const status = {
|
|
313
|
+
providerId,
|
|
314
|
+
isHealthy: false,
|
|
315
|
+
latency: Date.now() - startTime,
|
|
316
|
+
error: error.message,
|
|
317
|
+
lastCheck: /* @__PURE__ */ new Date()
|
|
318
|
+
};
|
|
319
|
+
this.healthStatus.set(providerId, status);
|
|
320
|
+
this.emit("ai_provider:health_check_failed", status);
|
|
321
|
+
return status;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Check health status of all providers
|
|
326
|
+
*/
|
|
327
|
+
async checkAllProvidersHealth() {
|
|
328
|
+
const providerIds = Array.from(this.customProviders.keys());
|
|
329
|
+
const results = await Promise.all(
|
|
330
|
+
providerIds.map((id) => this.checkProviderHealth(id))
|
|
331
|
+
);
|
|
332
|
+
this.emit("ai_provider:bulk_health_check_completed", {
|
|
333
|
+
total: results.length,
|
|
334
|
+
healthy: results.filter((r) => r.isHealthy).length,
|
|
335
|
+
unhealthy: results.filter((r) => !r.isHealthy).length
|
|
336
|
+
});
|
|
337
|
+
return results;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Record model usage statistics
|
|
341
|
+
*/
|
|
342
|
+
recordModelUsage(modelId) {
|
|
343
|
+
const [providerId] = modelId.includes(":") ? modelId.split(":") : ["unknown", modelId];
|
|
344
|
+
const statsKey = `${providerId}:${modelId}`;
|
|
345
|
+
const existing = this.usageStats.get(statsKey);
|
|
346
|
+
if (existing) {
|
|
347
|
+
existing.totalCalls += 1;
|
|
348
|
+
existing.lastUsed = /* @__PURE__ */ new Date();
|
|
349
|
+
} else {
|
|
350
|
+
this.usageStats.set(statsKey, {
|
|
351
|
+
modelId,
|
|
352
|
+
providerId,
|
|
353
|
+
totalCalls: 1,
|
|
354
|
+
totalTokens: 0,
|
|
355
|
+
averageLatency: 0,
|
|
356
|
+
errorRate: 0,
|
|
357
|
+
lastUsed: /* @__PURE__ */ new Date()
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
// Model Selection and Fallback
|
|
362
|
+
/**
|
|
363
|
+
* Smart model selection based on health and load
|
|
364
|
+
*/
|
|
365
|
+
async selectBestModel(modelIds, criteria = {}) {
|
|
366
|
+
if (modelIds.length === 0) return null;
|
|
367
|
+
const modelHealth = /* @__PURE__ */ new Map();
|
|
368
|
+
for (const modelId of modelIds) {
|
|
369
|
+
const [providerId] = modelId.includes(":") ? modelId.split(":") : ["unknown"];
|
|
370
|
+
const health = this.healthStatus.get(providerId);
|
|
371
|
+
if (health) {
|
|
372
|
+
modelHealth.set(modelId, health);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
const healthyModels = modelIds.filter((id) => {
|
|
376
|
+
const [providerId] = id.includes(":") ? id.split(":") : ["unknown"];
|
|
377
|
+
const health = modelHealth.get(id);
|
|
378
|
+
if (process.env.NODE_ENV === "development") {
|
|
379
|
+
}
|
|
380
|
+
return _optionalChain([health, 'optionalAccess', _7 => _7.isHealthy]) !== false;
|
|
381
|
+
});
|
|
382
|
+
if (healthyModels.length === 0) {
|
|
383
|
+
return modelIds[0];
|
|
384
|
+
}
|
|
385
|
+
if (criteria.prioritizeLatency) {
|
|
386
|
+
const sorted = healthyModels.sort((a, b) => {
|
|
387
|
+
const healthA = modelHealth.get(a);
|
|
388
|
+
const healthB = modelHealth.get(b);
|
|
389
|
+
return (_optionalChain([healthA, 'optionalAccess', _8 => _8.latency]) || Infinity) - (_optionalChain([healthB, 'optionalAccess', _9 => _9.latency]) || Infinity);
|
|
390
|
+
});
|
|
391
|
+
return sorted[0];
|
|
392
|
+
}
|
|
393
|
+
return healthyModels[0];
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Create model chain with fallback
|
|
397
|
+
*/
|
|
398
|
+
createModelChain(primaryModelId, fallbackModelIds) {
|
|
399
|
+
return {
|
|
400
|
+
execute: async (operation) => {
|
|
401
|
+
const modelIds = [primaryModelId, ...fallbackModelIds];
|
|
402
|
+
for (let i = 0; i < modelIds.length; i++) {
|
|
403
|
+
const modelId = modelIds[i];
|
|
404
|
+
try {
|
|
405
|
+
const model = this.getLanguageModel(modelId);
|
|
406
|
+
if (!model) continue;
|
|
407
|
+
const result = await operation(model);
|
|
408
|
+
this.emit("ai_provider:model_chain_success", {
|
|
409
|
+
attemptedModel: modelId,
|
|
410
|
+
attempt: i + 1,
|
|
411
|
+
totalModels: modelIds.length
|
|
412
|
+
});
|
|
413
|
+
return result;
|
|
414
|
+
} catch (error) {
|
|
415
|
+
this.emit("ai_provider:model_chain_attempt_failed", {
|
|
416
|
+
attemptedModel: modelId,
|
|
417
|
+
attempt: i + 1,
|
|
418
|
+
error: error.message,
|
|
419
|
+
willTryNext: i < modelIds.length - 1
|
|
420
|
+
});
|
|
421
|
+
if (i === modelIds.length - 1) {
|
|
422
|
+
throw error;
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
throw new Error("All models in chain failed");
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
// Utility Methods
|
|
431
|
+
/**
|
|
432
|
+
* Get all registered providers
|
|
433
|
+
*/
|
|
434
|
+
getRegisteredProviders() {
|
|
435
|
+
return Array.from(this.customProviders.keys());
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Get model aliases
|
|
439
|
+
*/
|
|
440
|
+
getModelAliases() {
|
|
441
|
+
const aliases = {};
|
|
442
|
+
this.modelAliases.forEach((config, alias) => {
|
|
443
|
+
aliases[alias] = config;
|
|
444
|
+
});
|
|
445
|
+
return aliases;
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Get usage statistics
|
|
449
|
+
*/
|
|
450
|
+
getUsageStats() {
|
|
451
|
+
return Array.from(this.usageStats.values());
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Get health status report
|
|
455
|
+
*/
|
|
456
|
+
getHealthReport() {
|
|
457
|
+
const statuses = Array.from(this.healthStatus.values());
|
|
458
|
+
return {
|
|
459
|
+
totalProviders: statuses.length,
|
|
460
|
+
healthyProviders: statuses.filter((s) => s.isHealthy).length,
|
|
461
|
+
unhealthyProviders: statuses.filter((s) => !s.isHealthy).length,
|
|
462
|
+
statuses
|
|
463
|
+
};
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* Clean up resources
|
|
467
|
+
*/
|
|
468
|
+
async cleanup() {
|
|
469
|
+
await Promise.all(
|
|
470
|
+
Array.from(this.customProviders.values()).map(async (provider) => {
|
|
471
|
+
try {
|
|
472
|
+
if (typeof provider.cleanup === "function") {
|
|
473
|
+
await provider.cleanup();
|
|
474
|
+
}
|
|
475
|
+
} catch (error) {
|
|
476
|
+
this.emit("ai_provider:cleanup_error", { error });
|
|
477
|
+
}
|
|
478
|
+
})
|
|
479
|
+
);
|
|
480
|
+
}
|
|
481
|
+
/**
|
|
482
|
+
* Check initialization status
|
|
483
|
+
*/
|
|
484
|
+
isInitialized() {
|
|
485
|
+
return this.initialized;
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Get statistics
|
|
489
|
+
*/
|
|
490
|
+
getStats() {
|
|
491
|
+
return {
|
|
492
|
+
isInitialized: this.initialized,
|
|
493
|
+
customProviders: this.customProviders.size,
|
|
494
|
+
modelAliases: this.modelAliases.size,
|
|
495
|
+
totalUsage: Array.from(this.usageStats.values()).reduce((sum, stat) => sum + stat.totalCalls, 0),
|
|
496
|
+
hasRegistry: !!this.registry,
|
|
497
|
+
hasGlobalProvider: !!this.globalProvider
|
|
498
|
+
};
|
|
499
|
+
}
|
|
500
|
+
// Embedding Model Management
|
|
501
|
+
/**
|
|
502
|
+
* Get embeddings integration instance
|
|
503
|
+
*/
|
|
504
|
+
getEmbeddingsIntegration() {
|
|
505
|
+
return this.embeddingsIntegration;
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Configure embedding model parameters
|
|
509
|
+
*/
|
|
510
|
+
configureEmbeddingModel(providerId, modelId, config) {
|
|
511
|
+
const key = `${providerId}:${modelId}`;
|
|
512
|
+
this.embeddingModelConfigs.set(key, config);
|
|
513
|
+
this.emit("ai_provider:embedding_model_configured", {
|
|
514
|
+
providerId,
|
|
515
|
+
modelId,
|
|
516
|
+
config
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* Get embedding model configuration
|
|
521
|
+
*/
|
|
522
|
+
getEmbeddingModelConfig(providerId, modelId) {
|
|
523
|
+
const key = `${providerId}:${modelId}`;
|
|
524
|
+
return this.embeddingModelConfigs.get(key) || null;
|
|
525
|
+
}
|
|
526
|
+
/**
|
|
527
|
+
* Get all supported embedding models
|
|
528
|
+
*/
|
|
529
|
+
getSupportedEmbeddingModels() {
|
|
530
|
+
return this.embeddingsIntegration.getSupportedModels();
|
|
531
|
+
}
|
|
532
|
+
/**
|
|
533
|
+
* Get embedding models by provider
|
|
534
|
+
*/
|
|
535
|
+
getEmbeddingModelsByProvider(provider) {
|
|
536
|
+
return this.embeddingsIntegration.getModelsByProvider(provider);
|
|
537
|
+
}
|
|
538
|
+
// Settings Management
|
|
539
|
+
/**
|
|
540
|
+
* Get settings management instance
|
|
541
|
+
*/
|
|
542
|
+
getSettingsManagement() {
|
|
543
|
+
return this.settingsManagement;
|
|
544
|
+
}
|
|
545
|
+
/**
|
|
546
|
+
* Apply settings preset to model configuration
|
|
547
|
+
*/
|
|
548
|
+
applySettingsPreset(modelId, presetName, additionalSettings) {
|
|
549
|
+
const preset = this.settingsManagement.getPreset(presetName);
|
|
550
|
+
if (!preset) {
|
|
551
|
+
throw new Error(`Settings preset '${presetName}' not found`);
|
|
552
|
+
}
|
|
553
|
+
let finalSettings = preset.settings;
|
|
554
|
+
if (additionalSettings) {
|
|
555
|
+
finalSettings = this.settingsManagement.mergeSettings(
|
|
556
|
+
preset.settings,
|
|
557
|
+
additionalSettings
|
|
558
|
+
);
|
|
559
|
+
}
|
|
560
|
+
const validation = this.settingsManagement.validateSettings(finalSettings);
|
|
561
|
+
if (!validation.isValid) {
|
|
562
|
+
throw new Error(`Invalid settings: ${validation.errors.map((e) => e.message).join(", ")}`);
|
|
563
|
+
}
|
|
564
|
+
this.modelSettingsPresets.set(modelId, finalSettings);
|
|
565
|
+
this.settingsManagement.recordSettingsUsage(finalSettings, {
|
|
566
|
+
modelId,
|
|
567
|
+
presetName,
|
|
568
|
+
timestamp: /* @__PURE__ */ new Date()
|
|
569
|
+
});
|
|
570
|
+
this.emit("ai_provider:settings_preset_applied", {
|
|
571
|
+
modelId,
|
|
572
|
+
presetName,
|
|
573
|
+
finalSettings,
|
|
574
|
+
validation
|
|
575
|
+
});
|
|
576
|
+
return finalSettings;
|
|
577
|
+
}
|
|
578
|
+
/**
|
|
579
|
+
* Create model instance with custom settings
|
|
580
|
+
*/
|
|
581
|
+
createModelWithCustomSettings(baseModel, settings) {
|
|
582
|
+
const validation = this.settingsManagement.validateSettings(settings);
|
|
583
|
+
if (!validation.isValid) {
|
|
584
|
+
this.emit("ai_provider:settings_validation_warning", {
|
|
585
|
+
errors: validation.errors,
|
|
586
|
+
warnings: validation.warnings
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
return _ai.wrapLanguageModel.call(void 0, {
|
|
590
|
+
model: baseModel,
|
|
591
|
+
middleware: _ai.defaultSettingsMiddleware.call(void 0, {
|
|
592
|
+
settings
|
|
593
|
+
})
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
/**
|
|
597
|
+
* Get model applied settings
|
|
598
|
+
*/
|
|
599
|
+
getModelSettings(modelId) {
|
|
600
|
+
return this.modelSettingsPresets.get(modelId) || null;
|
|
601
|
+
}
|
|
602
|
+
/**
|
|
603
|
+
* Create optimized model for specific use case
|
|
604
|
+
*/
|
|
605
|
+
createOptimizedModel(baseModel, useCase) {
|
|
606
|
+
const presetMap = {
|
|
607
|
+
creative: "CREATIVE",
|
|
608
|
+
analytical: "PRECISE",
|
|
609
|
+
deterministic: "DETERMINISTIC",
|
|
610
|
+
fast: "FAST_RESPONSE",
|
|
611
|
+
"long-form": "LONG_FORM",
|
|
612
|
+
code: "CODE_GENERATION"
|
|
613
|
+
};
|
|
614
|
+
const presetName = presetMap[useCase];
|
|
615
|
+
const preset = this.settingsManagement.getPreset(presetName);
|
|
616
|
+
if (!preset) {
|
|
617
|
+
throw new Error(`No preset found for use case: ${useCase}`);
|
|
618
|
+
}
|
|
619
|
+
return this.createModelWithCustomSettings(baseModel, preset.settings);
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* Destroy instance - enhanced version
|
|
623
|
+
*/
|
|
624
|
+
async destroy() {
|
|
625
|
+
await this.cleanup();
|
|
626
|
+
this.customProviders.clear();
|
|
627
|
+
this.modelAliases.clear();
|
|
628
|
+
this.healthStatus.clear();
|
|
629
|
+
this.usageStats.clear();
|
|
630
|
+
this.registry = null;
|
|
631
|
+
this.globalProvider = null;
|
|
632
|
+
this.embeddingModelConfigs.clear();
|
|
633
|
+
this.modelSettingsPresets.clear();
|
|
634
|
+
this.embeddingsIntegration.destroy();
|
|
635
|
+
this.settingsManagement.destroy();
|
|
636
|
+
this.removeAllListeners();
|
|
637
|
+
this.initialized = false;
|
|
638
|
+
}
|
|
639
|
+
};
|
|
640
|
+
var ai_provider_default = AIProviderManagement;
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
|
|
644
|
+
|
|
645
|
+
|
|
646
|
+
|
|
647
|
+
|
|
648
|
+
|
|
649
|
+
exports.customProvider = _ai.customProvider; exports.wrapLanguageModel = _ai.wrapLanguageModel; exports.createProviderRegistry = _ai.createProviderRegistry; exports.defaultSettingsMiddleware = _ai.defaultSettingsMiddleware; exports.AIProviderManagement = AIProviderManagement; exports.ai_provider_default = ai_provider_default;
|
|
650
|
+
//# sourceMappingURL=chunk-OTNOFOVW.js.map
|