@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.
- package/CHANGELOG.md +6 -0
- package/dist/adapters/video/videoAnalyzer.d.ts +1 -1
- package/dist/adapters/video/videoAnalyzer.js +10 -8
- package/dist/cli/commands/setup-anthropic.js +1 -14
- package/dist/cli/commands/setup-azure.js +1 -12
- package/dist/cli/commands/setup-bedrock.js +1 -9
- package/dist/cli/commands/setup-google-ai.js +1 -12
- package/dist/cli/commands/setup-openai.js +1 -14
- package/dist/cli/commands/workflow.d.ts +27 -0
- package/dist/cli/commands/workflow.js +216 -0
- package/dist/cli/factories/commandFactory.js +79 -20
- package/dist/cli/index.js +0 -1
- package/dist/cli/parser.js +4 -1
- package/dist/cli/utils/maskCredential.d.ts +11 -0
- package/dist/cli/utils/maskCredential.js +23 -0
- package/dist/constants/contextWindows.js +107 -16
- package/dist/constants/enums.d.ts +99 -15
- package/dist/constants/enums.js +152 -22
- package/dist/context/budgetChecker.js +1 -1
- package/dist/context/contextCompactor.js +31 -4
- package/dist/context/emergencyTruncation.d.ts +21 -0
- package/dist/context/emergencyTruncation.js +88 -0
- package/dist/context/errorDetection.d.ts +16 -0
- package/dist/context/errorDetection.js +48 -1
- package/dist/context/errors.d.ts +19 -0
- package/dist/context/errors.js +21 -0
- package/dist/context/stages/slidingWindowTruncator.d.ts +6 -0
- package/dist/context/stages/slidingWindowTruncator.js +159 -24
- package/dist/core/baseProvider.js +306 -200
- package/dist/core/conversationMemoryManager.js +104 -61
- package/dist/core/evaluationProviders.js +16 -33
- package/dist/core/factory.js +237 -164
- package/dist/core/modules/GenerationHandler.js +175 -116
- package/dist/core/modules/MessageBuilder.js +222 -170
- package/dist/core/modules/StreamHandler.d.ts +1 -0
- package/dist/core/modules/StreamHandler.js +95 -27
- package/dist/core/modules/TelemetryHandler.d.ts +10 -1
- package/dist/core/modules/TelemetryHandler.js +25 -7
- package/dist/core/modules/ToolsManager.js +115 -191
- package/dist/core/redisConversationMemoryManager.js +418 -282
- package/dist/factories/providerRegistry.d.ts +5 -0
- package/dist/factories/providerRegistry.js +20 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +4 -2
- package/dist/lib/adapters/video/videoAnalyzer.d.ts +1 -1
- package/dist/lib/adapters/video/videoAnalyzer.js +10 -8
- package/dist/lib/constants/contextWindows.js +107 -16
- package/dist/lib/constants/enums.d.ts +99 -15
- package/dist/lib/constants/enums.js +152 -22
- package/dist/lib/context/budgetChecker.js +1 -1
- package/dist/lib/context/contextCompactor.js +31 -4
- package/dist/lib/context/emergencyTruncation.d.ts +21 -0
- package/dist/lib/context/emergencyTruncation.js +89 -0
- package/dist/lib/context/errorDetection.d.ts +16 -0
- package/dist/lib/context/errorDetection.js +48 -1
- package/dist/lib/context/errors.d.ts +19 -0
- package/dist/lib/context/errors.js +22 -0
- package/dist/lib/context/stages/slidingWindowTruncator.d.ts +6 -0
- package/dist/lib/context/stages/slidingWindowTruncator.js +159 -24
- package/dist/lib/core/baseProvider.js +306 -200
- package/dist/lib/core/conversationMemoryManager.js +104 -61
- package/dist/lib/core/evaluationProviders.js +16 -33
- package/dist/lib/core/factory.js +237 -164
- package/dist/lib/core/modules/GenerationHandler.js +175 -116
- package/dist/lib/core/modules/MessageBuilder.js +222 -170
- package/dist/lib/core/modules/StreamHandler.d.ts +1 -0
- package/dist/lib/core/modules/StreamHandler.js +95 -27
- package/dist/lib/core/modules/TelemetryHandler.d.ts +10 -1
- package/dist/lib/core/modules/TelemetryHandler.js +25 -7
- package/dist/lib/core/modules/ToolsManager.js +115 -191
- package/dist/lib/core/redisConversationMemoryManager.js +418 -282
- package/dist/lib/factories/providerRegistry.d.ts +5 -0
- package/dist/lib/factories/providerRegistry.js +20 -2
- package/dist/lib/index.d.ts +2 -2
- package/dist/lib/index.js +4 -2
- package/dist/lib/mcp/externalServerManager.js +66 -0
- package/dist/lib/mcp/mcpCircuitBreaker.js +24 -0
- package/dist/lib/mcp/mcpClientFactory.js +16 -0
- package/dist/lib/mcp/toolDiscoveryService.js +32 -6
- package/dist/lib/mcp/toolRegistry.js +193 -123
- package/dist/lib/neurolink.d.ts +6 -0
- package/dist/lib/neurolink.js +1162 -646
- package/dist/lib/providers/amazonBedrock.d.ts +1 -1
- package/dist/lib/providers/amazonBedrock.js +521 -319
- package/dist/lib/providers/anthropic.js +73 -17
- package/dist/lib/providers/anthropicBaseProvider.js +77 -17
- package/dist/lib/providers/googleAiStudio.d.ts +1 -1
- package/dist/lib/providers/googleAiStudio.js +292 -227
- package/dist/lib/providers/googleVertex.d.ts +36 -1
- package/dist/lib/providers/googleVertex.js +553 -260
- package/dist/lib/providers/ollama.js +329 -278
- package/dist/lib/providers/openAI.js +77 -19
- package/dist/lib/providers/sagemaker/parsers.js +3 -3
- package/dist/lib/providers/sagemaker/streaming.js +3 -3
- package/dist/lib/proxy/proxyFetch.js +81 -48
- package/dist/lib/rag/ChunkerFactory.js +1 -1
- package/dist/lib/rag/chunkers/MarkdownChunker.d.ts +22 -0
- package/dist/lib/rag/chunkers/MarkdownChunker.js +213 -9
- package/dist/lib/rag/chunking/markdownChunker.d.ts +16 -0
- package/dist/lib/rag/chunking/markdownChunker.js +174 -2
- package/dist/lib/rag/pipeline/contextAssembly.js +2 -1
- package/dist/lib/rag/ragIntegration.d.ts +18 -1
- package/dist/lib/rag/ragIntegration.js +94 -14
- package/dist/lib/rag/retrieval/vectorQueryTool.js +21 -4
- package/dist/lib/server/abstract/baseServerAdapter.js +4 -1
- package/dist/lib/server/adapters/fastifyAdapter.js +35 -30
- package/dist/lib/services/server/ai/observability/instrumentation.d.ts +32 -0
- package/dist/lib/services/server/ai/observability/instrumentation.js +39 -0
- package/dist/lib/telemetry/attributes.d.ts +52 -0
- package/dist/lib/telemetry/attributes.js +61 -0
- package/dist/lib/telemetry/index.d.ts +3 -0
- package/dist/lib/telemetry/index.js +3 -0
- package/dist/lib/telemetry/telemetryService.d.ts +6 -0
- package/dist/lib/telemetry/telemetryService.js +6 -0
- package/dist/lib/telemetry/tracers.d.ts +15 -0
- package/dist/lib/telemetry/tracers.js +17 -0
- package/dist/lib/telemetry/withSpan.d.ts +9 -0
- package/dist/lib/telemetry/withSpan.js +35 -0
- package/dist/lib/types/contextTypes.d.ts +10 -0
- package/dist/lib/types/streamTypes.d.ts +14 -0
- package/dist/lib/utils/conversationMemory.js +121 -82
- package/dist/lib/utils/logger.d.ts +5 -0
- package/dist/lib/utils/logger.js +50 -2
- package/dist/lib/utils/messageBuilder.js +22 -42
- package/dist/lib/utils/modelDetection.js +3 -3
- package/dist/lib/utils/providerRetry.d.ts +41 -0
- package/dist/lib/utils/providerRetry.js +114 -0
- package/dist/lib/utils/retryability.d.ts +14 -0
- package/dist/lib/utils/retryability.js +23 -0
- package/dist/lib/utils/sanitizers/svg.js +4 -5
- package/dist/lib/utils/tokenEstimation.d.ts +11 -1
- package/dist/lib/utils/tokenEstimation.js +19 -4
- package/dist/lib/utils/videoAnalysisProcessor.js +7 -3
- package/dist/mcp/externalServerManager.js +66 -0
- package/dist/mcp/mcpCircuitBreaker.js +24 -0
- package/dist/mcp/mcpClientFactory.js +16 -0
- package/dist/mcp/toolDiscoveryService.js +32 -6
- package/dist/mcp/toolRegistry.js +193 -123
- package/dist/neurolink.d.ts +6 -0
- package/dist/neurolink.js +1162 -646
- package/dist/providers/amazonBedrock.d.ts +1 -1
- package/dist/providers/amazonBedrock.js +521 -319
- package/dist/providers/anthropic.js +73 -17
- package/dist/providers/anthropicBaseProvider.js +77 -17
- package/dist/providers/googleAiStudio.d.ts +1 -1
- package/dist/providers/googleAiStudio.js +292 -227
- package/dist/providers/googleVertex.d.ts +36 -1
- package/dist/providers/googleVertex.js +553 -260
- package/dist/providers/ollama.js +329 -278
- package/dist/providers/openAI.js +77 -19
- package/dist/providers/sagemaker/parsers.js +3 -3
- package/dist/providers/sagemaker/streaming.js +3 -3
- package/dist/proxy/proxyFetch.js +81 -48
- package/dist/rag/ChunkerFactory.js +1 -1
- package/dist/rag/chunkers/MarkdownChunker.d.ts +22 -0
- package/dist/rag/chunkers/MarkdownChunker.js +213 -9
- package/dist/rag/chunking/markdownChunker.d.ts +16 -0
- package/dist/rag/chunking/markdownChunker.js +174 -2
- package/dist/rag/pipeline/contextAssembly.js +2 -1
- package/dist/rag/ragIntegration.d.ts +18 -1
- package/dist/rag/ragIntegration.js +94 -14
- package/dist/rag/retrieval/vectorQueryTool.js +21 -4
- package/dist/server/abstract/baseServerAdapter.js +4 -1
- package/dist/server/adapters/fastifyAdapter.js +35 -30
- package/dist/services/server/ai/observability/instrumentation.d.ts +32 -0
- package/dist/services/server/ai/observability/instrumentation.js +39 -0
- package/dist/telemetry/attributes.d.ts +52 -0
- package/dist/telemetry/attributes.js +60 -0
- package/dist/telemetry/index.d.ts +3 -0
- package/dist/telemetry/index.js +3 -0
- package/dist/telemetry/telemetryService.d.ts +6 -0
- package/dist/telemetry/telemetryService.js +6 -0
- package/dist/telemetry/tracers.d.ts +15 -0
- package/dist/telemetry/tracers.js +16 -0
- package/dist/telemetry/withSpan.d.ts +9 -0
- package/dist/telemetry/withSpan.js +34 -0
- package/dist/types/contextTypes.d.ts +10 -0
- package/dist/types/streamTypes.d.ts +14 -0
- package/dist/utils/conversationMemory.js +121 -82
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.js +50 -2
- package/dist/utils/messageBuilder.js +22 -42
- package/dist/utils/modelDetection.js +3 -3
- package/dist/utils/providerRetry.d.ts +41 -0
- package/dist/utils/providerRetry.js +113 -0
- package/dist/utils/retryability.d.ts +14 -0
- package/dist/utils/retryability.js +22 -0
- package/dist/utils/sanitizers/svg.js +4 -5
- package/dist/utils/tokenEstimation.d.ts +11 -1
- package/dist/utils/tokenEstimation.js +19 -4
- package/dist/utils/videoAnalysisProcessor.js +7 -3
- package/dist/workflow/config.d.ts +26 -26
- package/package.json +1 -1
package/dist/core/factory.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
//
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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}]
|
|
211
|
+
logger.debug(`[${functionTag}] Provider ${providerName} - no environment variable check implemented`);
|
|
134
212
|
}
|
|
135
213
|
}
|
|
136
214
|
else {
|
|
137
|
-
logger.debug(`[${functionTag}]
|
|
215
|
+
logger.debug(`[${functionTag}] Skipping environment variable check - explicit model provided: ${modelName}`);
|
|
138
216
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
|
|
176
|
-
logger.debug(`[${functionTag}]
|
|
177
|
-
|
|
178
|
-
|
|
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
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
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
|
-
|
|
191
|
-
|
|
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
|
-
|
|
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
|