@juspay/neurolink 11.0.0 → 11.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/dist/browser/neurolink.min.js +510 -510
- package/dist/cli/commands/setup.d.ts +8 -1
- package/dist/cli/commands/setup.js +62 -46
- package/dist/cli/factories/commandFactory.d.ts +1157 -1
- package/dist/cli/factories/commandFactory.js +20 -53
- package/dist/constants/networkErrorCodes.d.ts +14 -0
- package/dist/constants/networkErrorCodes.js +21 -0
- package/dist/factories/providerDescriptors.d.ts +18 -0
- package/dist/factories/providerDescriptors.js +546 -0
- package/dist/factories/providerFactory.d.ts +25 -14
- package/dist/factories/providerFactory.js +46 -23
- package/dist/factories/providerRegistry.js +31 -30
- package/dist/index.d.ts +10 -1
- package/dist/index.js +13 -3
- package/dist/lib/constants/networkErrorCodes.d.ts +14 -0
- package/dist/lib/constants/networkErrorCodes.js +22 -0
- package/dist/lib/factories/providerDescriptors.d.ts +18 -0
- package/dist/lib/factories/providerDescriptors.js +547 -0
- package/dist/lib/factories/providerFactory.d.ts +25 -14
- package/dist/lib/factories/providerFactory.js +46 -23
- package/dist/lib/factories/providerRegistry.js +31 -30
- package/dist/lib/index.d.ts +10 -1
- package/dist/lib/index.js +13 -3
- package/dist/lib/neurolink.js +25 -37
- package/dist/lib/processors/base/BaseFileProcessor.d.ts +17 -0
- package/dist/lib/processors/base/BaseFileProcessor.js +40 -0
- package/dist/lib/processors/document/OpenDocumentProcessor.js +12 -2
- package/dist/lib/providers/amazonBedrock/client.js +34 -16
- package/dist/lib/providers/anthropic/client.js +39 -34
- 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/googleVertex/client.js +107 -99
- package/dist/lib/providers/groq.js +19 -22
- package/dist/lib/providers/huggingFace/client.js +26 -24
- package/dist/lib/providers/litellm/client.js +54 -39
- package/dist/lib/providers/llamaCpp.js +21 -18
- package/dist/lib/providers/lmStudio.js +22 -19
- package/dist/lib/providers/mistral.js +12 -24
- package/dist/lib/providers/nvidiaNim/client.js +37 -34
- package/dist/lib/providers/ollama/client.js +50 -35
- package/dist/lib/providers/openAI/client.js +37 -40
- package/dist/lib/providers/openRouter/client.js +53 -47
- package/dist/lib/providers/openaiChatCompletionsBase.js +40 -16
- package/dist/lib/providers/openaiCompatible/client.js +36 -32
- package/dist/lib/providers/perplexity.js +12 -21
- package/dist/lib/providers/togetherAi.js +12 -21
- package/dist/lib/providers/xai.js +17 -26
- package/dist/lib/proxy/proxyFetch.js +1 -9
- 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/cli.d.ts +2 -0
- package/dist/lib/types/errors.d.ts +35 -0
- package/dist/lib/types/providers.d.ts +79 -0
- package/dist/lib/utils/errorClassifier.d.ts +30 -0
- package/dist/lib/utils/errorClassifier.js +183 -0
- package/dist/lib/utils/fileDetector.js +6 -43
- package/dist/lib/utils/providerConfig.d.ts +16 -0
- package/dist/lib/utils/providerConfig.js +23 -0
- package/dist/lib/utils/providerHealth.d.ts +53 -12
- package/dist/lib/utils/providerHealth.js +125 -131
- package/dist/lib/utils/providerUtils.js +22 -64
- package/dist/neurolink.js +25 -37
- package/dist/processors/base/BaseFileProcessor.d.ts +17 -0
- package/dist/processors/base/BaseFileProcessor.js +40 -0
- package/dist/processors/document/OpenDocumentProcessor.js +12 -2
- 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/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/googleVertex/client.js +107 -99
- package/dist/providers/groq.js +19 -22
- package/dist/providers/huggingFace/client.js +26 -24
- package/dist/providers/litellm/client.js +54 -39
- package/dist/providers/llamaCpp.js +21 -18
- package/dist/providers/lmStudio.js +22 -19
- package/dist/providers/mistral.js +12 -24
- package/dist/providers/nvidiaNim/client.js +37 -34
- package/dist/providers/ollama/client.js +50 -35
- package/dist/providers/openAI/client.js +37 -40
- package/dist/providers/openRouter/client.js +53 -47
- package/dist/providers/openaiChatCompletionsBase.js +40 -16
- package/dist/providers/openaiCompatible/client.js +36 -32
- package/dist/providers/perplexity.js +12 -21
- package/dist/providers/sagemaker/language-model.d.ts +2 -2
- package/dist/providers/togetherAi.js +12 -21
- package/dist/providers/xai.js +17 -26
- package/dist/proxy/proxyFetch.js +1 -9
- 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/cli.d.ts +2 -0
- package/dist/types/errors.d.ts +35 -0
- package/dist/types/providers.d.ts +79 -0
- package/dist/utils/errorClassifier.d.ts +30 -0
- package/dist/utils/errorClassifier.js +182 -0
- package/dist/utils/fileDetector.js +6 -43
- package/dist/utils/providerConfig.d.ts +16 -0
- package/dist/utils/providerConfig.js +23 -0
- package/dist/utils/providerHealth.d.ts +53 -12
- package/dist/utils/providerHealth.js +125 -131
- package/dist/utils/providerUtils.js +22 -64
- package/package.json +15 -70
|
@@ -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, satisfiesFallbacks } 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
|
+
satisfiesFallbacks(extraRequiredFallbacks, process.env);
|
|
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
|
});
|
|
@@ -360,103 +342,108 @@ export class ProviderHealthChecker {
|
|
|
360
342
|
}
|
|
361
343
|
}
|
|
362
344
|
/**
|
|
363
|
-
* Get required environment variables for a provider
|
|
345
|
+
* Get required environment variables for a provider.
|
|
346
|
+
*
|
|
347
|
+
* Returns `[]` for providers with `descriptor.credentialsResolvedExternally
|
|
348
|
+
* === true` (Vertex, Bedrock, LiteLLM) — the check in
|
|
349
|
+
* checkEnvironmentConfiguration() below ANDs every entry in the returned
|
|
350
|
+
* list together, which can't express Vertex's file-OR-individual-creds-
|
|
351
|
+
* OR-service-account auth, Bedrock's AWS SDK default provider chain
|
|
352
|
+
* (profile / IAM role, no env vars at all), or LiteLLM's documented
|
|
353
|
+
* zero-config local proxy. Their real requirement is validated by
|
|
354
|
+
* checkProviderSpecificConfig()'s dedicated per-provider checks instead.
|
|
355
|
+
* Naively deriving [apiKey, ...extraRequired] from the descriptor for
|
|
356
|
+
* these three (as for the other 27 providers) would make
|
|
357
|
+
* checkEnvironmentConfiguration() push a false "missing environment
|
|
358
|
+
* variables" issue — and therefore isHealthy=false — for legitimate
|
|
359
|
+
* fallback-based Vertex auth, AWS_PROFILE/IAM-role Bedrock auth, and
|
|
360
|
+
* unauthenticated local LiteLLM proxies. See hasProviderEnvVars() in
|
|
361
|
+
* providerUtils.ts for the equivalent OR-aware check used for
|
|
362
|
+
* auto-select gating. See `ProviderDescriptor.credentialsResolvedExternally`
|
|
363
|
+
* (types/providers.ts) for the field's full documentation.
|
|
364
364
|
*/
|
|
365
365
|
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
|
-
}
|
|
366
|
+
// Resolve the descriptor FIRST so the field check below is keyed on
|
|
367
|
+
// the canonical, alias-resolved `descriptor.credentialsResolvedExternally`
|
|
368
|
+
// — not the raw, possibly-aliased `providerName` argument. Checking the
|
|
369
|
+
// raw input here would let documented aliases (e.g. "googleVertex" for
|
|
370
|
+
// vertex, "aws" for bedrock) skip the delegation and fall through to
|
|
371
|
+
// the naive [apiKey, ...extraRequired] derivation below, reproducing
|
|
372
|
+
// the exact false "missing environment variables" regression this
|
|
373
|
+
// field exists to prevent.
|
|
374
|
+
const descriptor = ProviderFactory.getDescriptor(providerName);
|
|
375
|
+
if (!descriptor) {
|
|
376
|
+
return [];
|
|
377
|
+
}
|
|
378
|
+
if (descriptor.credentialsResolvedExternally) {
|
|
379
|
+
return [];
|
|
380
|
+
}
|
|
381
|
+
const { apiKey, extraRequired } = descriptor.envVars;
|
|
382
|
+
return [...(apiKey ? [apiKey] : []), ...(extraRequired ?? [])];
|
|
392
383
|
}
|
|
393
384
|
/**
|
|
394
|
-
* Get API key environment variable for a provider
|
|
385
|
+
* Get API key environment variable for a provider.
|
|
386
|
+
*
|
|
387
|
+
* Dead code at its sole call site today (checkApiKeyValidity() early-
|
|
388
|
+
* returns for VERTEX/OLLAMA/BEDROCK/LITELLM before reaching this), but
|
|
389
|
+
* now `static` (public) so a future direct caller is plausible — hence
|
|
390
|
+
* the two intentional diffs from the original hand-written switch are
|
|
391
|
+
* documented here rather than left silent:
|
|
392
|
+
* - vertex: old switch returned "GOOGLE_APPLICATION_CREDENTIALS"
|
|
393
|
+
* (one of several valid auth vars); the descriptor's `envVars.apiKey`
|
|
394
|
+
* is "GOOGLE_CLOUD_PROJECT_ID" instead — the actual identity var for
|
|
395
|
+
* the provider, not one specific credential-supply mechanism.
|
|
396
|
+
* - ollama: old switch returned "OLLAMA_BASE_URL"; the descriptor has
|
|
397
|
+
* no `envVars.apiKey` for ollama (it's a local, unauthenticated
|
|
398
|
+
* runtime), so this now returns "".
|
|
399
|
+
* Both are kept deliberately (semantically truer identity vars) rather
|
|
400
|
+
* than reproduced byte-for-byte from the old switch.
|
|
395
401
|
*/
|
|
396
402
|
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
|
-
}
|
|
403
|
+
return ProviderFactory.getDescriptor(providerName)?.envVars.apiKey ?? "";
|
|
417
404
|
}
|
|
418
405
|
/**
|
|
419
406
|
* Validate API key format for a provider
|
|
420
407
|
*/
|
|
421
408
|
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
|
|
409
|
+
// Vertex's "API key" is really a credentials file path (or an inline
|
|
410
|
+
// JSON blob via GOOGLE_SERVICE_ACCOUNT_KEY) — never governed by the
|
|
411
|
+
// shared API_KEY_FORMATS regexes. Preserved exactly from the original
|
|
412
|
+
// switch even though checkApiKeyValidity() early-returns before ever
|
|
413
|
+
// reaching this call for Vertex today; kept correct for any other/
|
|
414
|
+
// future caller.
|
|
415
|
+
if (providerName === AIProviderName.VERTEX) {
|
|
416
|
+
return apiKey.endsWith(".json") || apiKey.includes("type");
|
|
417
|
+
}
|
|
418
|
+
const descriptor = ProviderFactory.getDescriptor(providerName);
|
|
419
|
+
if (!descriptor?.apiKeyFormatPattern) {
|
|
420
|
+
// Providers with no documented format (or local runtimes / providers
|
|
421
|
+
// usable with zero configuration) are accepted as-is — matches the
|
|
422
|
+
// old switch's per-provider `default: true`/no-format-check branches
|
|
423
|
+
// (ollama, litellm).
|
|
424
|
+
if (descriptor?.localRuntime || descriptor?.envVars.optional) {
|
|
425
|
+
return true;
|
|
426
|
+
}
|
|
427
|
+
return apiKey.length > 0;
|
|
443
428
|
}
|
|
429
|
+
return descriptor.apiKeyFormatPattern.test(apiKey);
|
|
444
430
|
}
|
|
445
431
|
/**
|
|
446
432
|
* Get health check endpoint for connectivity testing
|
|
447
433
|
*/
|
|
448
434
|
static getProviderHealthEndpoint(providerName) {
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
435
|
+
const descriptor = ProviderFactory.getDescriptor(providerName);
|
|
436
|
+
if (descriptor?.healthCheck !== "models-probe") {
|
|
437
|
+
return null;
|
|
438
|
+
}
|
|
439
|
+
// OpenAI/LiteLLM/Ollama each need a provider-specific URL builder that
|
|
440
|
+
// isn't pure descriptor data (LiteLLM/Ollama depend on the configured
|
|
441
|
+
// base URL) — keep the existing per-provider dispatch for the 3
|
|
442
|
+
// models-probe providers, now gated on the descriptor instead of a
|
|
443
|
+
// hardcoded name list.
|
|
444
|
+
switch (descriptor.name) {
|
|
452
445
|
case AIProviderName.OPENAI:
|
|
453
446
|
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
447
|
case AIProviderName.LITELLM:
|
|
461
448
|
return this.getLiteLLMModelsUrl();
|
|
462
449
|
case AIProviderName.OLLAMA:
|
|
@@ -525,11 +512,11 @@ export class ProviderHealthChecker {
|
|
|
525
512
|
hasValidAuth = await this.checkGoogleApplicationCredentials(healthStatus);
|
|
526
513
|
}
|
|
527
514
|
if (!hasValidAuth) {
|
|
528
|
-
hasValidAuth = this.
|
|
515
|
+
hasValidAuth = this.checkExtraRequiredFallbackCredentials(healthStatus);
|
|
529
516
|
}
|
|
530
517
|
if (!hasValidAuth) {
|
|
531
518
|
healthStatus.configurationIssues.push("Google Cloud authentication not configured or credentials file missing");
|
|
532
|
-
healthStatus.recommendations.push("Set either GOOGLE_APPLICATION_CREDENTIALS (valid file path), GOOGLE_SERVICE_ACCOUNT_KEY (base64), or both GOOGLE_AUTH_CLIENT_EMAIL and GOOGLE_AUTH_PRIVATE_KEY");
|
|
519
|
+
healthStatus.recommendations.push("Set either GOOGLE_APPLICATION_CREDENTIALS (valid file path), GOOGLE_APPLICATION_CREDENTIALS_NEUROLINK, GOOGLE_SERVICE_ACCOUNT_KEY (base64), or both GOOGLE_AUTH_CLIENT_EMAIL and GOOGLE_AUTH_PRIVATE_KEY");
|
|
533
520
|
}
|
|
534
521
|
return hasValidAuth;
|
|
535
522
|
}
|
|
@@ -561,13 +548,20 @@ export class ProviderHealthChecker {
|
|
|
561
548
|
}
|
|
562
549
|
}
|
|
563
550
|
/**
|
|
564
|
-
* Check
|
|
551
|
+
* Check Vertex's non-file auth fallbacks (GOOGLE_APPLICATION_CREDENTIALS_
|
|
552
|
+
* NEUROLINK, GOOGLE_SERVICE_ACCOUNT_KEY, or the GOOGLE_AUTH_CLIENT_EMAIL +
|
|
553
|
+
* GOOGLE_AUTH_PRIVATE_KEY pair) via the descriptor's extraRequiredFallbacks
|
|
554
|
+
* instead of a hand-maintained env-var list, so this stays in sync with
|
|
555
|
+
* the real gating logic (hasGoogleCredentials()) the same way
|
|
556
|
+
* checkApiKeyValidity()'s vertex branch does. The previous hand-rolled
|
|
557
|
+
* version only recognized GOOGLE_SERVICE_ACCOUNT_KEY or the email+key
|
|
558
|
+
* pair — missing GOOGLE_APPLICATION_CREDENTIALS_NEUROLINK, the
|
|
559
|
+
* descriptor's documented first-priority fallback.
|
|
565
560
|
*/
|
|
566
|
-
static
|
|
567
|
-
const
|
|
568
|
-
const
|
|
569
|
-
|
|
570
|
-
if (hasServiceAccountKey || hasIndividualCredentials) {
|
|
561
|
+
static checkExtraRequiredFallbackCredentials(healthStatus) {
|
|
562
|
+
const descriptor = ProviderFactory.getDescriptor(AIProviderName.VERTEX);
|
|
563
|
+
const hasValidAuth = satisfiesFallbacks(descriptor?.envVars.extraRequiredFallbacks, process.env);
|
|
564
|
+
if (hasValidAuth) {
|
|
571
565
|
healthStatus.hasApiKey = true;
|
|
572
566
|
return true;
|
|
573
567
|
}
|
|
@@ -6,8 +6,10 @@ import { AIProviderFactory } from "../core/factory.js";
|
|
|
6
6
|
import { logger } from "./logger.js";
|
|
7
7
|
import { AIProviderName } from "../constants/enums.js";
|
|
8
8
|
import { ProviderHealthChecker } from "./providerHealth.js";
|
|
9
|
-
import { API_KEY_FORMATS, API_KEY_LENGTHS, PROJECT_ID_FORMAT, } from "./providerConfig.js";
|
|
9
|
+
import { API_KEY_FORMATS, API_KEY_LENGTHS, PROJECT_ID_FORMAT, satisfiesFallbacks, } 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
|
|
@@ -60,18 +62,9 @@ export async function getBestProvider(requestedProvider) {
|
|
|
60
62
|
* - Other providers are ordered based on a combination of reliability, feature set, and historical performance.
|
|
61
63
|
* Please update this comment if the order is changed in the future, and document the rationale for maintainability.
|
|
62
64
|
*/
|
|
63
|
-
const providers =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"vertex", // Google Cloud AI (enterprise)
|
|
67
|
-
"google-ai", // Google AI ecosystem support
|
|
68
|
-
"openai", // Reliable with broad model support
|
|
69
|
-
"anthropic",
|
|
70
|
-
"bedrock",
|
|
71
|
-
"azure",
|
|
72
|
-
"mistral",
|
|
73
|
-
"huggingface",
|
|
74
|
-
];
|
|
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);
|
|
75
68
|
for (const provider of providers) {
|
|
76
69
|
if (await isProviderAvailable(provider)) {
|
|
77
70
|
logger.debug(`[getBestProvider] Selected provider: ${provider}`);
|
|
@@ -332,64 +325,29 @@ function isValidUrl(url) {
|
|
|
332
325
|
* @returns True if the provider has required environment variables
|
|
333
326
|
*/
|
|
334
327
|
export function hasProviderEnvVars(provider) {
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
(process.env.GOOGLE_APPLICATION_CREDENTIALS ||
|
|
349
|
-
process.env.GOOGLE_SERVICE_ACCOUNT_KEY ||
|
|
350
|
-
(process.env.GOOGLE_AUTH_CLIENT_EMAIL &&
|
|
351
|
-
process.env.GOOGLE_AUTH_PRIVATE_KEY)));
|
|
352
|
-
case "openai":
|
|
353
|
-
case "gpt":
|
|
354
|
-
return !!process.env.OPENAI_API_KEY;
|
|
355
|
-
case "anthropic":
|
|
356
|
-
case "claude":
|
|
357
|
-
return !!process.env.ANTHROPIC_API_KEY;
|
|
358
|
-
case "azure":
|
|
359
|
-
case "azureopenai":
|
|
360
|
-
return !!process.env.AZURE_OPENAI_API_KEY;
|
|
361
|
-
case "google-ai":
|
|
362
|
-
case "google-studio":
|
|
363
|
-
return !!(process.env.GOOGLE_AI_API_KEY ||
|
|
364
|
-
process.env.GOOGLE_GENERATIVE_AI_API_KEY);
|
|
365
|
-
case "huggingface":
|
|
366
|
-
case "hugging-face":
|
|
367
|
-
case "hf":
|
|
368
|
-
return !!(process.env.HUGGINGFACE_API_KEY || process.env.HF_TOKEN);
|
|
369
|
-
case "ollama":
|
|
370
|
-
case "local":
|
|
371
|
-
case "local-ollama":
|
|
372
|
-
// For Ollama, we check if the service is potentially available
|
|
373
|
-
// This is a basic check - actual connectivity will be verified during usage
|
|
374
|
-
return true; // Ollama doesn't require environment variables, just local service
|
|
375
|
-
case "mistral":
|
|
376
|
-
case "mistral-ai":
|
|
377
|
-
case "mistralai":
|
|
378
|
-
return !!process.env.MISTRAL_API_KEY;
|
|
379
|
-
case "litellm":
|
|
380
|
-
// LiteLLM requires a proxy server, which can be checked for availability
|
|
381
|
-
// Default base URL is assumed, or can be configured via environment
|
|
382
|
-
return true; // LiteLLM proxy availability will be checked during usage
|
|
383
|
-
default:
|
|
384
|
-
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;
|
|
385
341
|
}
|
|
342
|
+
return ((extraRequired ?? []).every((v) => !!process.env[v]) ||
|
|
343
|
+
satisfiesFallbacks(extraRequiredFallbacks, process.env));
|
|
386
344
|
}
|
|
387
345
|
/**
|
|
388
346
|
* Get available provider names
|
|
389
347
|
* @returns Array of available provider names
|
|
390
348
|
*/
|
|
391
349
|
export function getAvailableProviders() {
|
|
392
|
-
return
|
|
350
|
+
return PROVIDER_DESCRIPTORS.map((d) => d.name);
|
|
393
351
|
}
|
|
394
352
|
/**
|
|
395
353
|
* Validate provider name
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@juspay/neurolink",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.1.1",
|
|
4
4
|
"packageManager": "pnpm@10.15.1",
|
|
5
5
|
"description": "TypeScript AI SDK with 24+ LLM providers behind one consistent API. MCP-native (connect any MCP server), voice TTS/STT/realtime, RAG, agents, memory, context compaction. OpenAI · Anthropic · Gemini · Bedrock · Azure · Ollama · DeepSeek · NVIDIA NIM and more.",
|
|
6
6
|
"author": {
|
|
@@ -71,26 +71,19 @@
|
|
|
71
71
|
"test": "npx tsx test/continuous-test-suite.ts",
|
|
72
72
|
"test:client": "npx tsx test/continuous-test-suite-client.ts",
|
|
73
73
|
"test:context": "npx tsx test/continuous-test-suite-context.ts",
|
|
74
|
-
"test:cache": "npx tsx test/continuous-test-suite-cache-breakpoints.ts",
|
|
75
74
|
"test:evaluation": "npx tsx test/continuous-test-suite-evaluation.ts",
|
|
76
75
|
"test:mcp": "npx tsx test/continuous-test-suite-mcp-infra.ts",
|
|
77
76
|
"test:tool-resolution": "npx tsx test/continuous-test-suite-tool-resolution.ts",
|
|
78
77
|
"test:mcp:http": "npx tsx test/continuous-test-suite-mcp-http.ts",
|
|
79
78
|
"test:mcp:sdk": "npx tsx test/continuous-test-suite-mcp-sdk.ts",
|
|
80
79
|
"test:mcp:cli": "npx tsx test/continuous-test-suite-mcp-cli.ts",
|
|
81
|
-
"test:mcp:full": "pnpm run test:mcp:infra && pnpm run test:mcp:
|
|
80
|
+
"test:mcp:full": "pnpm run test:mcp:infra && pnpm run test:mcp:spans && pnpm run test:mcp:sdk && pnpm run test:mcp:cli && pnpm run test:mcp:http",
|
|
82
81
|
"test:media": "npx tsx test/continuous-test-suite-media-gen.ts",
|
|
83
|
-
"test:litellm-parity": "npx tsx test/continuous-test-suite-litellm-parity.ts",
|
|
84
82
|
"test:memory": "npx tsx test/continuous-test-suite-memory.ts",
|
|
85
|
-
"test:
|
|
86
|
-
"test:
|
|
87
|
-
"test:
|
|
88
|
-
"test:
|
|
89
|
-
"test:openai-compat-guard": "npx tsx test/continuous-test-suite-openai-compat-guard.ts",
|
|
90
|
-
"test:anthropic-guard": "npx tsx test/continuous-test-suite-anthropic-guard.ts",
|
|
91
|
-
"test:tool-storage-parity": "npx tsx test/continuous-test-suite-tool-storage-parity.ts",
|
|
92
|
-
"test:redis-append-only": "npx tsx test/continuous-test-suite-redis-append-only.ts",
|
|
93
|
-
"test:gemini-guard": "npx tsx test/continuous-test-suite-gemini-guard.ts",
|
|
83
|
+
"test:openai-compat-streaming-retry": "npx tsx test/continuous-test-suite-openai-compat-streaming-retry.ts",
|
|
84
|
+
"test:anthropic-streaming-retry": "npx tsx test/continuous-test-suite-anthropic-streaming-retry.ts",
|
|
85
|
+
"test:error-classification-e2e": "npx tsx test/continuous-test-suite-error-classification-e2e.ts",
|
|
86
|
+
"test:error-classifier-contract": "npx tsx test/continuous-test-suite-error-classifier-contract.ts",
|
|
94
87
|
"test:middleware": "npx tsx test/continuous-test-suite-middleware.ts",
|
|
95
88
|
"test:observability": "npx tsx test/continuous-test-suite-observability.ts",
|
|
96
89
|
"test:ppt": "npx tsx test/continuous-test-suite-ppt.ts",
|
|
@@ -99,74 +92,40 @@
|
|
|
99
92
|
"test:matrix": "npx tsx test/continuous-test-suite-provider-matrix.ts",
|
|
100
93
|
"test:matrix:cli": "npx tsx test/continuous-test-suite-provider-matrix-cli.ts",
|
|
101
94
|
"test:mcp:spans": "npx tsx test/continuous-test-suite-mcp-spans.ts",
|
|
102
|
-
"test:mcp:bash": "npx tsx test/continuous-test-suite-mcp-bash.ts",
|
|
103
|
-
"test:mcp:limits": "npx tsx test/continuous-test-suite-mcp-output-limits.ts",
|
|
104
95
|
"test:mcp:infra": "npx tsx test/continuous-test-suite-mcp-infra.ts",
|
|
105
96
|
"test:providers-mocked": "npx tsx test/continuous-test-suite-providers-mocked.ts",
|
|
97
|
+
"test:provider-descriptors": "npx tsx test/continuous-test-suite-provider-descriptors.ts",
|
|
106
98
|
"test:provider-structure": "npx tsx test/continuous-test-suite-provider-structure.ts",
|
|
107
99
|
"test:provider-fallback": "npx tsx test/continuous-test-suite-provider-fallback.ts",
|
|
108
100
|
"test:provider-fallback-latency": "npx tsx test/continuous-test-suite-provider-fallback-latency.ts",
|
|
109
101
|
"test:provider-wiring": "npx tsx test/continuous-test-suite-provider-wiring.ts",
|
|
110
102
|
"test:rag": "npx tsx test/continuous-test-suite-rag.ts",
|
|
111
|
-
"test:vector-pinecone": "npx tsx test/continuous-test-suite-vector-pinecone.ts",
|
|
112
|
-
"test:vector-pgvector": "npx tsx test/continuous-test-suite-vector-pgvector.ts",
|
|
113
|
-
"test:vector-chroma": "npx tsx test/continuous-test-suite-vector-chroma.ts",
|
|
114
103
|
"test:skills": "npx tsx test/continuous-test-suite-skills.ts",
|
|
115
104
|
"test:servers": "npx tsx test/continuous-test-suite-servers.ts",
|
|
116
105
|
"test:tool-reliability": "npx tsx test/continuous-test-suite-tool-reliability.ts",
|
|
117
|
-
"test:google-native": "npx tsx test/continuous-test-suite-google-native.ts",
|
|
118
|
-
"test:gemini-abort": "npx tsx test/continuous-test-suite-gemini-abort.ts",
|
|
119
|
-
"test:anthropic-cap": "npx tsx test/continuous-test-suite-anthropic-cap.ts",
|
|
120
|
-
"test:token-usage": "npx tsx test/continuous-test-suite-token-usage.ts",
|
|
121
106
|
"test:tts": "npx tsx test/continuous-test-suite-tts.ts",
|
|
122
107
|
"test:voice": "npx tsx test/continuous-test-suite-voice.ts",
|
|
123
|
-
"test:voice-server": "npx tsx test/continuous-test-suite-voice-server.ts",
|
|
124
108
|
"test:avatar": "npx tsx test/continuous-test-suite-avatar.ts",
|
|
125
109
|
"test:music": "npx tsx test/continuous-test-suite-music.ts",
|
|
126
110
|
"test:image-gen": "npx tsx test/continuous-test-suite-image-gen-extras.ts",
|
|
127
|
-
"test:ssrf": "npx tsx test/continuous-test-suite-ssrf.ts",
|
|
128
|
-
"test:log-sanitize": "npx tsx test/continuous-test-suite-log-sanitize.ts",
|
|
129
|
-
"test:sse-client": "npx tsx test/continuous-test-suite-sse-client.ts",
|
|
130
|
-
"test:stream-span": "npx tsx test/continuous-test-suite-stream-span.ts",
|
|
131
|
-
"test:vertex-langfuse-spans": "npx tsx test/continuous-test-suite-vertex-langfuse-spans.ts",
|
|
132
111
|
"test:credentials": "npx tsx test/continuous-test-suite-credentials.ts",
|
|
133
112
|
"test:dynamic": "npx tsx test/continuous-test-suite-dynamic.ts",
|
|
134
113
|
"test:proxy": "npx tsx test/continuous-test-suite-proxy.ts",
|
|
135
114
|
"test:bugfixes": "npx tsx test/continuous-test-suite-bugfixes.ts",
|
|
136
|
-
"test:file-detector-extension": "npx tsx test/continuous-test-suite-file-detector-extension.ts",
|
|
137
|
-
"test:file-detector-magic-bytes": "npx tsx test/continuous-test-suite-file-detector-magic-bytes.ts",
|
|
138
|
-
"test:json": "npx tsx test/continuous-test-suite-json.ts",
|
|
139
115
|
"test:json-e2e": "npx tsx test/continuous-test-suite-json-e2e.ts",
|
|
140
116
|
"test:workflow": "npx tsx test/continuous-test-suite-workflow.ts",
|
|
141
117
|
"test:hitl": "npx tsx test/continuous-test-suite-hitl.ts",
|
|
142
|
-
"test:analytics": "npx tsx test/continuous-test-suite-analytics.ts",
|
|
143
118
|
"test:tasks": "npx tsx test/continuous-test-suite-tasks.ts",
|
|
144
119
|
"test:auth": "npx tsx test/continuous-test-suite-auth.ts",
|
|
145
120
|
"test:autoresearch": "npx tsx test/continuous-test-suite-autoresearch.ts",
|
|
146
|
-
"test:
|
|
147
|
-
"test:anthropic-tools-policy": "npx tsx test/continuous-test-suite-anthropic-tools-policy.ts",
|
|
148
|
-
"test:anthropic-structured": "npx tsx test/continuous-test-suite-anthropic-structured-tools.ts",
|
|
149
|
-
"test:sagemaker-tools": "npx tsx test/continuous-test-suite-sagemaker-tools.ts",
|
|
150
|
-
"test:anthropic-multimodal": "npx tsx test/continuous-test-suite-anthropic-multimodal.ts",
|
|
151
|
-
"test:unified-files-prompt-sync": "npx tsx test/continuous-test-suite-unified-files-prompt-sync.ts",
|
|
152
|
-
"test:excel-interop": "npx tsx test/continuous-test-suite-excel-interop.ts",
|
|
153
|
-
"test:envguard": "npx tsx test/helpers/envGuard.test.ts",
|
|
154
|
-
"test:tool-routing-cli": "npx tsx test/continuous-test-suite-tool-routing-flags.ts && npx tsx test/continuous-test-suite-tool-routing-cli.ts",
|
|
121
|
+
"test:tool-routing-cli": "npx tsx test/continuous-test-suite-tool-routing-cli.ts",
|
|
155
122
|
"test:tool-dedup": "npx tsx test/continuous-test-suite-tool-dedup.ts",
|
|
156
|
-
"test:model-pool": "npx tsx test/continuous-test-suite-model-pool.ts",
|
|
157
123
|
"test:model-not-found-retryable": "npx tsx test/continuous-test-suite-model-not-found-retryable.ts",
|
|
158
|
-
"test:model-capabilities": "npx tsx test/continuous-test-suite-model-capabilities.ts",
|
|
159
|
-
"test:agent-runtime:vitest": "pnpm exec vitest run test/agentRuntime.test.ts",
|
|
160
|
-
"test:retry-after:vitest": "pnpm exec vitest run test/retryAfter.test.ts",
|
|
161
|
-
"test:websearch-grounding": "npx tsx test/continuous-test-suite-websearch-grounding.ts",
|
|
162
124
|
"test:ci": "pnpm run test && pnpm run test:client && pnpm run test:hitl",
|
|
163
125
|
"// CI tier — fast, no live AI calls, safe for every commit (test:unit; also see the separate provider-safety-net CI job, which runs build + test:providers-mocked + test:provider-structure on every PR)": "",
|
|
164
126
|
"test:tool-routing": "npx tsx test/continuous-test-suite-tool-routing.ts",
|
|
165
|
-
"test:classifier-router": "npx tsx test/continuous-test-suite-classifier-router.ts",
|
|
166
|
-
"test:system-messages": "npx tsx test/continuous-test-suite-system-messages.ts",
|
|
167
|
-
"test:test-stubs": "npx tsx test/continuous-test-suite-test-stubs.ts",
|
|
168
127
|
"test:tool-routing-semantic": "npx tsx test/continuous-test-suite-tool-routing-semantic.ts",
|
|
169
|
-
"test:unit": "pnpm run test:
|
|
128
|
+
"test:unit": "pnpm run test:bugfixes && pnpm run test:mcp:infra && pnpm run test:mcp:spans && pnpm run test:tool-routing && pnpm run test:tool-routing-cli && pnpm run test:tool-dedup && pnpm run test:model-pool && pnpm run test:tool-routing-semantic && pnpm run test:mcp-result-cache && pnpm run test:model-not-found-retryable && pnpm run test:archive:security && pnpm run test:office:security && pnpm run test:vector-chroma && pnpm run test:vector-pgvector && pnpm run test:vector-pinecone && pnpm run test:provider-wiring",
|
|
170
129
|
"// CI tier — live providers, runs only when API keys are present (test:credentials and test:dynamic make real provider calls when keys are set, so they live here, not in test:unit; test:matrix, a different suite covering the full provider capability matrix, runs nightly via .github/workflows/live-matrix.yml — test:providers itself is still only wired into test:live, not any GitHub Actions workflow)": "",
|
|
171
130
|
"test:live": "pnpm run test:providers && pnpm run test:mcp:http && pnpm run test:mcp:sdk && pnpm run test:mcp:cli && pnpm run test:observability && pnpm run test:context && pnpm run test:memory && pnpm run test:tool-reliability && pnpm run test:evaluation && pnpm run test:autoresearch && pnpm run test:credentials && pnpm run test:dynamic",
|
|
172
131
|
"// CI tier — product output (image/video/TTS/PPT) — costs $$ per run (not wired into any GitHub Actions workflow as of this comment; run manually or add to live-matrix.yml if nightly coverage is needed)": "",
|
|
@@ -228,30 +187,16 @@
|
|
|
228
187
|
"pre-commit": "lint-staged",
|
|
229
188
|
"pre-push": "pnpm run build && pnpm run test:providers-mocked && pnpm run test:provider-structure",
|
|
230
189
|
"check:all": "pnpm run lint && pnpm run format --check && pnpm run validate && pnpm run validate:commit",
|
|
231
|
-
"test:litellm-context": "npx tsx test/continuous-test-suite-litellm-context-windows.ts",
|
|
232
|
-
"test:dedup-execute-map": "npx tsx test/continuous-test-suite-dedup-execute-map.ts",
|
|
233
|
-
"test:agent-delegation": "npx tsx test/continuous-test-suite-agent-delegation.ts",
|
|
234
|
-
"test:step-budget-guard": "npx tsx test/continuous-test-suite-step-budget-guard.ts",
|
|
235
|
-
"test:agent-plumbing": "npx tsx test/continuous-test-suite-agent-plumbing.ts",
|
|
236
|
-
"test:tool-execution-recorder": "npx tsx test/continuous-test-suite-tool-execution-recorder.ts",
|
|
237
|
-
"test:proxy-terminal-errors": "npx tsx test/continuous-test-suite-proxy-terminal-errors.ts",
|
|
238
|
-
"test:proxy-limit-headers": "npx tsx test/continuous-test-suite-proxy-limit-headers.ts",
|
|
239
|
-
"test:proxy-usage-refresh": "npx tsx test/continuous-test-suite-proxy-usage-refresh.ts",
|
|
240
|
-
"test:proxy:vitest": "pnpm exec vitest run test/proxyAnalysis.test.ts test/proxyConfigHotReload.test.ts test/proxyObservabilityFoundation.test.ts test/proxyReliabilityHardening.test.ts test/proxyReplay.test.ts test/proxyRollingWorkerHandoff.test.ts test/proxyTestIsolation.test.ts test/proxyUpdaterFallback.test.ts test/proxyUsageStatsPersistence.test.ts",
|
|
241
|
-
"test:anthropic-limit-capture": "npx tsx test/continuous-test-suite-anthropic-limit-capture.ts",
|
|
242
|
-
"test:audio": "npx tsx test/continuous-test-suite-audio.ts",
|
|
243
190
|
"test:file-formats": "npx tsx test/continuous-test-suite-file-formats.ts",
|
|
244
|
-
"test:
|
|
245
|
-
"test:tts:unit": "npx tsx test/continuous-test-suite-tts-unit.ts",
|
|
246
|
-
"test:video": "npx tsx test/continuous-test-suite-video.ts",
|
|
247
|
-
"test:multimodal": "pnpm run test:file-formats && pnpm run test:audio && pnpm run test:video && pnpm run test:office && pnpm run test:tts:unit && pnpm run test:multimodal:sdk",
|
|
191
|
+
"test:multimodal": "pnpm run test:file-formats && pnpm run test:multimodal:sdk",
|
|
248
192
|
"test:multimodal:sdk": "npx tsx test/continuous-test-suite-multimodal-sdk.ts",
|
|
249
|
-
"test:sampling-params": "npx tsx test/continuous-test-suite-sampling-params.ts",
|
|
250
|
-
"test:structured-recovery": "npx tsx test/continuous-test-suite-structured-recovery.ts",
|
|
251
|
-
"test:prompt-redaction": "npx tsx test/continuous-test-suite-prompt-redaction.ts",
|
|
252
193
|
"test:mcp-result-cache": "npx tsx test/continuous-test-suite-mcp-result-cache.ts",
|
|
253
194
|
"test:archive:security": "npx tsx test/continuous-test-suite-archive-security.ts",
|
|
254
|
-
"test:office:security": "npx tsx test/continuous-test-suite-office-security.ts"
|
|
195
|
+
"test:office:security": "npx tsx test/continuous-test-suite-office-security.ts",
|
|
196
|
+
"test:model-pool": "npx tsx test/continuous-test-suite-model-pool.ts",
|
|
197
|
+
"test:vector-chroma": "npx tsx test/continuous-test-suite-vector-chroma.ts",
|
|
198
|
+
"test:vector-pgvector": "npx tsx test/continuous-test-suite-vector-pgvector.ts",
|
|
199
|
+
"test:vector-pinecone": "npx tsx test/continuous-test-suite-vector-pinecone.ts"
|
|
255
200
|
},
|
|
256
201
|
"files": [
|
|
257
202
|
"dist",
|