@scenemesh/entity-engine-aimodule 1.0.0 → 1.0.1

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