@juspay/neurolink 10.12.9 → 11.1.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 +32 -0
- package/dist/browser/neurolink.min.js +504 -506
- package/dist/cli/commands/setup.d.ts +20 -1
- package/dist/cli/commands/setup.js +160 -36
- package/dist/cli/factories/commandFactory.d.ts +1157 -1
- package/dist/cli/factories/commandFactory.js +20 -53
- package/dist/core/baseProvider.js +3 -3
- package/dist/core/dynamicModels.d.ts +1 -1
- package/dist/core/dynamicModels.js +1 -23
- package/dist/core/modelConfiguration.d.ts +1 -70
- package/dist/core/modelConfiguration.js +0 -303
- package/dist/core/modules/GenerationHandler.js +2 -2
- package/dist/core/modules/structuredOutputPolicy.d.ts +2 -2
- package/dist/core/modules/structuredOutputPolicy.js +2 -2
- package/dist/factories/providerDescriptors.d.ts +18 -0
- package/dist/factories/providerDescriptors.js +536 -0
- package/dist/factories/providerFactory.d.ts +28 -2
- package/dist/factories/providerFactory.js +53 -42
- package/dist/factories/providerRegistry.js +33 -32
- package/dist/index.d.ts +10 -1
- package/dist/index.js +13 -3
- package/dist/lib/core/baseProvider.js +3 -3
- package/dist/lib/core/dynamicModels.d.ts +1 -1
- package/dist/lib/core/dynamicModels.js +1 -23
- package/dist/lib/core/modelConfiguration.d.ts +1 -70
- package/dist/lib/core/modelConfiguration.js +0 -303
- package/dist/lib/core/modules/GenerationHandler.js +2 -2
- package/dist/lib/core/modules/structuredOutputPolicy.d.ts +2 -2
- package/dist/lib/core/modules/structuredOutputPolicy.js +2 -2
- package/dist/lib/factories/providerDescriptors.d.ts +18 -0
- package/dist/lib/factories/providerDescriptors.js +537 -0
- package/dist/lib/factories/providerFactory.d.ts +28 -2
- package/dist/lib/factories/providerFactory.js +53 -42
- package/dist/lib/factories/providerRegistry.js +33 -32
- package/dist/lib/index.d.ts +10 -1
- package/dist/lib/index.js +13 -3
- package/dist/lib/models/anthropicModels.d.ts +0 -7
- package/dist/lib/models/anthropicModels.js +0 -9
- package/dist/lib/neurolink.js +25 -37
- package/dist/lib/providers/amazonBedrock/client.js +34 -16
- package/dist/lib/providers/anthropic/client.js +39 -34
- package/dist/lib/providers/anthropic/constants.d.ts +0 -1
- package/dist/lib/providers/anthropic/constants.js +0 -2
- package/dist/lib/providers/anthropic/index.d.ts +0 -1
- package/dist/lib/providers/anthropic/index.js +0 -1
- package/dist/lib/providers/azureOpenai.js +17 -15
- package/dist/lib/providers/cloudflare.js +12 -21
- package/dist/lib/providers/cohere.js +31 -25
- package/dist/lib/providers/deepseek.js +23 -26
- package/dist/lib/providers/fireworks.js +12 -21
- package/dist/lib/providers/googleAiStudio/client.d.ts +2 -0
- package/dist/lib/providers/googleAiStudio/client.js +39 -17
- package/dist/lib/providers/googleAiStudio/index.d.ts +0 -1
- package/dist/lib/providers/googleAiStudio/index.js +0 -1
- package/dist/lib/providers/googleNativeGemini3/index.d.ts +0 -1
- package/dist/lib/providers/googleNativeGemini3/index.js +0 -1
- package/dist/lib/providers/googleVertex/client.d.ts +0 -51
- package/dist/lib/providers/googleVertex/client.js +107 -777
- package/dist/lib/providers/groq.js +19 -22
- package/dist/lib/providers/huggingFace/client.d.ts +1 -1
- package/dist/lib/providers/huggingFace/client.js +27 -25
- package/dist/lib/providers/huggingFace/index.d.ts +0 -1
- package/dist/lib/providers/huggingFace/index.js +0 -1
- package/dist/lib/providers/jina.d.ts +0 -1
- package/dist/lib/providers/jina.js +0 -1
- package/dist/lib/providers/litellm/client.js +54 -39
- package/dist/lib/providers/litellm/index.d.ts +0 -2
- package/dist/lib/providers/litellm/index.js +0 -2
- package/dist/lib/providers/llamaCpp.d.ts +1 -0
- package/dist/lib/providers/llamaCpp.js +24 -18
- package/dist/lib/providers/lmStudio.js +25 -42
- package/dist/lib/providers/mistral.js +12 -24
- package/dist/lib/providers/nvidiaNim/client.js +37 -34
- package/dist/lib/providers/nvidiaNim/index.d.ts +0 -1
- package/dist/lib/providers/nvidiaNim/index.js +0 -1
- package/dist/lib/providers/ollama/client.js +51 -58
- package/dist/lib/providers/ollama/index.d.ts +0 -1
- package/dist/lib/providers/ollama/index.js +0 -1
- package/dist/lib/providers/openAI/client.js +37 -40
- package/dist/lib/providers/openAI/index.d.ts +0 -2
- package/dist/lib/providers/openAI/index.js +0 -2
- package/dist/lib/providers/openRouter/client.js +53 -47
- package/dist/lib/providers/openRouter/utils.d.ts +0 -2
- package/dist/lib/providers/openRouter/utils.js +0 -12
- package/dist/lib/providers/openaiChatCompletionsBase.d.ts +9 -0
- package/dist/lib/providers/openaiChatCompletionsBase.js +73 -16
- package/dist/lib/providers/openaiCompatible/client.js +36 -32
- package/dist/lib/providers/perplexity.d.ts +2 -1
- package/dist/lib/providers/perplexity.js +14 -22
- package/dist/lib/providers/replicate.d.ts +0 -1
- package/dist/lib/providers/replicate.js +22 -9
- package/dist/lib/providers/togetherAi.js +12 -21
- package/dist/lib/providers/voyage.d.ts +0 -1
- package/dist/lib/providers/voyage.js +0 -1
- package/dist/lib/providers/xai.js +17 -26
- package/dist/lib/server/errors.d.ts +1 -1
- package/dist/lib/server/errors.js +2 -2
- package/dist/lib/server/index.d.ts +2 -2
- package/dist/lib/server/index.js +5 -3
- package/dist/lib/server/middleware/rateLimit.d.ts +0 -4
- package/dist/lib/server/middleware/rateLimit.js +0 -4
- package/dist/lib/types/errors.d.ts +35 -0
- package/dist/lib/types/index.d.ts +0 -1
- package/dist/lib/types/index.js +0 -1
- package/dist/lib/types/providers.d.ts +66 -11
- package/dist/lib/utils/errorClassifier.d.ts +30 -0
- package/dist/lib/utils/errorClassifier.js +94 -0
- package/dist/lib/utils/fileDetector.js +6 -43
- package/dist/lib/utils/providerConfig.d.ts +0 -8
- package/dist/lib/utils/providerConfig.js +0 -37
- package/dist/lib/utils/providerHealth.d.ts +42 -7
- package/dist/lib/utils/providerHealth.js +115 -122
- package/dist/lib/utils/providerUtils.js +21 -87
- package/dist/models/anthropicModels.d.ts +0 -7
- package/dist/models/anthropicModels.js +0 -9
- package/dist/neurolink.js +25 -37
- package/dist/providers/amazonBedrock/client.js +34 -16
- package/dist/providers/amazonSagemaker.d.ts +1 -1
- package/dist/providers/anthropic/client.js +39 -34
- package/dist/providers/anthropic/constants.d.ts +0 -1
- package/dist/providers/anthropic/constants.js +0 -2
- package/dist/providers/anthropic/index.d.ts +0 -1
- package/dist/providers/anthropic/index.js +0 -1
- package/dist/providers/azureOpenai.js +17 -15
- package/dist/providers/cloudflare.js +12 -21
- package/dist/providers/cohere.js +31 -25
- package/dist/providers/deepseek.js +23 -26
- package/dist/providers/fireworks.js +12 -21
- package/dist/providers/googleAiStudio/client.d.ts +2 -0
- package/dist/providers/googleAiStudio/client.js +39 -17
- package/dist/providers/googleAiStudio/index.d.ts +0 -1
- package/dist/providers/googleAiStudio/index.js +0 -1
- package/dist/providers/googleNativeGemini3/index.d.ts +0 -1
- package/dist/providers/googleNativeGemini3/index.js +0 -1
- package/dist/providers/googleVertex/client.d.ts +0 -51
- package/dist/providers/googleVertex/client.js +107 -777
- package/dist/providers/groq.js +19 -22
- package/dist/providers/huggingFace/client.d.ts +1 -1
- package/dist/providers/huggingFace/client.js +27 -25
- package/dist/providers/huggingFace/index.d.ts +0 -1
- package/dist/providers/huggingFace/index.js +0 -1
- package/dist/providers/jina.d.ts +0 -1
- package/dist/providers/jina.js +0 -1
- package/dist/providers/litellm/client.js +54 -39
- package/dist/providers/litellm/index.d.ts +0 -2
- package/dist/providers/litellm/index.js +0 -2
- package/dist/providers/llamaCpp.d.ts +1 -0
- package/dist/providers/llamaCpp.js +24 -18
- package/dist/providers/lmStudio.js +25 -42
- package/dist/providers/mistral.js +12 -24
- package/dist/providers/nvidiaNim/client.js +37 -34
- package/dist/providers/nvidiaNim/index.d.ts +0 -1
- package/dist/providers/nvidiaNim/index.js +0 -1
- package/dist/providers/ollama/client.js +51 -58
- package/dist/providers/ollama/index.d.ts +0 -1
- package/dist/providers/ollama/index.js +0 -1
- package/dist/providers/openAI/client.js +37 -40
- package/dist/providers/openAI/index.d.ts +0 -2
- package/dist/providers/openAI/index.js +0 -2
- package/dist/providers/openRouter/client.js +53 -47
- package/dist/providers/openRouter/utils.d.ts +0 -2
- package/dist/providers/openRouter/utils.js +0 -12
- package/dist/providers/openaiChatCompletionsBase.d.ts +9 -0
- package/dist/providers/openaiChatCompletionsBase.js +73 -16
- package/dist/providers/openaiCompatible/client.js +36 -32
- package/dist/providers/perplexity.d.ts +2 -1
- package/dist/providers/perplexity.js +14 -22
- package/dist/providers/replicate.d.ts +0 -1
- package/dist/providers/replicate.js +22 -9
- package/dist/providers/sagemaker/language-model.d.ts +2 -2
- package/dist/providers/togetherAi.js +12 -21
- package/dist/providers/voyage.d.ts +0 -1
- package/dist/providers/voyage.js +0 -1
- package/dist/providers/xai.js +17 -26
- package/dist/server/errors.d.ts +1 -1
- package/dist/server/errors.js +2 -2
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +5 -3
- package/dist/server/middleware/rateLimit.d.ts +0 -4
- package/dist/server/middleware/rateLimit.js +0 -4
- package/dist/types/errors.d.ts +35 -0
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.js +0 -1
- package/dist/types/providers.d.ts +66 -11
- package/dist/utils/errorClassifier.d.ts +30 -0
- package/dist/utils/errorClassifier.js +93 -0
- package/dist/utils/fileDetector.js +6 -43
- package/dist/utils/providerConfig.d.ts +0 -8
- package/dist/utils/providerConfig.js +0 -37
- package/dist/utils/providerHealth.d.ts +42 -7
- package/dist/utils/providerHealth.js +115 -122
- package/dist/utils/providerUtils.js +21 -87
- package/package.json +21 -75
- package/dist/lib/providers/anthropic/utils.d.ts +0 -7
- package/dist/lib/providers/anthropic/utils.js +0 -150
- package/dist/lib/providers/googleAiStudio/utils.d.ts +0 -2
- package/dist/lib/providers/googleAiStudio/utils.js +0 -19
- package/dist/lib/providers/googleNativeGemini3/constants.d.ts +0 -1
- package/dist/lib/providers/googleNativeGemini3/constants.js +0 -2
- package/dist/lib/providers/huggingFace/utils.d.ts +0 -2
- package/dist/lib/providers/huggingFace/utils.js +0 -8
- package/dist/lib/providers/index.d.ts +0 -33
- package/dist/lib/providers/index.js +0 -34
- package/dist/lib/providers/litellm/constants.d.ts +0 -1
- package/dist/lib/providers/litellm/constants.js +0 -3
- package/dist/lib/providers/litellm/utils.d.ts +0 -5
- package/dist/lib/providers/litellm/utils.js +0 -11
- package/dist/lib/providers/nvidiaNim/utils.d.ts +0 -9
- package/dist/lib/providers/nvidiaNim/utils.js +0 -101
- package/dist/lib/providers/ollama/utils.d.ts +0 -8
- package/dist/lib/providers/ollama/utils.js +0 -43
- package/dist/lib/providers/openAI/constants.d.ts +0 -1
- package/dist/lib/providers/openAI/constants.js +0 -3
- package/dist/lib/providers/openAI/utils.d.ts +0 -2
- package/dist/lib/providers/openAI/utils.js +0 -8
- package/dist/lib/types/universalProviderOptions.d.ts +0 -89
- package/dist/lib/types/universalProviderOptions.js +0 -55
- package/dist/providers/anthropic/utils.d.ts +0 -7
- package/dist/providers/anthropic/utils.js +0 -149
- package/dist/providers/googleAiStudio/utils.d.ts +0 -2
- package/dist/providers/googleAiStudio/utils.js +0 -18
- package/dist/providers/googleNativeGemini3/constants.d.ts +0 -1
- package/dist/providers/googleNativeGemini3/constants.js +0 -1
- package/dist/providers/huggingFace/utils.d.ts +0 -2
- package/dist/providers/huggingFace/utils.js +0 -7
- package/dist/providers/index.d.ts +0 -33
- package/dist/providers/index.js +0 -33
- package/dist/providers/litellm/constants.d.ts +0 -1
- package/dist/providers/litellm/constants.js +0 -2
- package/dist/providers/litellm/utils.d.ts +0 -5
- package/dist/providers/litellm/utils.js +0 -10
- package/dist/providers/nvidiaNim/utils.d.ts +0 -9
- package/dist/providers/nvidiaNim/utils.js +0 -100
- package/dist/providers/ollama/utils.d.ts +0 -8
- package/dist/providers/ollama/utils.js +0 -42
- package/dist/providers/openAI/constants.d.ts +0 -1
- package/dist/providers/openAI/constants.js +0 -2
- package/dist/providers/openAI/utils.d.ts +0 -2
- package/dist/providers/openAI/utils.js +0 -7
- package/dist/types/universalProviderOptions.d.ts +0 -89
- package/dist/types/universalProviderOptions.js +0 -54
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { logger } from "./logger.js";
|
|
6
6
|
import { AIProviderName, OpenAIModels, GoogleAIModels, AnthropicModels, BedrockModels, } from "../constants/enums.js";
|
|
7
|
-
import {
|
|
7
|
+
import { PROJECT_ID_FORMAT } from "./providerConfig.js";
|
|
8
8
|
import { basename } from "path";
|
|
9
9
|
import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
10
10
|
import { DEFAULT_OLLAMA_MODEL } from "../providers/ollama/constants.js";
|
|
11
|
+
import { ProviderFactory } from "../factories/providerFactory.js";
|
|
11
12
|
export class ProviderHealthChecker {
|
|
12
13
|
static healthCache = new Map();
|
|
13
14
|
static DEFAULT_TIMEOUT = 5000; // 5 seconds
|
|
@@ -172,55 +173,36 @@ export class ProviderHealthChecker {
|
|
|
172
173
|
logger.debug("Vertex AI authentication check starting", {
|
|
173
174
|
providerName,
|
|
174
175
|
});
|
|
175
|
-
//
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
// Method 2: Check individual environment variables
|
|
201
|
-
const hasIndividualAuth = !!(process.env.GOOGLE_AUTH_CLIENT_EMAIL &&
|
|
202
|
-
process.env.GOOGLE_AUTH_PRIVATE_KEY);
|
|
203
|
-
logger.debug("Individual auth check", {
|
|
204
|
-
hasClientEmail: !!process.env.GOOGLE_AUTH_CLIENT_EMAIL,
|
|
205
|
-
hasPrivateKey: !!process.env.GOOGLE_AUTH_PRIVATE_KEY,
|
|
206
|
-
hasIndividualAuth,
|
|
207
|
-
});
|
|
208
|
-
// Vertex is valid if EITHER auth method works
|
|
209
|
-
const hasValidAuth = fileBasedAuthValid || hasIndividualAuth;
|
|
210
|
-
logger.debug("Vertex auth final result", {
|
|
211
|
-
fileBasedAuthValid,
|
|
212
|
-
hasIndividualAuth,
|
|
213
|
-
hasValidAuth,
|
|
214
|
-
});
|
|
176
|
+
// Derive auth-var acceptance from the vertex descriptor instead of a
|
|
177
|
+
// hand-maintained var list, so this stays in sync with the real
|
|
178
|
+
// gating logic (hasGoogleCredentials() in googleVertex/client.ts and
|
|
179
|
+
// googleVertex/utils.ts): extraRequired.every(...) ||
|
|
180
|
+
// extraRequiredFallbacks.some(...), the same pattern used by
|
|
181
|
+
// hasProviderEnvVars() (providerUtils.ts), setup.ts, and
|
|
182
|
+
// environmentManager.ts. The old two-method check here only
|
|
183
|
+
// recognized GOOGLE_APPLICATION_CREDENTIALS or the
|
|
184
|
+
// GOOGLE_AUTH_CLIENT_EMAIL + GOOGLE_AUTH_PRIVATE_KEY pair — missing
|
|
185
|
+
// GOOGLE_SERVICE_ACCOUNT_KEY and, most importantly,
|
|
186
|
+
// GOOGLE_APPLICATION_CREDENTIALS_NEUROLINK, the descriptor's
|
|
187
|
+
// documented first-priority fallback. A user configured via that
|
|
188
|
+
// var alone had a fully working Vertex provider but was reported
|
|
189
|
+
// unhealthy here. Note: this is a presence-only check — it no
|
|
190
|
+
// longer verifies the GOOGLE_APPLICATION_CREDENTIALS file actually
|
|
191
|
+
// exists on disk (the old file-based method did via fs.access),
|
|
192
|
+
// matching the presence-only semantics already used by the other
|
|
193
|
+
// three callers of this pattern.
|
|
194
|
+
const descriptor = ProviderFactory.getDescriptor(AIProviderName.VERTEX);
|
|
195
|
+
const { extraRequired, extraRequiredFallbacks } = descriptor?.envVars ?? {};
|
|
196
|
+
const hasValidAuth = (extraRequired ?? []).every((v) => !!process.env[v]) ||
|
|
197
|
+
(extraRequiredFallbacks ?? []).some((v) => !!process.env[v]);
|
|
198
|
+
logger.debug("Vertex auth final result", { hasValidAuth });
|
|
215
199
|
if (hasValidAuth) {
|
|
216
200
|
healthStatus.hasApiKey = true;
|
|
217
|
-
logger.debug("Vertex auth SUCCESS"
|
|
218
|
-
authMethod: fileBasedAuthValid ? "file-based" : "individual-env-vars",
|
|
219
|
-
});
|
|
201
|
+
logger.debug("Vertex auth SUCCESS");
|
|
220
202
|
}
|
|
221
203
|
else {
|
|
222
204
|
healthStatus.hasApiKey = false;
|
|
223
|
-
healthStatus.configurationIssues.push(
|
|
205
|
+
healthStatus.configurationIssues.push("Vertex AI authentication not found: set GOOGLE_APPLICATION_CREDENTIALS, GOOGLE_APPLICATION_CREDENTIALS_NEUROLINK, GOOGLE_SERVICE_ACCOUNT_KEY, or both GOOGLE_AUTH_CLIENT_EMAIL and GOOGLE_AUTH_PRIVATE_KEY");
|
|
224
206
|
logger.debug("Vertex auth FAILED", {
|
|
225
207
|
reason: "No valid auth method found",
|
|
226
208
|
});
|
|
@@ -359,104 +341,115 @@ export class ProviderHealthChecker {
|
|
|
359
341
|
}
|
|
360
342
|
}
|
|
361
343
|
}
|
|
344
|
+
/**
|
|
345
|
+
* Providers whose credential model can't be reduced to "every one of
|
|
346
|
+
* these exact env vars must be literally set" — the check in
|
|
347
|
+
* checkEnvironmentConfiguration() below ANDs every entry in the
|
|
348
|
+
* returned list together, which can't express Vertex's file-OR-
|
|
349
|
+
* individual-creds-OR-service-account auth, Bedrock's AWS SDK default
|
|
350
|
+
* provider chain (profile / IAM role, no env vars at all), or
|
|
351
|
+
* LiteLLM's documented zero-config local proxy. Their real requirement
|
|
352
|
+
* is validated by checkProviderSpecificConfig()'s dedicated per-provider
|
|
353
|
+
* checks instead — matches the original hand-written switch's
|
|
354
|
+
* deliberate `return []` for exactly these three. Naively deriving
|
|
355
|
+
* [apiKey, ...extraRequired] from the descriptor here (as for the other
|
|
356
|
+
* 27 providers) would make checkEnvironmentConfiguration() push a false
|
|
357
|
+
* "missing environment variables" issue — and therefore isHealthy=false
|
|
358
|
+
* — for legitimate fallback-based Vertex auth, AWS_PROFILE/IAM-role
|
|
359
|
+
* Bedrock auth, and unauthenticated local LiteLLM proxies. See
|
|
360
|
+
* hasProviderEnvVars() in providerUtils.ts for the equivalent OR-aware
|
|
361
|
+
* check used for auto-select gating.
|
|
362
|
+
*/
|
|
363
|
+
static ENV_CHECK_DELEGATED_TO_SPECIFIC_CONFIG = new Set([
|
|
364
|
+
AIProviderName.VERTEX,
|
|
365
|
+
AIProviderName.BEDROCK,
|
|
366
|
+
AIProviderName.LITELLM,
|
|
367
|
+
]);
|
|
362
368
|
/**
|
|
363
369
|
* Get required environment variables for a provider
|
|
364
370
|
*/
|
|
365
371
|
static getRequiredEnvironmentVariables(providerName) {
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
case AIProviderName.AZURE:
|
|
384
|
-
return ["AZURE_OPENAI_API_KEY", "AZURE_OPENAI_ENDPOINT"];
|
|
385
|
-
case AIProviderName.LITELLM:
|
|
386
|
-
return [];
|
|
387
|
-
case AIProviderName.OLLAMA:
|
|
388
|
-
return []; // Ollama typically doesn't require API keys
|
|
389
|
-
default:
|
|
390
|
-
return [];
|
|
391
|
-
}
|
|
372
|
+
// Resolve the descriptor FIRST so the delegation-Set check below is
|
|
373
|
+
// keyed on the canonical, alias-resolved `descriptor.name` — not the
|
|
374
|
+
// raw, possibly-aliased `providerName` argument. Checking the raw
|
|
375
|
+
// input here would let documented aliases (e.g. "googleVertex" for
|
|
376
|
+
// vertex, "aws" for bedrock) skip the delegation and fall through to
|
|
377
|
+
// the naive [apiKey, ...extraRequired] derivation below, reproducing
|
|
378
|
+
// the exact false "missing environment variables" regression this
|
|
379
|
+
// Set exists to prevent.
|
|
380
|
+
const descriptor = ProviderFactory.getDescriptor(providerName);
|
|
381
|
+
if (!descriptor) {
|
|
382
|
+
return [];
|
|
383
|
+
}
|
|
384
|
+
if (this.ENV_CHECK_DELEGATED_TO_SPECIFIC_CONFIG.has(descriptor.name)) {
|
|
385
|
+
return [];
|
|
386
|
+
}
|
|
387
|
+
const { apiKey, extraRequired } = descriptor.envVars;
|
|
388
|
+
return [...(apiKey ? [apiKey] : []), ...(extraRequired ?? [])];
|
|
392
389
|
}
|
|
393
390
|
/**
|
|
394
|
-
* Get API key environment variable for a provider
|
|
391
|
+
* Get API key environment variable for a provider.
|
|
392
|
+
*
|
|
393
|
+
* Dead code at its sole call site today (checkApiKeyValidity() early-
|
|
394
|
+
* returns for VERTEX/OLLAMA/BEDROCK/LITELLM before reaching this), but
|
|
395
|
+
* now `static` (public) so a future direct caller is plausible — hence
|
|
396
|
+
* the two intentional diffs from the original hand-written switch are
|
|
397
|
+
* documented here rather than left silent:
|
|
398
|
+
* - vertex: old switch returned "GOOGLE_APPLICATION_CREDENTIALS"
|
|
399
|
+
* (one of several valid auth vars); the descriptor's `envVars.apiKey`
|
|
400
|
+
* is "GOOGLE_CLOUD_PROJECT_ID" instead — the actual identity var for
|
|
401
|
+
* the provider, not one specific credential-supply mechanism.
|
|
402
|
+
* - ollama: old switch returned "OLLAMA_BASE_URL"; the descriptor has
|
|
403
|
+
* no `envVars.apiKey` for ollama (it's a local, unauthenticated
|
|
404
|
+
* runtime), so this now returns "".
|
|
405
|
+
* Both are kept deliberately (semantically truer identity vars) rather
|
|
406
|
+
* than reproduced byte-for-byte from the old switch.
|
|
395
407
|
*/
|
|
396
408
|
static getApiKeyEnvironmentVariable(providerName) {
|
|
397
|
-
|
|
398
|
-
case AIProviderName.ANTHROPIC:
|
|
399
|
-
return "ANTHROPIC_API_KEY";
|
|
400
|
-
case AIProviderName.OPENAI:
|
|
401
|
-
return "OPENAI_API_KEY";
|
|
402
|
-
case AIProviderName.VERTEX:
|
|
403
|
-
return "GOOGLE_APPLICATION_CREDENTIALS";
|
|
404
|
-
case AIProviderName.GOOGLE_AI:
|
|
405
|
-
return "GOOGLE_AI_API_KEY";
|
|
406
|
-
case AIProviderName.BEDROCK:
|
|
407
|
-
return "AWS_ACCESS_KEY_ID";
|
|
408
|
-
case AIProviderName.AZURE:
|
|
409
|
-
return "AZURE_OPENAI_API_KEY";
|
|
410
|
-
case AIProviderName.LITELLM:
|
|
411
|
-
return "LITELLM_API_KEY";
|
|
412
|
-
case AIProviderName.OLLAMA:
|
|
413
|
-
return "OLLAMA_BASE_URL";
|
|
414
|
-
default:
|
|
415
|
-
return "";
|
|
416
|
-
}
|
|
409
|
+
return ProviderFactory.getDescriptor(providerName)?.envVars.apiKey ?? "";
|
|
417
410
|
}
|
|
418
411
|
/**
|
|
419
412
|
* Validate API key format for a provider
|
|
420
413
|
*/
|
|
421
414
|
static validateApiKeyFormat(providerName, apiKey) {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
return
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
default:
|
|
442
|
-
return true; // Default to true for unknown providers
|
|
415
|
+
// Vertex's "API key" is really a credentials file path (or an inline
|
|
416
|
+
// JSON blob via GOOGLE_SERVICE_ACCOUNT_KEY) — never governed by the
|
|
417
|
+
// shared API_KEY_FORMATS regexes. Preserved exactly from the original
|
|
418
|
+
// switch even though checkApiKeyValidity() early-returns before ever
|
|
419
|
+
// reaching this call for Vertex today; kept correct for any other/
|
|
420
|
+
// future caller.
|
|
421
|
+
if (providerName === AIProviderName.VERTEX) {
|
|
422
|
+
return apiKey.endsWith(".json") || apiKey.includes("type");
|
|
423
|
+
}
|
|
424
|
+
const descriptor = ProviderFactory.getDescriptor(providerName);
|
|
425
|
+
if (!descriptor?.apiKeyFormatPattern) {
|
|
426
|
+
// Providers with no documented format (or local runtimes / providers
|
|
427
|
+
// usable with zero configuration) are accepted as-is — matches the
|
|
428
|
+
// old switch's per-provider `default: true`/no-format-check branches
|
|
429
|
+
// (ollama, litellm).
|
|
430
|
+
if (descriptor?.localRuntime || descriptor?.envVars.optional) {
|
|
431
|
+
return true;
|
|
432
|
+
}
|
|
433
|
+
return apiKey.length > 0;
|
|
443
434
|
}
|
|
435
|
+
return descriptor.apiKeyFormatPattern.test(apiKey);
|
|
444
436
|
}
|
|
445
437
|
/**
|
|
446
438
|
* Get health check endpoint for connectivity testing
|
|
447
439
|
*/
|
|
448
440
|
static getProviderHealthEndpoint(providerName) {
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
441
|
+
const descriptor = ProviderFactory.getDescriptor(providerName);
|
|
442
|
+
if (descriptor?.healthCheck !== "models-probe") {
|
|
443
|
+
return null;
|
|
444
|
+
}
|
|
445
|
+
// OpenAI/LiteLLM/Ollama each need a provider-specific URL builder that
|
|
446
|
+
// isn't pure descriptor data (LiteLLM/Ollama depend on the configured
|
|
447
|
+
// base URL) — keep the existing per-provider dispatch for the 3
|
|
448
|
+
// models-probe providers, now gated on the descriptor instead of a
|
|
449
|
+
// hardcoded name list.
|
|
450
|
+
switch (descriptor.name) {
|
|
452
451
|
case AIProviderName.OPENAI:
|
|
453
452
|
return "https://api.openai.com/v1/models";
|
|
454
|
-
case AIProviderName.GOOGLE_AI:
|
|
455
|
-
return null; // No public health endpoint
|
|
456
|
-
case AIProviderName.VERTEX:
|
|
457
|
-
return null; // Complex authentication required
|
|
458
|
-
case AIProviderName.BEDROCK:
|
|
459
|
-
return null; // AWS endpoints vary by region
|
|
460
453
|
case AIProviderName.LITELLM:
|
|
461
454
|
return this.getLiteLLMModelsUrl();
|
|
462
455
|
case AIProviderName.OLLAMA:
|
|
@@ -8,6 +8,8 @@ import { AIProviderName } from "../constants/enums.js";
|
|
|
8
8
|
import { ProviderHealthChecker } from "./providerHealth.js";
|
|
9
9
|
import { API_KEY_FORMATS, API_KEY_LENGTHS, PROJECT_ID_FORMAT, } from "./providerConfig.js";
|
|
10
10
|
import { DEFAULT_OLLAMA_MODEL } from "../providers/ollama/constants.js";
|
|
11
|
+
import { ProviderFactory } from "../factories/providerFactory.js";
|
|
12
|
+
import { PROVIDER_DESCRIPTORS } from "../factories/providerDescriptors.js";
|
|
11
13
|
/**
|
|
12
14
|
* Get the best available provider based on real-time availability checks
|
|
13
15
|
* Enhanced version consolidated from providerUtils-fixed.ts
|
|
@@ -20,19 +22,6 @@ export async function getBestProvider(requestedProvider) {
|
|
|
20
22
|
// For explicit provider requests, ALWAYS honor the request
|
|
21
23
|
// Never override explicit provider selection with health-based fallbacks
|
|
22
24
|
logger.debug(`[getBestProvider] Using explicitly requested provider: ${requestedProvider}`);
|
|
23
|
-
// Optional health check for logging purposes only
|
|
24
|
-
try {
|
|
25
|
-
const health = await ProviderHealthChecker.checkProviderHealth(requestedProvider, { includeConnectivityTest: false, cacheResults: true });
|
|
26
|
-
if (health.isHealthy) {
|
|
27
|
-
logger.debug(`[getBestProvider] Explicitly requested provider ${requestedProvider} is healthy`);
|
|
28
|
-
}
|
|
29
|
-
else {
|
|
30
|
-
logger.warn(`[getBestProvider] Explicitly requested provider ${requestedProvider} may have issues, but using anyway`, { error: health.error });
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
catch (error) {
|
|
34
|
-
logger.warn(`[getBestProvider] Health check failed for explicitly requested provider ${requestedProvider}, using anyway`, { error: error instanceof Error ? error.message : String(error) });
|
|
35
|
-
}
|
|
36
25
|
// ALWAYS return the explicitly requested provider
|
|
37
26
|
return requestedProvider;
|
|
38
27
|
}
|
|
@@ -73,18 +62,9 @@ export async function getBestProvider(requestedProvider) {
|
|
|
73
62
|
* - Other providers are ordered based on a combination of reliability, feature set, and historical performance.
|
|
74
63
|
* Please update this comment if the order is changed in the future, and document the rationale for maintainability.
|
|
75
64
|
*/
|
|
76
|
-
const providers =
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
"vertex", // Google Cloud AI (enterprise)
|
|
80
|
-
"google-ai", // Google AI ecosystem support
|
|
81
|
-
"openai", // Reliable with broad model support
|
|
82
|
-
"anthropic",
|
|
83
|
-
"bedrock",
|
|
84
|
-
"azure",
|
|
85
|
-
"mistral",
|
|
86
|
-
"huggingface",
|
|
87
|
-
];
|
|
65
|
+
const providers = PROVIDER_DESCRIPTORS.filter((d) => d.autoSelectPriority !== undefined)
|
|
66
|
+
.sort((a, b) => (a.autoSelectPriority ?? 0) - (b.autoSelectPriority ?? 0))
|
|
67
|
+
.map((d) => d.name);
|
|
88
68
|
for (const provider of providers) {
|
|
89
69
|
if (await isProviderAvailable(provider)) {
|
|
90
70
|
logger.debug(`[getBestProvider] Selected provider: ${provider}`);
|
|
@@ -345,75 +325,29 @@ function isValidUrl(url) {
|
|
|
345
325
|
* @returns True if the provider has required environment variables
|
|
346
326
|
*/
|
|
347
327
|
export function hasProviderEnvVars(provider) {
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
(process.env.GOOGLE_APPLICATION_CREDENTIALS ||
|
|
362
|
-
process.env.GOOGLE_SERVICE_ACCOUNT_KEY ||
|
|
363
|
-
(process.env.GOOGLE_AUTH_CLIENT_EMAIL &&
|
|
364
|
-
process.env.GOOGLE_AUTH_PRIVATE_KEY)));
|
|
365
|
-
case "openai":
|
|
366
|
-
case "gpt":
|
|
367
|
-
return !!process.env.OPENAI_API_KEY;
|
|
368
|
-
case "anthropic":
|
|
369
|
-
case "claude":
|
|
370
|
-
return !!process.env.ANTHROPIC_API_KEY;
|
|
371
|
-
case "azure":
|
|
372
|
-
case "azureopenai":
|
|
373
|
-
return !!process.env.AZURE_OPENAI_API_KEY;
|
|
374
|
-
case "google-ai":
|
|
375
|
-
case "google-studio":
|
|
376
|
-
return !!(process.env.GOOGLE_AI_API_KEY ||
|
|
377
|
-
process.env.GOOGLE_GENERATIVE_AI_API_KEY);
|
|
378
|
-
case "huggingface":
|
|
379
|
-
case "hugging-face":
|
|
380
|
-
case "hf":
|
|
381
|
-
return !!(process.env.HUGGINGFACE_API_KEY || process.env.HF_TOKEN);
|
|
382
|
-
case "ollama":
|
|
383
|
-
case "local":
|
|
384
|
-
case "local-ollama":
|
|
385
|
-
// For Ollama, we check if the service is potentially available
|
|
386
|
-
// This is a basic check - actual connectivity will be verified during usage
|
|
387
|
-
return true; // Ollama doesn't require environment variables, just local service
|
|
388
|
-
case "mistral":
|
|
389
|
-
case "mistral-ai":
|
|
390
|
-
case "mistralai":
|
|
391
|
-
return !!process.env.MISTRAL_API_KEY;
|
|
392
|
-
case "litellm":
|
|
393
|
-
// LiteLLM requires a proxy server, which can be checked for availability
|
|
394
|
-
// Default base URL is assumed, or can be configured via environment
|
|
395
|
-
return true; // LiteLLM proxy availability will be checked during usage
|
|
396
|
-
default:
|
|
397
|
-
return false;
|
|
328
|
+
const descriptor = ProviderFactory.getDescriptor(provider);
|
|
329
|
+
if (!descriptor) {
|
|
330
|
+
return false;
|
|
331
|
+
}
|
|
332
|
+
if (descriptor.envVars.optional || descriptor.localRuntime) {
|
|
333
|
+
// Ollama / LiteLLM / LM Studio / llama.cpp: usable with defaults.
|
|
334
|
+
return true;
|
|
335
|
+
}
|
|
336
|
+
const { apiKey, fallbacks, extraRequired, extraRequiredFallbacks } = descriptor.envVars;
|
|
337
|
+
const hasPrimary = !!apiKey &&
|
|
338
|
+
(!!process.env[apiKey] || (fallbacks ?? []).some((v) => !!process.env[v]));
|
|
339
|
+
if (!hasPrimary) {
|
|
340
|
+
return false;
|
|
398
341
|
}
|
|
342
|
+
return ((extraRequired ?? []).every((v) => !!process.env[v]) ||
|
|
343
|
+
(extraRequiredFallbacks ?? []).some((v) => !!process.env[v]));
|
|
399
344
|
}
|
|
400
345
|
/**
|
|
401
346
|
* Get available provider names
|
|
402
347
|
* @returns Array of available provider names
|
|
403
348
|
*/
|
|
404
349
|
export function getAvailableProviders() {
|
|
405
|
-
return
|
|
406
|
-
"bedrock",
|
|
407
|
-
"vertex",
|
|
408
|
-
"openai",
|
|
409
|
-
"anthropic",
|
|
410
|
-
"azure",
|
|
411
|
-
"google-ai",
|
|
412
|
-
"litellm",
|
|
413
|
-
"huggingface",
|
|
414
|
-
"ollama",
|
|
415
|
-
"mistral",
|
|
416
|
-
];
|
|
350
|
+
return PROVIDER_DESCRIPTORS.map((d) => d.name);
|
|
417
351
|
}
|
|
418
352
|
/**
|
|
419
353
|
* Validate provider name
|
|
@@ -242,13 +242,6 @@ export declare function getContextWindow(model: string): number;
|
|
|
242
242
|
* @returns The max output tokens, or 0 if model not found
|
|
243
243
|
*/
|
|
244
244
|
export declare function getMaxOutputTokens(model: string): number;
|
|
245
|
-
/**
|
|
246
|
-
* Check if a model supports vision/image input
|
|
247
|
-
*
|
|
248
|
-
* @param model - The model ID
|
|
249
|
-
* @returns true if the model supports vision
|
|
250
|
-
*/
|
|
251
|
-
export declare function supportsVision(model: string): boolean;
|
|
252
245
|
/**
|
|
253
246
|
* Check if a model supports extended thinking
|
|
254
247
|
*
|
|
@@ -531,15 +531,6 @@ export function getContextWindow(model) {
|
|
|
531
531
|
export function getMaxOutputTokens(model) {
|
|
532
532
|
return MODEL_METADATA[model]?.maxOutputTokens ?? 0;
|
|
533
533
|
}
|
|
534
|
-
/**
|
|
535
|
-
* Check if a model supports vision/image input
|
|
536
|
-
*
|
|
537
|
-
* @param model - The model ID
|
|
538
|
-
* @returns true if the model supports vision
|
|
539
|
-
*/
|
|
540
|
-
export function supportsVision(model) {
|
|
541
|
-
return MODEL_METADATA[model]?.supportsVision ?? false;
|
|
542
|
-
}
|
|
543
534
|
/**
|
|
544
535
|
* Check if a model supports extended thinking
|
|
545
536
|
*
|
package/dist/neurolink.js
CHANGED
|
@@ -35,6 +35,7 @@ import { ToolRoutingCache } from "./core/toolRoutingCache.js";
|
|
|
35
35
|
import { DEFAULT_RECENT_TURNS, KnowledgeGroundingEngine, } from "./knowledge/index.js";
|
|
36
36
|
import { AIProviderFactory } from "./core/factory.js";
|
|
37
37
|
import { createToolEventPayload } from "./core/toolEvents.js";
|
|
38
|
+
import { ProviderFactory } from "./factories/providerFactory.js";
|
|
38
39
|
import { ProviderRegistry } from "./factories/providerRegistry.js";
|
|
39
40
|
import { FileReferenceRegistry } from "./files/fileReferenceRegistry.js";
|
|
40
41
|
import { createFileTools } from "./files/fileTools.js";
|
|
@@ -298,30 +299,24 @@ export function markStreamProviderEmittedGenerationEnd(options) {
|
|
|
298
299
|
*/
|
|
299
300
|
export const NEUROLINK_BRAND = Symbol.for("@juspay/neurolink/sdk-brand");
|
|
300
301
|
/**
|
|
301
|
-
*
|
|
302
|
-
*
|
|
303
|
-
*
|
|
304
|
-
*
|
|
305
|
-
*
|
|
306
|
-
*
|
|
307
|
-
*
|
|
308
|
-
*
|
|
309
|
-
*
|
|
310
|
-
*
|
|
311
|
-
*
|
|
312
|
-
*
|
|
302
|
+
* True when a provider needs tools described in the prompt rather than
|
|
303
|
+
* passed via the API's native tool-calling parameter (ollama/openrouter
|
|
304
|
+
* are model-dependent; huggingface is deployment-dependent; the
|
|
305
|
+
* image/embedding providers don't support tool calling at all). Only these
|
|
306
|
+
* still receive the full tool listing in the system prompt on the generate
|
|
307
|
+
* path, where no provider instance exists yet to ask directly; every other
|
|
308
|
+
* provider gets tool definitions natively via its `tools` parameter, so
|
|
309
|
+
* repeating them in the prompt was pure token duplication. The stream path
|
|
310
|
+
* asks the provider instance (`provider.supportsTools()`) instead of this
|
|
311
|
+
* check. Derived from ProviderDescriptor.toolSupport instead of a
|
|
312
|
+
* hand-maintained Set — see PROVIDER_DESCRIPTORS in
|
|
313
|
+
* src/lib/factories/providerDescriptors.ts for the underlying data;
|
|
314
|
+
* BaseProvider resolves its own runtime default through MODEL_REGISTRY's
|
|
315
|
+
* `modelSupports()` facade.
|
|
313
316
|
*/
|
|
314
|
-
|
|
315
|
-
"
|
|
316
|
-
|
|
317
|
-
"openrouter",
|
|
318
|
-
"ideogram",
|
|
319
|
-
"recraft",
|
|
320
|
-
"replicate",
|
|
321
|
-
"stability",
|
|
322
|
-
"jina",
|
|
323
|
-
"voyage",
|
|
324
|
-
]);
|
|
317
|
+
function isPromptOnlyToolProvider(providerName) {
|
|
318
|
+
return ProviderFactory.getDescriptor(providerName)?.toolSupport !== "native";
|
|
319
|
+
}
|
|
325
320
|
/**
|
|
326
321
|
* Type-guard for opaque values that should be a {@link NeuroLink} instance.
|
|
327
322
|
*
|
|
@@ -5452,7 +5447,7 @@ Current user's request: ${currentInput}`;
|
|
|
5452
5447
|
}
|
|
5453
5448
|
// Providers with native tool calling receive full definitions via their
|
|
5454
5449
|
// `tools` parameter; only prompt-based providers still get the listing.
|
|
5455
|
-
const nativeToolSupport = !
|
|
5450
|
+
const nativeToolSupport = !isPromptOnlyToolProvider(String(providerName).toLowerCase());
|
|
5456
5451
|
const enhancedSystemPrompt = options.skipToolPromptInjection
|
|
5457
5452
|
? (options.systemPrompt || "") + circuitBreakerNote
|
|
5458
5453
|
: this.createToolAwareSystemPrompt(options.systemPrompt, availableTools, nativeToolSupport) + circuitBreakerNote;
|
|
@@ -10351,19 +10346,12 @@ Current user's request: ${currentInput}`;
|
|
|
10351
10346
|
// Keep references to prevent unused variable warnings
|
|
10352
10347
|
void AIProviderFactory;
|
|
10353
10348
|
void hasProviderEnvVars;
|
|
10354
|
-
|
|
10355
|
-
|
|
10356
|
-
|
|
10357
|
-
|
|
10358
|
-
|
|
10359
|
-
|
|
10360
|
-
"azure",
|
|
10361
|
-
"google-ai",
|
|
10362
|
-
"huggingface",
|
|
10363
|
-
"ollama",
|
|
10364
|
-
"mistral",
|
|
10365
|
-
"litellm",
|
|
10366
|
-
];
|
|
10349
|
+
// Derived from the descriptor registry instead of a hand-maintained
|
|
10350
|
+
// list — covers all real providers (was previously hardcoded to 11,
|
|
10351
|
+
// including "googleVertex" as a duplicate entry alongside "vertex";
|
|
10352
|
+
// that alias remains resolvable via PROVIDER_ALIAS_INDEX/CLI choices,
|
|
10353
|
+
// it just no longer gets its own separate status-check entry).
|
|
10354
|
+
const providers = ProviderFactory.getAllDescriptors().map((d) => d.name);
|
|
10367
10355
|
// Test providers with controlled concurrency
|
|
10368
10356
|
// This reduces total time from 16s (sequential) to ~3s (parallel) while preventing resource exhaustion
|
|
10369
10357
|
const limit = pLimit(SYSTEM_LIMITS.DEFAULT_CONCURRENCY_LIMIT);
|
|
@@ -4,6 +4,7 @@ import { createAnalytics } from "../../core/analytics.js";
|
|
|
4
4
|
import { BaseProvider } from "../../core/baseProvider.js";
|
|
5
5
|
import { DEFAULT_MAX_STEPS } from "../../core/constants.js";
|
|
6
6
|
import { AuthenticationError, ProviderError, RateLimitError, } from "../../types/index.js";
|
|
7
|
+
import { classifyProviderError } from "../../utils/errorClassifier.js";
|
|
7
8
|
import { isAbortError, withTimeout } from "../../utils/errorHandling.js";
|
|
8
9
|
import { emitToolEndFromStepFinish } from "../../utils/toolEndEmitter.js";
|
|
9
10
|
import { logger } from "../../utils/logger.js";
|
|
@@ -1724,22 +1725,39 @@ export class AmazonBedrockProvider extends BaseProvider {
|
|
|
1724
1725
|
}
|
|
1725
1726
|
}
|
|
1726
1727
|
formatProviderError(error) {
|
|
1727
|
-
|
|
1728
|
-
|
|
1729
|
-
|
|
1730
|
-
|
|
1731
|
-
|
|
1732
|
-
|
|
1733
|
-
|
|
1734
|
-
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
|
|
1738
|
-
|
|
1739
|
-
|
|
1740
|
-
|
|
1741
|
-
|
|
1742
|
-
|
|
1728
|
+
const rules = [
|
|
1729
|
+
{
|
|
1730
|
+
match: (ctx) => /AccessDeniedException/i.test(ctx.message),
|
|
1731
|
+
errorClass: AuthenticationError,
|
|
1732
|
+
message: "AWS Bedrock access denied. Check your credentials and permissions.",
|
|
1733
|
+
},
|
|
1734
|
+
{
|
|
1735
|
+
// Checked before the generic ValidationException fallback — a
|
|
1736
|
+
// throttling error can be shaped like a validation error in some
|
|
1737
|
+
// AWS SDK error message templates, but .name/.code are authoritative.
|
|
1738
|
+
match: (ctx) => ctx.errorName === "ThrottlingException" ||
|
|
1739
|
+
ctx.errorCode === "ThrottlingException",
|
|
1740
|
+
errorClass: RateLimitError,
|
|
1741
|
+
message: (ctx) => `Bedrock rate limit (throttled): ${ctx.message}`,
|
|
1742
|
+
},
|
|
1743
|
+
{
|
|
1744
|
+
match: (ctx) => /ValidationException/i.test(ctx.message),
|
|
1745
|
+
errorClass: ProviderError,
|
|
1746
|
+
message: (ctx) => `Validation error: ${ctx.message}`,
|
|
1747
|
+
},
|
|
1748
|
+
{
|
|
1749
|
+
match: () => true,
|
|
1750
|
+
errorClass: ProviderError,
|
|
1751
|
+
message: (ctx) => `AWS Bedrock error: ${ctx.message}`,
|
|
1752
|
+
},
|
|
1753
|
+
];
|
|
1754
|
+
// this.providerName resolves to the literal "bedrock" (getProviderName()
|
|
1755
|
+
// returns it directly, and the constructor only overrides providerName
|
|
1756
|
+
// when an explicit providerName is passed in) — verified matches the
|
|
1757
|
+
// pre-migration hardcoded "bedrock" literal in the throttling branch, so
|
|
1758
|
+
// a single classifyProviderError call using this.providerName for every
|
|
1759
|
+
// rule (rather than a per-rule literal) is not a behavior change.
|
|
1760
|
+
return classifyProviderError(error, rules, this.providerName, this.modelName);
|
|
1743
1761
|
}
|
|
1744
1762
|
/**
|
|
1745
1763
|
* Generate embeddings for text using Amazon Bedrock embedding models
|
|
@@ -69,7 +69,7 @@ export declare class AmazonSageMakerProvider extends BaseProvider {
|
|
|
69
69
|
provider: string;
|
|
70
70
|
specificationVersion: "v2";
|
|
71
71
|
endpointName: string;
|
|
72
|
-
modelType: "huggingface" | "mistral" | "custom" | "
|
|
72
|
+
modelType: "huggingface" | "mistral" | "custom" | "claude" | "llama" | "jumpstart" | undefined;
|
|
73
73
|
region: string;
|
|
74
74
|
} | {
|
|
75
75
|
capabilities: {
|