@juspay/neurolink 9.15.0 → 9.16.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 (193) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/adapters/video/videoAnalyzer.d.ts +1 -1
  3. package/dist/adapters/video/videoAnalyzer.js +10 -8
  4. package/dist/cli/commands/setup-anthropic.js +1 -14
  5. package/dist/cli/commands/setup-azure.js +1 -12
  6. package/dist/cli/commands/setup-bedrock.js +1 -9
  7. package/dist/cli/commands/setup-google-ai.js +1 -12
  8. package/dist/cli/commands/setup-openai.js +1 -14
  9. package/dist/cli/commands/workflow.d.ts +27 -0
  10. package/dist/cli/commands/workflow.js +216 -0
  11. package/dist/cli/factories/commandFactory.js +79 -20
  12. package/dist/cli/index.js +0 -1
  13. package/dist/cli/parser.js +4 -1
  14. package/dist/cli/utils/maskCredential.d.ts +11 -0
  15. package/dist/cli/utils/maskCredential.js +23 -0
  16. package/dist/constants/contextWindows.js +107 -16
  17. package/dist/constants/enums.d.ts +99 -15
  18. package/dist/constants/enums.js +152 -22
  19. package/dist/context/budgetChecker.js +1 -1
  20. package/dist/context/contextCompactor.js +31 -4
  21. package/dist/context/emergencyTruncation.d.ts +21 -0
  22. package/dist/context/emergencyTruncation.js +88 -0
  23. package/dist/context/errorDetection.d.ts +16 -0
  24. package/dist/context/errorDetection.js +48 -1
  25. package/dist/context/errors.d.ts +19 -0
  26. package/dist/context/errors.js +21 -0
  27. package/dist/context/stages/slidingWindowTruncator.d.ts +6 -0
  28. package/dist/context/stages/slidingWindowTruncator.js +159 -24
  29. package/dist/core/baseProvider.js +306 -200
  30. package/dist/core/conversationMemoryManager.js +104 -61
  31. package/dist/core/evaluationProviders.js +16 -33
  32. package/dist/core/factory.js +237 -164
  33. package/dist/core/modules/GenerationHandler.js +175 -116
  34. package/dist/core/modules/MessageBuilder.js +222 -170
  35. package/dist/core/modules/StreamHandler.d.ts +1 -0
  36. package/dist/core/modules/StreamHandler.js +95 -27
  37. package/dist/core/modules/TelemetryHandler.d.ts +10 -1
  38. package/dist/core/modules/TelemetryHandler.js +25 -7
  39. package/dist/core/modules/ToolsManager.js +115 -191
  40. package/dist/core/redisConversationMemoryManager.js +418 -282
  41. package/dist/factories/providerRegistry.d.ts +5 -0
  42. package/dist/factories/providerRegistry.js +20 -2
  43. package/dist/index.d.ts +2 -2
  44. package/dist/index.js +4 -2
  45. package/dist/lib/adapters/video/videoAnalyzer.d.ts +1 -1
  46. package/dist/lib/adapters/video/videoAnalyzer.js +10 -8
  47. package/dist/lib/constants/contextWindows.js +107 -16
  48. package/dist/lib/constants/enums.d.ts +99 -15
  49. package/dist/lib/constants/enums.js +152 -22
  50. package/dist/lib/context/budgetChecker.js +1 -1
  51. package/dist/lib/context/contextCompactor.js +31 -4
  52. package/dist/lib/context/emergencyTruncation.d.ts +21 -0
  53. package/dist/lib/context/emergencyTruncation.js +89 -0
  54. package/dist/lib/context/errorDetection.d.ts +16 -0
  55. package/dist/lib/context/errorDetection.js +48 -1
  56. package/dist/lib/context/errors.d.ts +19 -0
  57. package/dist/lib/context/errors.js +22 -0
  58. package/dist/lib/context/stages/slidingWindowTruncator.d.ts +6 -0
  59. package/dist/lib/context/stages/slidingWindowTruncator.js +159 -24
  60. package/dist/lib/core/baseProvider.js +306 -200
  61. package/dist/lib/core/conversationMemoryManager.js +104 -61
  62. package/dist/lib/core/evaluationProviders.js +16 -33
  63. package/dist/lib/core/factory.js +237 -164
  64. package/dist/lib/core/modules/GenerationHandler.js +175 -116
  65. package/dist/lib/core/modules/MessageBuilder.js +222 -170
  66. package/dist/lib/core/modules/StreamHandler.d.ts +1 -0
  67. package/dist/lib/core/modules/StreamHandler.js +95 -27
  68. package/dist/lib/core/modules/TelemetryHandler.d.ts +10 -1
  69. package/dist/lib/core/modules/TelemetryHandler.js +25 -7
  70. package/dist/lib/core/modules/ToolsManager.js +115 -191
  71. package/dist/lib/core/redisConversationMemoryManager.js +418 -282
  72. package/dist/lib/factories/providerRegistry.d.ts +5 -0
  73. package/dist/lib/factories/providerRegistry.js +20 -2
  74. package/dist/lib/index.d.ts +2 -2
  75. package/dist/lib/index.js +4 -2
  76. package/dist/lib/mcp/externalServerManager.js +66 -0
  77. package/dist/lib/mcp/mcpCircuitBreaker.js +24 -0
  78. package/dist/lib/mcp/mcpClientFactory.js +16 -0
  79. package/dist/lib/mcp/toolDiscoveryService.js +32 -6
  80. package/dist/lib/mcp/toolRegistry.js +193 -123
  81. package/dist/lib/neurolink.d.ts +6 -0
  82. package/dist/lib/neurolink.js +1162 -646
  83. package/dist/lib/providers/amazonBedrock.d.ts +1 -1
  84. package/dist/lib/providers/amazonBedrock.js +521 -319
  85. package/dist/lib/providers/anthropic.js +73 -17
  86. package/dist/lib/providers/anthropicBaseProvider.js +77 -17
  87. package/dist/lib/providers/googleAiStudio.d.ts +1 -1
  88. package/dist/lib/providers/googleAiStudio.js +292 -227
  89. package/dist/lib/providers/googleVertex.d.ts +36 -1
  90. package/dist/lib/providers/googleVertex.js +553 -260
  91. package/dist/lib/providers/ollama.js +329 -278
  92. package/dist/lib/providers/openAI.js +77 -19
  93. package/dist/lib/providers/sagemaker/parsers.js +3 -3
  94. package/dist/lib/providers/sagemaker/streaming.js +3 -3
  95. package/dist/lib/proxy/proxyFetch.js +81 -48
  96. package/dist/lib/rag/ChunkerFactory.js +1 -1
  97. package/dist/lib/rag/chunkers/MarkdownChunker.d.ts +22 -0
  98. package/dist/lib/rag/chunkers/MarkdownChunker.js +213 -9
  99. package/dist/lib/rag/chunking/markdownChunker.d.ts +16 -0
  100. package/dist/lib/rag/chunking/markdownChunker.js +174 -2
  101. package/dist/lib/rag/pipeline/contextAssembly.js +2 -1
  102. package/dist/lib/rag/ragIntegration.d.ts +18 -1
  103. package/dist/lib/rag/ragIntegration.js +94 -14
  104. package/dist/lib/rag/retrieval/vectorQueryTool.js +21 -4
  105. package/dist/lib/server/abstract/baseServerAdapter.js +4 -1
  106. package/dist/lib/server/adapters/fastifyAdapter.js +35 -30
  107. package/dist/lib/services/server/ai/observability/instrumentation.d.ts +32 -0
  108. package/dist/lib/services/server/ai/observability/instrumentation.js +39 -0
  109. package/dist/lib/telemetry/attributes.d.ts +52 -0
  110. package/dist/lib/telemetry/attributes.js +61 -0
  111. package/dist/lib/telemetry/index.d.ts +3 -0
  112. package/dist/lib/telemetry/index.js +3 -0
  113. package/dist/lib/telemetry/telemetryService.d.ts +6 -0
  114. package/dist/lib/telemetry/telemetryService.js +6 -0
  115. package/dist/lib/telemetry/tracers.d.ts +15 -0
  116. package/dist/lib/telemetry/tracers.js +17 -0
  117. package/dist/lib/telemetry/withSpan.d.ts +9 -0
  118. package/dist/lib/telemetry/withSpan.js +35 -0
  119. package/dist/lib/types/contextTypes.d.ts +10 -0
  120. package/dist/lib/types/streamTypes.d.ts +14 -0
  121. package/dist/lib/utils/conversationMemory.js +121 -82
  122. package/dist/lib/utils/logger.d.ts +5 -0
  123. package/dist/lib/utils/logger.js +50 -2
  124. package/dist/lib/utils/messageBuilder.js +22 -42
  125. package/dist/lib/utils/modelDetection.js +3 -3
  126. package/dist/lib/utils/providerRetry.d.ts +41 -0
  127. package/dist/lib/utils/providerRetry.js +114 -0
  128. package/dist/lib/utils/retryability.d.ts +14 -0
  129. package/dist/lib/utils/retryability.js +23 -0
  130. package/dist/lib/utils/sanitizers/svg.js +4 -5
  131. package/dist/lib/utils/tokenEstimation.d.ts +11 -1
  132. package/dist/lib/utils/tokenEstimation.js +19 -4
  133. package/dist/lib/utils/videoAnalysisProcessor.js +7 -3
  134. package/dist/mcp/externalServerManager.js +66 -0
  135. package/dist/mcp/mcpCircuitBreaker.js +24 -0
  136. package/dist/mcp/mcpClientFactory.js +16 -0
  137. package/dist/mcp/toolDiscoveryService.js +32 -6
  138. package/dist/mcp/toolRegistry.js +193 -123
  139. package/dist/neurolink.d.ts +6 -0
  140. package/dist/neurolink.js +1162 -646
  141. package/dist/providers/amazonBedrock.d.ts +1 -1
  142. package/dist/providers/amazonBedrock.js +521 -319
  143. package/dist/providers/anthropic.js +73 -17
  144. package/dist/providers/anthropicBaseProvider.js +77 -17
  145. package/dist/providers/googleAiStudio.d.ts +1 -1
  146. package/dist/providers/googleAiStudio.js +292 -227
  147. package/dist/providers/googleVertex.d.ts +36 -1
  148. package/dist/providers/googleVertex.js +553 -260
  149. package/dist/providers/ollama.js +329 -278
  150. package/dist/providers/openAI.js +77 -19
  151. package/dist/providers/sagemaker/parsers.js +3 -3
  152. package/dist/providers/sagemaker/streaming.js +3 -3
  153. package/dist/proxy/proxyFetch.js +81 -48
  154. package/dist/rag/ChunkerFactory.js +1 -1
  155. package/dist/rag/chunkers/MarkdownChunker.d.ts +22 -0
  156. package/dist/rag/chunkers/MarkdownChunker.js +213 -9
  157. package/dist/rag/chunking/markdownChunker.d.ts +16 -0
  158. package/dist/rag/chunking/markdownChunker.js +174 -2
  159. package/dist/rag/pipeline/contextAssembly.js +2 -1
  160. package/dist/rag/ragIntegration.d.ts +18 -1
  161. package/dist/rag/ragIntegration.js +94 -14
  162. package/dist/rag/retrieval/vectorQueryTool.js +21 -4
  163. package/dist/server/abstract/baseServerAdapter.js +4 -1
  164. package/dist/server/adapters/fastifyAdapter.js +35 -30
  165. package/dist/services/server/ai/observability/instrumentation.d.ts +32 -0
  166. package/dist/services/server/ai/observability/instrumentation.js +39 -0
  167. package/dist/telemetry/attributes.d.ts +52 -0
  168. package/dist/telemetry/attributes.js +60 -0
  169. package/dist/telemetry/index.d.ts +3 -0
  170. package/dist/telemetry/index.js +3 -0
  171. package/dist/telemetry/telemetryService.d.ts +6 -0
  172. package/dist/telemetry/telemetryService.js +6 -0
  173. package/dist/telemetry/tracers.d.ts +15 -0
  174. package/dist/telemetry/tracers.js +16 -0
  175. package/dist/telemetry/withSpan.d.ts +9 -0
  176. package/dist/telemetry/withSpan.js +34 -0
  177. package/dist/types/contextTypes.d.ts +10 -0
  178. package/dist/types/streamTypes.d.ts +14 -0
  179. package/dist/utils/conversationMemory.js +121 -82
  180. package/dist/utils/logger.d.ts +5 -0
  181. package/dist/utils/logger.js +50 -2
  182. package/dist/utils/messageBuilder.js +22 -42
  183. package/dist/utils/modelDetection.js +3 -3
  184. package/dist/utils/providerRetry.d.ts +41 -0
  185. package/dist/utils/providerRetry.js +113 -0
  186. package/dist/utils/retryability.d.ts +14 -0
  187. package/dist/utils/retryability.js +22 -0
  188. package/dist/utils/sanitizers/svg.js +4 -5
  189. package/dist/utils/tokenEstimation.d.ts +11 -1
  190. package/dist/utils/tokenEstimation.js +19 -4
  191. package/dist/utils/videoAnalysisProcessor.js +7 -3
  192. package/dist/workflow/config.d.ts +26 -26
  193. package/package.json +1 -1
@@ -1,12 +1,16 @@
1
1
  // ✅ CIRCULAR DEPENDENCY FIX: Remove barrel export import
2
2
  // Providers are now managed via ProviderFactory instead of direct imports
3
+ import { SpanKind, SpanStatusCode } from "@opentelemetry/api";
4
+ import { tracers } from "../telemetry/tracers.js";
3
5
  import { ProviderFactory } from "../factories/providerFactory.js";
4
6
  import { ProviderRegistry } from "../factories/providerRegistry.js";
5
7
  import { getBestProvider } from "../utils/providerUtils.js";
6
8
  import { logger } from "../utils/logger.js";
7
9
  import { dynamicModelProvider } from "./dynamicModels.js";
10
+ import { withTimeout } from "../utils/errorHandling.js";
8
11
  import { AIProviderName } from "../constants/enums.js";
9
12
  const componentIdentifier = "aiProviderFactory";
13
+ const factoryTracer = tracers.factory;
10
14
  /**
11
15
  * Factory for creating AI provider instances with centralized configuration
12
16
  */
@@ -31,11 +35,7 @@ export class AIProviderFactory {
31
35
  const functionTag = "AIProviderFactory.initializeDynamicProviderWithTimeout";
32
36
  const INIT_TIMEOUT = 10000; // 10 seconds total timeout for initialization
33
37
  try {
34
- // Race the initialization against a timeout
35
- await Promise.race([
36
- dynamicModelProvider.initialize(),
37
- new Promise((_, reject) => setTimeout(() => reject(new Error("Dynamic provider initialization timeout")), INIT_TIMEOUT)),
38
- ]);
38
+ await withTimeout(dynamicModelProvider.initialize(), INIT_TIMEOUT, new Error("Dynamic provider initialization timeout"));
39
39
  logger.debug(`[${functionTag}] Dynamic model provider initialized successfully`);
40
40
  }
41
41
  catch (error) {
@@ -60,186 +60,259 @@ export class AIProviderFactory {
60
60
  static async createProvider(providerName, modelName, enableMCP = true, sdk, region) {
61
61
  const functionTag = "AIProviderFactory.createProvider";
62
62
  // Providers are registered via ProviderFactory.initialize() on first use
63
- logger.debug(`[${functionTag}] Provider creation started`, {
64
- providerName,
65
- modelName: modelName || "default",
66
- enableMCP,
67
- environmentVariables: {
68
- BEDROCK_MODEL: process.env.BEDROCK_MODEL || "not set",
69
- BEDROCK_MODEL_ID: process.env.BEDROCK_MODEL_ID || "not set",
70
- VERTEX_MODEL: process.env.VERTEX_MODEL || "not set",
71
- OPENAI_MODEL: process.env.OPENAI_MODEL || "not set",
63
+ return factoryTracer.startActiveSpan("neurolink.factory.createProvider", {
64
+ kind: SpanKind.INTERNAL,
65
+ attributes: {
66
+ "provider.name": providerName,
67
+ "model.name": modelName || "default",
68
+ "mcp.enabled": enableMCP,
72
69
  },
73
- });
74
- try {
75
- // DYNAMIC MODEL PROVIDER STATUS (2025): Enhanced with timeout handling
76
- //
77
- // ✅ FIXED: Hanging issues resolved with comprehensive timeout implementation
78
- // - Added robust timeout handling (3s localhost, 5s GitHub, 1s local file)
79
- // - Implemented health checks for localhost endpoints
80
- // - Added graceful degradation when all sources fail
81
- // - Enhanced error handling and logging for debugging
82
- //
83
- // The dynamic model provider now provides reliable functionality without hanging
84
- let resolvedModelName = modelName;
85
- // PRIORITY 1: Check environment variables BEFORE dynamic resolution
86
- if (!modelName || modelName === "default") {
87
- logger.debug(`[${functionTag}] Checking environment variables for provider: ${providerName}`);
88
- // Check for provider-specific environment variables first
89
- if (providerName.toLowerCase().includes("bedrock")) {
90
- const envModel = process.env.BEDROCK_MODEL || process.env.BEDROCK_MODEL_ID;
91
- if (envModel) {
92
- resolvedModelName = envModel;
93
- logger.debug(`[${functionTag}] Environment variable found for Bedrock`, {
94
- envVariable: process.env.BEDROCK_MODEL
95
- ? "BEDROCK_MODEL"
96
- : "BEDROCK_MODEL_ID",
97
- resolvedModel: envModel,
98
- });
70
+ }, async (span) => {
71
+ logger.debug(`[${functionTag}] Provider creation started`, {
72
+ providerName,
73
+ modelName: modelName || "default",
74
+ enableMCP,
75
+ environmentVariables: {
76
+ BEDROCK_MODEL: process.env.BEDROCK_MODEL || "not set",
77
+ BEDROCK_MODEL_ID: process.env.BEDROCK_MODEL_ID || "not set",
78
+ VERTEX_MODEL: process.env.VERTEX_MODEL || "not set",
79
+ OPENAI_MODEL: process.env.OPENAI_MODEL || "not set",
80
+ },
81
+ });
82
+ try {
83
+ // DYNAMIC MODEL PROVIDER STATUS (2025): Enhanced with timeout handling
84
+ //
85
+ // FIXED: Hanging issues resolved with comprehensive timeout implementation
86
+ // - Added robust timeout handling (3s localhost, 5s GitHub, 1s local file)
87
+ // - Implemented health checks for localhost endpoints
88
+ // - Added graceful degradation when all sources fail
89
+ // - Enhanced error handling and logging for debugging
90
+ //
91
+ // The dynamic model provider now provides reliable functionality without hanging
92
+ let resolvedModelName = modelName;
93
+ // PRIORITY 1: Check environment variables BEFORE dynamic resolution
94
+ if (!modelName || modelName === "default") {
95
+ logger.debug(`[${functionTag}] Checking environment variables for provider: ${providerName}`);
96
+ // Check for provider-specific environment variables first
97
+ if (providerName.toLowerCase().includes("bedrock")) {
98
+ const envModel = process.env.BEDROCK_MODEL || process.env.BEDROCK_MODEL_ID;
99
+ if (envModel) {
100
+ resolvedModelName = envModel;
101
+ logger.debug(`[${functionTag}] Environment variable found for Bedrock`, {
102
+ envVariable: process.env.BEDROCK_MODEL
103
+ ? "BEDROCK_MODEL"
104
+ : "BEDROCK_MODEL_ID",
105
+ resolvedModel: envModel,
106
+ });
107
+ }
108
+ else {
109
+ logger.debug(`[${functionTag}] No Bedrock environment variables found (BEDROCK_MODEL, BEDROCK_MODEL_ID)`);
110
+ }
99
111
  }
100
- else {
101
- logger.debug(`[${functionTag}] No Bedrock environment variables found (BEDROCK_MODEL, BEDROCK_MODEL_ID)`);
112
+ else if (providerName.toLowerCase().includes("vertex")) {
113
+ const envModel = process.env.VERTEX_MODEL;
114
+ if (envModel) {
115
+ resolvedModelName = envModel;
116
+ logger.debug(`[${functionTag}] Environment variable found for Vertex`, {
117
+ envVariable: "VERTEX_MODEL",
118
+ resolvedModel: envModel,
119
+ });
120
+ }
121
+ else {
122
+ logger.debug(`[${functionTag}] No Vertex environment variables found (VERTEX_MODEL)`);
123
+ }
102
124
  }
103
- }
104
- else if (providerName.toLowerCase().includes("vertex")) {
105
- const envModel = process.env.VERTEX_MODEL;
106
- if (envModel) {
107
- resolvedModelName = envModel;
108
- logger.debug(`[${functionTag}] Environment variable found for Vertex`, {
109
- envVariable: "VERTEX_MODEL",
110
- resolvedModel: envModel,
111
- });
125
+ else if (providerName.toLowerCase().includes("azure")) {
126
+ const envModel = process.env.AZURE_OPENAI_MODEL ||
127
+ process.env.AZURE_OPENAI_DEPLOYMENT ||
128
+ process.env.AZURE_OPENAI_DEPLOYMENT_ID;
129
+ if (envModel) {
130
+ resolvedModelName = envModel;
131
+ logger.debug(`[${functionTag}] Environment variable found for Azure`, {
132
+ envVariable: process.env.AZURE_OPENAI_MODEL
133
+ ? "AZURE_OPENAI_MODEL"
134
+ : process.env.AZURE_OPENAI_DEPLOYMENT
135
+ ? "AZURE_OPENAI_DEPLOYMENT"
136
+ : "AZURE_OPENAI_DEPLOYMENT_ID",
137
+ resolvedModel: envModel,
138
+ });
139
+ }
140
+ else {
141
+ logger.debug(`[${functionTag}] No Azure environment variables found (AZURE_OPENAI_MODEL, AZURE_OPENAI_DEPLOYMENT, AZURE_OPENAI_DEPLOYMENT_ID)`);
142
+ }
112
143
  }
113
- else {
114
- logger.debug(`[${functionTag}] No Vertex environment variables found (VERTEX_MODEL)`);
144
+ else if (providerName.toLowerCase().includes("openai")) {
145
+ const envModel = process.env.OPENAI_MODEL;
146
+ if (envModel) {
147
+ resolvedModelName = envModel;
148
+ logger.debug(`[${functionTag}] Environment variable found for OpenAI`, {
149
+ envVariable: "OPENAI_MODEL",
150
+ resolvedModel: envModel,
151
+ });
152
+ }
153
+ else {
154
+ logger.debug(`[${functionTag}] No OpenAI environment variables found (OPENAI_MODEL)`);
155
+ }
115
156
  }
116
- }
117
- else if (providerName.toLowerCase().includes("azure")) {
118
- const envModel = process.env.AZURE_OPENAI_MODEL ||
119
- process.env.AZURE_OPENAI_DEPLOYMENT ||
120
- process.env.AZURE_OPENAI_DEPLOYMENT_ID;
121
- if (envModel) {
122
- resolvedModelName = envModel;
123
- logger.debug(`[${functionTag}] Environment variable found for Azure`, {
124
- envVariable: process.env.AZURE_OPENAI_MODEL
125
- ? "AZURE_OPENAI_MODEL"
126
- : process.env.AZURE_OPENAI_DEPLOYMENT
127
- ? "AZURE_OPENAI_DEPLOYMENT"
128
- : "AZURE_OPENAI_DEPLOYMENT_ID",
129
- resolvedModel: envModel,
130
- });
157
+ else if (providerName.toLowerCase().includes("anthropic")) {
158
+ const envModel = process.env.ANTHROPIC_MODEL;
159
+ if (envModel) {
160
+ resolvedModelName = envModel;
161
+ logger.debug(`[${functionTag}] Environment variable found for Anthropic`, {
162
+ envVariable: "ANTHROPIC_MODEL",
163
+ resolvedModel: envModel,
164
+ });
165
+ }
166
+ else {
167
+ logger.debug(`[${functionTag}] No Anthropic environment variables found (ANTHROPIC_MODEL)`);
168
+ }
169
+ }
170
+ else if (providerName.toLowerCase().includes("google") ||
171
+ providerName.toLowerCase().includes("gemini")) {
172
+ const envModel = process.env.GOOGLE_AI_MODEL;
173
+ if (envModel) {
174
+ resolvedModelName = envModel;
175
+ logger.debug(`[${functionTag}] Environment variable found for Google AI`, {
176
+ envVariable: "GOOGLE_AI_MODEL",
177
+ resolvedModel: envModel,
178
+ });
179
+ }
180
+ else {
181
+ logger.debug(`[${functionTag}] No Google AI environment variables found (GOOGLE_AI_MODEL)`);
182
+ }
183
+ }
184
+ else if (providerName.toLowerCase().includes("mistral")) {
185
+ const envModel = process.env.MISTRAL_MODEL;
186
+ if (envModel) {
187
+ resolvedModelName = envModel;
188
+ logger.debug(`[${functionTag}] Environment variable found for Mistral`, {
189
+ envVariable: "MISTRAL_MODEL",
190
+ resolvedModel: envModel,
191
+ });
192
+ }
193
+ else {
194
+ logger.debug(`[${functionTag}] No Mistral environment variables found (MISTRAL_MODEL)`);
195
+ }
196
+ }
197
+ else if (providerName.toLowerCase().includes("ollama")) {
198
+ const envModel = process.env.OLLAMA_MODEL;
199
+ if (envModel) {
200
+ resolvedModelName = envModel;
201
+ logger.debug(`[${functionTag}] Environment variable found for Ollama`, {
202
+ envVariable: "OLLAMA_MODEL",
203
+ resolvedModel: envModel,
204
+ });
205
+ }
206
+ else {
207
+ logger.debug(`[${functionTag}] No Ollama environment variables found (OLLAMA_MODEL)`);
208
+ }
131
209
  }
132
210
  else {
133
- logger.debug(`[${functionTag}] No Azure environment variables found (AZURE_OPENAI_MODEL, AZURE_OPENAI_DEPLOYMENT, AZURE_OPENAI_DEPLOYMENT_ID)`);
211
+ logger.debug(`[${functionTag}] Provider ${providerName} - no environment variable check implemented`);
134
212
  }
135
213
  }
136
214
  else {
137
- logger.debug(`[${functionTag}] Provider ${providerName} - no environment variable check implemented`);
215
+ logger.debug(`[${functionTag}] Skipping environment variable check - explicit model provided: ${modelName}`);
138
216
  }
139
- }
140
- else {
141
- logger.debug(`[${functionTag}] Skipping environment variable check - explicit model provided: ${modelName}`);
142
- }
143
- // PRIORITY 2: Enable dynamic model resolution only if no env var found
144
- if ((!resolvedModelName || resolvedModelName === "default") &&
145
- (!modelName || modelName === "default")) {
146
- logger.debug(`[${functionTag}] Attempting dynamic model resolution`, {
147
- currentResolvedModel: resolvedModelName || "none",
148
- reason: "No environment variable found and no explicit model provided",
149
- });
150
- try {
151
- const normalizedProvider = this.normalizeProviderName(providerName);
152
- // Initialize with timeout protection - won't hang anymore
153
- if (dynamicModelProvider.needsRefresh()) {
154
- logger.debug(`[${functionTag}] Dynamic model provider needs refresh - initializing`);
155
- await this.initializeDynamicProviderWithTimeout();
217
+ // PRIORITY 2: Enable dynamic model resolution only if no env var found
218
+ if ((!resolvedModelName || resolvedModelName === "default") &&
219
+ (!modelName || modelName === "default")) {
220
+ logger.debug(`[${functionTag}] Attempting dynamic model resolution`, {
221
+ currentResolvedModel: resolvedModelName || "none",
222
+ reason: "No environment variable found and no explicit model provided",
223
+ });
224
+ try {
225
+ const normalizedProvider = this.normalizeProviderName(providerName);
226
+ // Initialize with timeout protection - won't hang anymore
227
+ if (dynamicModelProvider.needsRefresh()) {
228
+ logger.debug(`[${functionTag}] Dynamic model provider needs refresh - initializing`);
229
+ await this.initializeDynamicProviderWithTimeout();
230
+ }
231
+ const dynamicModel = dynamicModelProvider.resolveModel(normalizedProvider, modelName || undefined);
232
+ if (dynamicModel) {
233
+ resolvedModelName = dynamicModel.id;
234
+ logger.debug(`[${functionTag}] Resolved dynamic model`, {
235
+ provider: normalizedProvider,
236
+ requestedModel: modelName || "default",
237
+ resolvedModel: resolvedModelName,
238
+ displayName: dynamicModel.displayName,
239
+ pricing: dynamicModel.pricing.input,
240
+ });
241
+ }
242
+ else {
243
+ logger.debug(`[${functionTag}] Dynamic model resolution returned null`, {
244
+ provider: normalizedProvider,
245
+ requestedModel: modelName || "default",
246
+ });
247
+ }
156
248
  }
157
- const dynamicModel = dynamicModelProvider.resolveModel(normalizedProvider, modelName || undefined);
158
- if (dynamicModel) {
159
- resolvedModelName = dynamicModel.id;
160
- logger.debug(`[${functionTag}] Resolved dynamic model`, {
161
- provider: normalizedProvider,
162
- requestedModel: modelName || "default",
163
- resolvedModel: resolvedModelName,
164
- displayName: dynamicModel.displayName,
165
- pricing: dynamicModel.pricing.input,
166
- });
167
- }
168
- else {
169
- logger.debug(`[${functionTag}] Dynamic model resolution returned null`, {
170
- provider: normalizedProvider,
171
- requestedModel: modelName || "default",
249
+ catch (resolveError) {
250
+ logger.debug(`[${functionTag}] Dynamic model resolution failed, using static fallback`, {
251
+ error: resolveError instanceof Error
252
+ ? resolveError.message
253
+ : String(resolveError),
172
254
  });
255
+ // Continue with static model name - no functionality loss
173
256
  }
174
257
  }
175
- catch (resolveError) {
176
- logger.debug(`[${functionTag}] Dynamic model resolution failed, using static fallback`, {
177
- error: resolveError instanceof Error
178
- ? resolveError.message
179
- : String(resolveError),
258
+ else {
259
+ logger.debug(`[${functionTag}] Skipping dynamic model resolution`, {
260
+ resolvedModelName: resolvedModelName || "none",
261
+ reason: "Model already resolved from environment variables or explicit parameter",
180
262
  });
181
- // Continue with static model name - no functionality loss
182
263
  }
264
+ // CRITICAL FIX: Initialize providers before using them
265
+ await withTimeout(ProviderRegistry.registerAllProviders(), 30_000, new Error("Provider registration timed out"));
266
+ // PURE FACTORY PATTERN: No switch statements - use ProviderFactory exclusively
267
+ const normalizedName = this.normalizeProviderName(providerName);
268
+ const finalModelName = resolvedModelName === "default" || resolvedModelName === null
269
+ ? undefined
270
+ : resolvedModelName;
271
+ logger.debug(`[${functionTag}] Final provider configuration`, {
272
+ originalProviderName: providerName,
273
+ normalizedProviderName: normalizedName,
274
+ originalModelName: modelName || "not provided",
275
+ resolvedModelName: resolvedModelName || "not resolved",
276
+ finalModelName: finalModelName || "using provider default",
277
+ });
278
+ // Create provider with enhanced SDK and region support
279
+ const provider = await withTimeout(ProviderFactory.createProvider(normalizedName, finalModelName, sdk, region), 30_000, new Error(`Provider creation timed out for ${normalizedName}`));
280
+ // Summary logging in format expected by debugging tools
281
+ logger.debug(`[AIProviderFactory] Provider creation completed { providerName: '${normalizedName}', modelName: '${finalModelName}' }`);
282
+ logger.debug(`[AIProviderFactory] Resolved model: ${finalModelName}`);
283
+ logger.debug(componentIdentifier, "Pure factory pattern provider created", {
284
+ providerName: normalizedName,
285
+ modelName: finalModelName,
286
+ factoryUsed: true,
287
+ });
288
+ span.setAttribute("provider.resolved_name", normalizedName);
289
+ if (finalModelName) {
290
+ span.setAttribute("model.resolved_name", finalModelName);
291
+ }
292
+ logger.debug(`[${functionTag}] Provider creation succeeded`, {
293
+ providerName,
294
+ modelName: finalModelName || "default",
295
+ providerType: provider.constructor.name,
296
+ mcpEnabled: enableMCP,
297
+ });
298
+ span.setStatus({ code: SpanStatusCode.OK });
299
+ return provider;
183
300
  }
184
- else {
185
- logger.debug(`[${functionTag}] Skipping dynamic model resolution`, {
186
- resolvedModelName: resolvedModelName || "none",
187
- reason: "Model already resolved from environment variables or explicit parameter",
301
+ catch (error) {
302
+ const errorMessage = error instanceof Error ? error.message : String(error);
303
+ span.setStatus({ code: SpanStatusCode.ERROR, message: errorMessage });
304
+ span.recordException(error instanceof Error ? error : new Error(String(error)));
305
+ logger.debug(`[${functionTag}] Provider creation failed`, {
306
+ providerName,
307
+ modelName: modelName || "default",
308
+ error: errorMessage,
188
309
  });
310
+ throw error;
189
311
  }
190
- // CRITICAL FIX: Initialize providers before using them
191
- await ProviderRegistry.registerAllProviders();
192
- // PURE FACTORY PATTERN: No switch statements - use ProviderFactory exclusively
193
- const normalizedName = this.normalizeProviderName(providerName);
194
- const finalModelName = resolvedModelName === "default" || resolvedModelName === null
195
- ? undefined
196
- : resolvedModelName;
197
- logger.debug(`[${functionTag}] Final provider configuration`, {
198
- originalProviderName: providerName,
199
- normalizedProviderName: normalizedName,
200
- originalModelName: modelName || "not provided",
201
- resolvedModelName: resolvedModelName || "not resolved",
202
- finalModelName: finalModelName || "using provider default",
203
- });
204
- // Create provider with enhanced SDK and region support
205
- const provider = await ProviderFactory.createProvider(normalizedName, finalModelName, sdk, region);
206
- // Summary logging in format expected by debugging tools
207
- logger.debug(`[AIProviderFactory] Provider creation completed { providerName: '${normalizedName}', modelName: '${finalModelName}' }`);
208
- logger.debug(`[AIProviderFactory] Resolved model: ${finalModelName}`);
209
- logger.debug(componentIdentifier, "Pure factory pattern provider created", {
210
- providerName: normalizedName,
211
- modelName: finalModelName,
212
- factoryUsed: true,
213
- });
214
- // Wrap with MCP if enabled
215
- if (enableMCP) {
216
- try {
217
- logger.debug(`[${functionTag}] MCP wrapping disabled - functionCalling removed`);
218
- // MCP wrapping simplified - removed functionCalling dependency
219
- }
220
- catch (mcpError) {
221
- logger.warn(`[${functionTag}] Failed to wrap with MCP, using base provider`, {
222
- error: mcpError instanceof Error ? mcpError.message : String(mcpError),
223
- });
224
- }
312
+ finally {
313
+ span.end();
225
314
  }
226
- logger.debug(`[${functionTag}] Provider creation succeeded`, {
227
- providerName,
228
- modelName: finalModelName || "default",
229
- providerType: provider.constructor.name,
230
- mcpEnabled: enableMCP,
231
- });
232
- return provider;
233
- }
234
- catch (error) {
235
- const errorMessage = error instanceof Error ? error.message : String(error);
236
- logger.debug(`[${functionTag}] Provider creation failed`, {
237
- providerName,
238
- modelName: modelName || "default",
239
- error: errorMessage,
240
- });
241
- throw error;
242
- }
315
+ });
243
316
  }
244
317
  /**
245
318
  * Create a provider instance with specific provider enum and model