@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.
Files changed (109) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +854 -0
  3. package/dist/ai-core-LBGYFGOK.mjs +17 -0
  4. package/dist/ai-core-LBGYFGOK.mjs.map +1 -0
  5. package/dist/ai-core-UGJWSCQN.js +17 -0
  6. package/dist/ai-core-UGJWSCQN.js.map +1 -0
  7. package/dist/ai-core-manager-B3Z34RHA.mjs +9 -0
  8. package/dist/ai-core-manager-B3Z34RHA.mjs.map +1 -0
  9. package/dist/ai-core-manager-W7SSDCG5.js +9 -0
  10. package/dist/ai-core-manager-W7SSDCG5.js.map +1 -0
  11. package/dist/ai-embeddings-5ED5LDXX.mjs +17 -0
  12. package/dist/ai-embeddings-5ED5LDXX.mjs.map +1 -0
  13. package/dist/ai-embeddings-WCXZMMTZ.js +17 -0
  14. package/dist/ai-embeddings-WCXZMMTZ.js.map +1 -0
  15. package/dist/ai-form-renderer-24IWNMX5.js +233 -0
  16. package/dist/ai-form-renderer-24IWNMX5.js.map +1 -0
  17. package/dist/ai-form-renderer-BORQABF2.mjs +233 -0
  18. package/dist/ai-form-renderer-BORQABF2.mjs.map +1 -0
  19. package/dist/ai-provider-3PSCVEEN.mjs +17 -0
  20. package/dist/ai-provider-3PSCVEEN.mjs.map +1 -0
  21. package/dist/ai-provider-WMPMVZFL.js +17 -0
  22. package/dist/ai-provider-WMPMVZFL.js.map +1 -0
  23. package/dist/ai-renderer-7WGGWH5D.mjs +134 -0
  24. package/dist/ai-renderer-7WGGWH5D.mjs.map +1 -0
  25. package/dist/ai-renderer-OILYWAJV.js +134 -0
  26. package/dist/ai-renderer-OILYWAJV.js.map +1 -0
  27. package/dist/ai-settings-DGCFPK3U.js +15 -0
  28. package/dist/ai-settings-DGCFPK3U.js.map +1 -0
  29. package/dist/ai-settings-DTXEAB64.mjs +15 -0
  30. package/dist/ai-settings-DTXEAB64.mjs.map +1 -0
  31. package/dist/ai-structured-EGZ26ZS4.mjs +13 -0
  32. package/dist/ai-structured-EGZ26ZS4.mjs.map +1 -0
  33. package/dist/ai-structured-N2FZLO4A.js +13 -0
  34. package/dist/ai-structured-N2FZLO4A.js.map +1 -0
  35. package/dist/ai-tools-B3R77HZ3.js +19 -0
  36. package/dist/ai-tools-B3R77HZ3.js.map +1 -0
  37. package/dist/ai-tools-JAPVYQGE.mjs +19 -0
  38. package/dist/ai-tools-JAPVYQGE.mjs.map +1 -0
  39. package/dist/ai.module-GAHVCBTP.js +7 -0
  40. package/dist/ai.module-GAHVCBTP.js.map +1 -0
  41. package/dist/ai.module-TTPMTPB3.mjs +7 -0
  42. package/dist/ai.module-TTPMTPB3.mjs.map +1 -0
  43. package/dist/chunk-25C2NRSD.mjs +611 -0
  44. package/dist/chunk-25C2NRSD.mjs.map +1 -0
  45. package/dist/chunk-4JQ7UOXH.js +427 -0
  46. package/dist/chunk-4JQ7UOXH.js.map +1 -0
  47. package/dist/chunk-6IUKES2L.js +290 -0
  48. package/dist/chunk-6IUKES2L.js.map +1 -0
  49. package/dist/chunk-COWPK7XN.mjs +834 -0
  50. package/dist/chunk-COWPK7XN.mjs.map +1 -0
  51. package/dist/chunk-CTEXPMVZ.js +512 -0
  52. package/dist/chunk-CTEXPMVZ.js.map +1 -0
  53. package/dist/chunk-DXQTHA75.js +573 -0
  54. package/dist/chunk-DXQTHA75.js.map +1 -0
  55. package/dist/chunk-DZFQ6I23.js +72 -0
  56. package/dist/chunk-DZFQ6I23.js.map +1 -0
  57. package/dist/chunk-J323UTPE.mjs +650 -0
  58. package/dist/chunk-J323UTPE.mjs.map +1 -0
  59. package/dist/chunk-LHNNALVF.js +834 -0
  60. package/dist/chunk-LHNNALVF.js.map +1 -0
  61. package/dist/chunk-O7SZSMXV.js +1621 -0
  62. package/dist/chunk-O7SZSMXV.js.map +1 -0
  63. package/dist/chunk-OTNOFOVW.js +650 -0
  64. package/dist/chunk-OTNOFOVW.js.map +1 -0
  65. package/dist/chunk-PRIGZEI4.mjs +72 -0
  66. package/dist/chunk-PRIGZEI4.mjs.map +1 -0
  67. package/dist/chunk-SBSZ3IPB.mjs +573 -0
  68. package/dist/chunk-SBSZ3IPB.mjs.map +1 -0
  69. package/dist/chunk-SXPA6SSD.mjs +1621 -0
  70. package/dist/chunk-SXPA6SSD.mjs.map +1 -0
  71. package/dist/chunk-T5A4KAVS.mjs +512 -0
  72. package/dist/chunk-T5A4KAVS.mjs.map +1 -0
  73. package/dist/chunk-TDRKKUNT.mjs +357 -0
  74. package/dist/chunk-TDRKKUNT.mjs.map +1 -0
  75. package/dist/chunk-TJFNODPE.js +357 -0
  76. package/dist/chunk-TJFNODPE.js.map +1 -0
  77. package/dist/chunk-V2SSI3SL.mjs +427 -0
  78. package/dist/chunk-V2SSI3SL.mjs.map +1 -0
  79. package/dist/chunk-X42L6MTY.mjs +290 -0
  80. package/dist/chunk-X42L6MTY.mjs.map +1 -0
  81. package/dist/chunk-YSVMY77H.js +611 -0
  82. package/dist/chunk-YSVMY77H.js.map +1 -0
  83. package/dist/core-ANYRS6EF.mjs +73 -0
  84. package/dist/core-ANYRS6EF.mjs.map +1 -0
  85. package/dist/core-K5K34DCS.js +73 -0
  86. package/dist/core-K5K34DCS.js.map +1 -0
  87. package/dist/core-index.d.mts +1668 -0
  88. package/dist/core-index.d.ts +1668 -0
  89. package/dist/core-index.js +101 -0
  90. package/dist/core-index.js.map +1 -0
  91. package/dist/core-index.mjs +101 -0
  92. package/dist/core-index.mjs.map +1 -0
  93. package/dist/index.d.mts +2911 -0
  94. package/dist/index.d.ts +2911 -0
  95. package/dist/index.js +1177 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/index.mjs +1177 -0
  98. package/dist/index.mjs.map +1 -0
  99. package/dist/tools-352X7A6X.mjs +366 -0
  100. package/dist/tools-352X7A6X.mjs.map +1 -0
  101. package/dist/tools-YLEX6GNO.js +366 -0
  102. package/dist/tools-YLEX6GNO.js.map +1 -0
  103. package/dist/ui-index.d.mts +627 -0
  104. package/dist/ui-index.d.ts +627 -0
  105. package/dist/ui-index.js +2354 -0
  106. package/dist/ui-index.js.map +1 -0
  107. package/dist/ui-index.mjs +2353 -0
  108. package/dist/ui-index.mjs.map +1 -0
  109. package/package.json +105 -0
@@ -0,0 +1,650 @@
1
+ // src/core/ai-provider.ts
2
+ import { EventEmitter } from "events";
3
+ import {
4
+ customProvider,
5
+ wrapLanguageModel,
6
+ createProviderRegistry,
7
+ defaultSettingsMiddleware
8
+ } from "ai";
9
+ var AIProviderManagement = class extends 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 import("./ai-embeddings-5ED5LDXX.mjs");
38
+ const { AISettingsManagement } = await import("./ai-settings-DTXEAB64.mjs");
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 import("@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 = createProviderRegistry(
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 {
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] = wrapLanguageModel({
109
+ model: modelConfig.model,
110
+ middleware: modelConfig.middleware || defaultSettingsMiddleware({
111
+ settings: modelConfig.settings || {}
112
+ })
113
+ });
114
+ } else if (modelConfig) {
115
+ languageModels[modelId] = modelConfig;
116
+ }
117
+ });
118
+ }
119
+ const customProviderInstance = customProvider({
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 provider.languageModel?.(aliasConfig.modelId);
150
+ }
151
+ /**
152
+ * Create model with predefined settings
153
+ */
154
+ createModelWithSettings(originalModel, settings) {
155
+ return wrapLanguageModel({
156
+ model: originalModel,
157
+ middleware: defaultSettingsMiddleware({
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: config.options?.separator || ":"
174
+ });
175
+ this.registry = createProviderRegistry(
176
+ config.providers,
177
+ config.options
178
+ );
179
+ this.emit("ai_provider:registry_created", {
180
+ providerCount: Object.keys(config.providers).length,
181
+ separator: config.options?.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 health?.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 (healthA?.latency || Infinity) - (healthB?.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 wrapLanguageModel({
590
+ model: baseModel,
591
+ middleware: defaultSettingsMiddleware({
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
+ export {
643
+ customProvider,
644
+ wrapLanguageModel,
645
+ createProviderRegistry,
646
+ defaultSettingsMiddleware,
647
+ AIProviderManagement,
648
+ ai_provider_default
649
+ };
650
+ //# sourceMappingURL=chunk-J323UTPE.mjs.map