@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
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AuthenticationError, InvalidModelError, NetworkError,
|
|
1
|
+
import { AuthenticationError, InvalidModelError, NetworkError, } from "../../types/index.js";
|
|
2
2
|
import { logger } from "../../utils/logger.js";
|
|
3
3
|
import { redactUrlCredentials } from "../../utils/logSanitize.js";
|
|
4
|
-
import {
|
|
4
|
+
import { classifyProviderError, DEFAULT_ERROR_RULES, } from "../../utils/errorClassifier.js";
|
|
5
5
|
import { OpenAIChatCompletionsProvider } from "../openaiChatCompletionsBase.js";
|
|
6
6
|
import { FALLBACK_OPENAI_COMPATIBLE_MODEL } from "./constants.js";
|
|
7
7
|
import { getDefaultOpenAICompatibleModel, getOpenAICompatibleConfig, } from "./utils.js";
|
|
@@ -52,36 +52,40 @@ export class OpenAICompatibleProvider extends OpenAIChatCompletionsProvider {
|
|
|
52
52
|
];
|
|
53
53
|
}
|
|
54
54
|
formatProviderError(error) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
55
|
+
const rules = [
|
|
56
|
+
// Duck-typed timeout check (name === "TimeoutError" or a "Timeout"
|
|
57
|
+
// substring) — broader than classifyProviderError's built-in
|
|
58
|
+
// `instanceof TimeoutError` handling, so it's preserved as an
|
|
59
|
+
// explicit rule rather than relying on the default.
|
|
60
|
+
{
|
|
61
|
+
match: (ctx) => ctx.errorName === "TimeoutError" || /Timeout/.test(ctx.message),
|
|
62
|
+
errorClass: NetworkError,
|
|
63
|
+
message: (ctx) => `Request timed out: ${ctx.message}`,
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
match: (ctx) => /ECONNREFUSED|Failed to fetch/i.test(ctx.message),
|
|
67
|
+
errorClass: NetworkError,
|
|
68
|
+
message: () => `OpenAI Compatible endpoint not available. Please check your OPENAI_COMPATIBLE_BASE_URL: ${redactUrlCredentials(this.config.baseURL)}`,
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
match: (ctx) => ctx.statusCode === 401 ||
|
|
72
|
+
/API_KEY_INVALID|Invalid API key|Unauthorized/i.test(ctx.message),
|
|
73
|
+
errorClass: AuthenticationError,
|
|
74
|
+
message: "Invalid OpenAI Compatible API key. Please check your OPENAI_COMPATIBLE_API_KEY environment variable.",
|
|
75
|
+
},
|
|
76
|
+
// "does not exist" isn't covered by DEFAULT_ERROR_RULES's
|
|
77
|
+
// model_not_found/"model not found" pattern — preserved verbatim.
|
|
78
|
+
{
|
|
79
|
+
match: (ctx) => /model/i.test(ctx.message) &&
|
|
80
|
+
(/not found/i.test(ctx.message) ||
|
|
81
|
+
/does not exist/i.test(ctx.message)),
|
|
82
|
+
errorClass: InvalidModelError,
|
|
83
|
+
message: (ctx) => `Model '${ctx.modelName}' not available on OpenAI Compatible endpoint. ` +
|
|
84
|
+
"Please check available models or use getAvailableModels() to see supported models.",
|
|
85
|
+
},
|
|
86
|
+
...DEFAULT_ERROR_RULES,
|
|
87
|
+
];
|
|
88
|
+
return classifyProviderError(error, rules, "openai-compatible", this.modelName);
|
|
85
89
|
}
|
|
86
90
|
}
|
|
87
91
|
//# sourceMappingURL=client.js.map
|
|
@@ -6,7 +6,8 @@ import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
|
6
6
|
*
|
|
7
7
|
* Sonar models with built-in web grounding. OpenAI-compatible chat
|
|
8
8
|
* completions at api.perplexity.ai. Best for queries that need fresh
|
|
9
|
-
* web context (search-augmented answers
|
|
9
|
+
* web context (search-augmented answers). Citation data, if the API returns
|
|
10
|
+
* any, is not extracted or exposed by this provider.
|
|
10
11
|
*
|
|
11
12
|
* All request/stream/tool-loop orchestration lives in
|
|
12
13
|
* `OpenAIChatCompletionsProvider`; this class only declares configuration
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { PerplexityModels } from "../constants/enums.js";
|
|
2
|
-
import { AuthenticationError
|
|
2
|
+
import { AuthenticationError } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
4
|
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
5
|
+
import { classifyProviderError, DEFAULT_ERROR_RULES, } from "../utils/errorClassifier.js";
|
|
5
6
|
import { createPerplexityConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
6
|
-
import { TimeoutError } from "../utils/timeout.js";
|
|
7
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
8
8
|
const PERPLEXITY_DEFAULT_BASE_URL = "https://api.perplexity.ai";
|
|
9
9
|
const getPerplexityApiKey = () => validateApiKey(createPerplexityConfig());
|
|
@@ -13,7 +13,8 @@ const getDefaultPerplexityModel = () => getProviderModel("PERPLEXITY_MODEL", Per
|
|
|
13
13
|
*
|
|
14
14
|
* Sonar models with built-in web grounding. OpenAI-compatible chat
|
|
15
15
|
* completions at api.perplexity.ai. Best for queries that need fresh
|
|
16
|
-
* web context (search-augmented answers
|
|
16
|
+
* web context (search-augmented answers). Citation data, if the API returns
|
|
17
|
+
* any, is not extracted or exposed by this provider.
|
|
17
18
|
*
|
|
18
19
|
* All request/stream/tool-loop orchestration lives in
|
|
19
20
|
* `OpenAIChatCompletionsProvider`; this class only declares configuration
|
|
@@ -53,25 +54,16 @@ export class PerplexityProvider extends OpenAIChatCompletionsProvider {
|
|
|
53
54
|
];
|
|
54
55
|
}
|
|
55
56
|
formatProviderError(error) {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return new AuthenticationError("Invalid Perplexity API key. Get one at https://www.perplexity.ai/settings/api", "perplexity");
|
|
67
|
-
}
|
|
68
|
-
if (message.includes("rate limit") || message.includes("429")) {
|
|
69
|
-
return new RateLimitError("Perplexity rate limit exceeded. Back off and retry.", "perplexity");
|
|
70
|
-
}
|
|
71
|
-
if (message.includes("model_not_found") || message.includes("404")) {
|
|
72
|
-
return new InvalidModelError(`Perplexity model '${this.modelName}' not found. Use sonar, sonar-pro, sonar-reasoning, sonar-reasoning-pro, or sonar-deep-research.`, "perplexity");
|
|
73
|
-
}
|
|
74
|
-
return new ProviderError(`Perplexity error: ${message}`, "perplexity");
|
|
57
|
+
const rules = [
|
|
58
|
+
{
|
|
59
|
+
match: (ctx) => ctx.statusCode === 401 ||
|
|
60
|
+
/Invalid API key|Authentication/i.test(ctx.message),
|
|
61
|
+
errorClass: AuthenticationError,
|
|
62
|
+
message: "Invalid Perplexity API key. Get one at https://www.perplexity.ai/settings/api",
|
|
63
|
+
},
|
|
64
|
+
...DEFAULT_ERROR_RULES,
|
|
65
|
+
];
|
|
66
|
+
return classifyProviderError(error, rules, "perplexity", this.modelName);
|
|
75
67
|
}
|
|
76
68
|
}
|
|
77
69
|
//# sourceMappingURL=perplexity.js.map
|
|
@@ -34,6 +34,18 @@ function flattenReplicateOutput(output) {
|
|
|
34
34
|
}
|
|
35
35
|
return "";
|
|
36
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve Replicate credentials, aliasing the standard `apiKey`/`baseURL`
|
|
39
|
+
* field names (shared with every other provider in `NeurolinkCredentials`)
|
|
40
|
+
* against the legacy `apiToken`/`baseUrl` names. The standard name wins
|
|
41
|
+
* when both are present; used identically for instance-level and per-call
|
|
42
|
+
* credentials so aliasing never drifts between the two.
|
|
43
|
+
*/
|
|
44
|
+
function resolveReplicateCredentials(credentials) {
|
|
45
|
+
const apiToken = credentials?.apiKey?.trim() || credentials?.apiToken?.trim();
|
|
46
|
+
const baseUrl = credentials?.baseURL || credentials?.baseUrl;
|
|
47
|
+
return { apiToken, baseUrl };
|
|
48
|
+
}
|
|
37
49
|
/**
|
|
38
50
|
* Replicate LLM Provider — predict-then-stream pattern.
|
|
39
51
|
*
|
|
@@ -63,12 +75,12 @@ export class ReplicateProvider extends BaseProvider {
|
|
|
63
75
|
constructor(modelName, sdk, _region, credentials) {
|
|
64
76
|
const validatedNeurolink = isNeuroLink(sdk) ? sdk : undefined;
|
|
65
77
|
super(modelName, "replicate", validatedNeurolink);
|
|
66
|
-
const overrideToken = credentials
|
|
78
|
+
const { apiToken: overrideToken, baseUrl: overrideBaseUrl } = resolveReplicateCredentials(credentials);
|
|
67
79
|
this.apiToken =
|
|
68
80
|
overrideToken && overrideToken.length > 0
|
|
69
81
|
? overrideToken
|
|
70
82
|
: validateApiKey(createReplicateConfig());
|
|
71
|
-
this.baseURL =
|
|
83
|
+
this.baseURL = overrideBaseUrl;
|
|
72
84
|
logger.debug("Replicate Provider initialized", {
|
|
73
85
|
modelName: this.modelName,
|
|
74
86
|
baseURL: this.baseURL,
|
|
@@ -109,7 +121,7 @@ export class ReplicateProvider extends BaseProvider {
|
|
|
109
121
|
const options = typeof optionsOrPrompt === "string"
|
|
110
122
|
? { prompt: optionsOrPrompt }
|
|
111
123
|
: optionsOrPrompt;
|
|
112
|
-
const {
|
|
124
|
+
const { isImageGenerationModel } = await import("../core/constants.js");
|
|
113
125
|
// Delegate special output modes to base class (which never calls getAISDKModel for these)
|
|
114
126
|
if (options.output?.mode === "video" ||
|
|
115
127
|
options.output?.mode === "avatar" ||
|
|
@@ -117,7 +129,7 @@ export class ReplicateProvider extends BaseProvider {
|
|
|
117
129
|
return super.generate(options, _analysisSchema);
|
|
118
130
|
}
|
|
119
131
|
// Image-gen models: delegate to base which calls executeImageGeneration()
|
|
120
|
-
const isImageModel =
|
|
132
|
+
const isImageModel = isImageGenerationModel(this.modelName);
|
|
121
133
|
const requestsNonImageOutput = options.output?.format === "json" ||
|
|
122
134
|
options.output?.format === "structured" ||
|
|
123
135
|
options.output?.format === "text";
|
|
@@ -175,8 +187,9 @@ export class ReplicateProvider extends BaseProvider {
|
|
|
175
187
|
const startTime = Date.now();
|
|
176
188
|
// Resolve per-call credentials first, then fall back to instance-level.
|
|
177
189
|
const perCallCreds = options.credentials?.replicate;
|
|
178
|
-
const
|
|
179
|
-
const
|
|
190
|
+
const resolvedPerCall = resolveReplicateCredentials(perCallCreds);
|
|
191
|
+
const effectiveToken = resolvedPerCall.apiToken || this.apiToken;
|
|
192
|
+
const effectiveBaseUrl = resolvedPerCall.baseUrl || this.baseURL;
|
|
180
193
|
const auth = getReplicateAuth({
|
|
181
194
|
apiToken: effectiveToken,
|
|
182
195
|
baseUrl: effectiveBaseUrl,
|
|
@@ -255,8 +268,9 @@ export class ReplicateProvider extends BaseProvider {
|
|
|
255
268
|
const startTime = Date.now();
|
|
256
269
|
// Resolve per-call credentials first, then fall back to instance-level.
|
|
257
270
|
const perCallCreds = options.credentials?.replicate;
|
|
258
|
-
const
|
|
259
|
-
const
|
|
271
|
+
const resolvedPerCall = resolveReplicateCredentials(perCallCreds);
|
|
272
|
+
const effectiveToken = resolvedPerCall.apiToken || this.apiToken;
|
|
273
|
+
const effectiveBaseUrl = resolvedPerCall.baseUrl || this.baseURL;
|
|
260
274
|
const auth = getReplicateAuth({
|
|
261
275
|
apiToken: effectiveToken,
|
|
262
276
|
baseUrl: effectiveBaseUrl,
|
|
@@ -399,5 +413,4 @@ export class ReplicateProvider extends BaseProvider {
|
|
|
399
413
|
};
|
|
400
414
|
}
|
|
401
415
|
}
|
|
402
|
-
export default ReplicateProvider;
|
|
403
416
|
//# sourceMappingURL=replicate.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { TogetherAIModels } from "../constants/enums.js";
|
|
2
|
-
import { AuthenticationError
|
|
2
|
+
import { AuthenticationError } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
4
|
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
5
|
+
import { classifyProviderError, DEFAULT_ERROR_RULES, } from "../utils/errorClassifier.js";
|
|
5
6
|
import { createTogetherAIConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
6
|
-
import { TimeoutError } from "../utils/timeout.js";
|
|
7
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
8
8
|
const TOGETHER_DEFAULT_BASE_URL = "https://api.together.xyz/v1";
|
|
9
9
|
const getTogetherApiKey = () => validateApiKey(createTogetherAIConfig());
|
|
@@ -58,25 +58,16 @@ export class TogetherAIProvider extends OpenAIChatCompletionsProvider {
|
|
|
58
58
|
];
|
|
59
59
|
}
|
|
60
60
|
formatProviderError(error) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return new AuthenticationError("Invalid Together AI API key. Get one at https://api.together.xyz/settings/api-keys", "together-ai");
|
|
72
|
-
}
|
|
73
|
-
if (message.includes("rate limit") || message.includes("429")) {
|
|
74
|
-
return new RateLimitError("Together AI rate limit exceeded. Back off and retry.", "together-ai");
|
|
75
|
-
}
|
|
76
|
-
if (message.includes("model_not_found") || message.includes("404")) {
|
|
77
|
-
return new InvalidModelError(`Together AI model '${this.modelName}' not found. Browse the catalog at https://api.together.xyz/models`, "together-ai");
|
|
78
|
-
}
|
|
79
|
-
return new ProviderError(`Together AI error: ${message}`, "together-ai");
|
|
61
|
+
const rules = [
|
|
62
|
+
{
|
|
63
|
+
match: (ctx) => ctx.statusCode === 401 ||
|
|
64
|
+
/Invalid API key|Authentication/i.test(ctx.message),
|
|
65
|
+
errorClass: AuthenticationError,
|
|
66
|
+
message: "Invalid Together AI API key. Get one at https://api.together.xyz/settings/api-keys",
|
|
67
|
+
},
|
|
68
|
+
...DEFAULT_ERROR_RULES,
|
|
69
|
+
];
|
|
70
|
+
return classifyProviderError(error, rules, "together-ai", this.modelName);
|
|
80
71
|
}
|
|
81
72
|
}
|
|
82
73
|
//# sourceMappingURL=togetherAi.js.map
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { XaiModels } from "../constants/enums.js";
|
|
2
|
-
import { AuthenticationError,
|
|
2
|
+
import { AuthenticationError, ProviderError } from "../types/index.js";
|
|
3
3
|
import { logger } from "../utils/logger.js";
|
|
4
4
|
import { redactUrlCredentials } from "../utils/logSanitize.js";
|
|
5
|
+
import { classifyProviderError, DEFAULT_ERROR_RULES, } from "../utils/errorClassifier.js";
|
|
5
6
|
import { createXaiConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
|
|
6
|
-
import { TimeoutError } from "../utils/timeout.js";
|
|
7
7
|
import { OpenAIChatCompletionsProvider } from "./openaiChatCompletionsBase.js";
|
|
8
8
|
const XAI_DEFAULT_BASE_URL = "https://api.x.ai/v1";
|
|
9
9
|
const getXaiApiKey = () => validateApiKey(createXaiConfig());
|
|
@@ -57,30 +57,21 @@ export class XaiProvider extends OpenAIChatCompletionsProvider {
|
|
|
57
57
|
];
|
|
58
58
|
}
|
|
59
59
|
formatProviderError(error) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
}
|
|
76
|
-
if (message.includes("model_not_found") || message.includes("404")) {
|
|
77
|
-
return new InvalidModelError(`xAI model '${this.modelName}' not found. Use grok-2-latest, grok-3, grok-3-mini, grok-2-vision-latest, or grok-beta.`, "xai");
|
|
78
|
-
}
|
|
79
|
-
if (message.includes("insufficient_quota") ||
|
|
80
|
-
message.includes("quota exceeded")) {
|
|
81
|
-
return new ProviderError("xAI account has insufficient quota. Top up at https://console.x.ai/", "xai");
|
|
82
|
-
}
|
|
83
|
-
return new ProviderError(`xAI error: ${message}`, "xai");
|
|
60
|
+
const rules = [
|
|
61
|
+
{
|
|
62
|
+
match: (ctx) => ctx.statusCode === 401 ||
|
|
63
|
+
/Invalid API key|Authentication|invalid_api_key/i.test(ctx.message),
|
|
64
|
+
errorClass: AuthenticationError,
|
|
65
|
+
message: "Invalid xAI API key. Please check your XAI_API_KEY environment variable. Get one at https://console.x.ai/",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
match: (ctx) => /insufficient_quota|quota exceeded/i.test(ctx.message),
|
|
69
|
+
errorClass: ProviderError,
|
|
70
|
+
message: "xAI account has insufficient quota. Top up at https://console.x.ai/",
|
|
71
|
+
},
|
|
72
|
+
...DEFAULT_ERROR_RULES,
|
|
73
|
+
];
|
|
74
|
+
return classifyProviderError(error, rules, "xai", this.modelName);
|
|
84
75
|
}
|
|
85
76
|
}
|
|
86
77
|
//# sourceMappingURL=xai.js.map
|
|
@@ -88,7 +88,7 @@ export declare class RateLimitError extends ServerAdapterError {
|
|
|
88
88
|
/**
|
|
89
89
|
* Timeout error
|
|
90
90
|
*/
|
|
91
|
-
export declare class
|
|
91
|
+
export declare class ServerTimeoutError extends ServerAdapterError {
|
|
92
92
|
constructor(timeoutMs: number, operation?: string, requestId?: string);
|
|
93
93
|
}
|
|
94
94
|
/**
|
|
@@ -206,7 +206,7 @@ export class RateLimitError extends ServerAdapterError {
|
|
|
206
206
|
/**
|
|
207
207
|
* Timeout error
|
|
208
208
|
*/
|
|
209
|
-
export class
|
|
209
|
+
export class ServerTimeoutError extends ServerAdapterError {
|
|
210
210
|
constructor(timeoutMs, operation, requestId) {
|
|
211
211
|
super(`Operation timed out after ${timeoutMs}ms${operation ? `: ${operation}` : ""}`, ServerAdapterErrorCode.TIMEOUT, {
|
|
212
212
|
category: ErrorCategory.EXECUTION,
|
|
@@ -215,7 +215,7 @@ export class TimeoutError extends ServerAdapterError {
|
|
|
215
215
|
requestId,
|
|
216
216
|
details: { timeoutMs, operation },
|
|
217
217
|
});
|
|
218
|
-
this.name = "
|
|
218
|
+
this.name = "ServerTimeoutError";
|
|
219
219
|
}
|
|
220
220
|
}
|
|
221
221
|
/**
|
|
@@ -27,7 +27,7 @@ export { ExpressServerAdapter } from "./adapters/expressAdapter.js";
|
|
|
27
27
|
export { FastifyServerAdapter } from "./adapters/fastifyAdapter.js";
|
|
28
28
|
export { HonoServerAdapter } from "./adapters/honoAdapter.js";
|
|
29
29
|
export { KoaServerAdapter } from "./adapters/koaAdapter.js";
|
|
30
|
-
export { AlreadyRunningError, AuthenticationError, AuthorizationError, ConfigurationError, ErrorRecoveryStrategies, HandlerError, InvalidAuthenticationError, MissingDependencyError, NotRunningError, RateLimitError as ServerRateLimitError, RouteConflictError, RouteNotFoundError, ServerAdapterError, ServerStartError, ServerStopError, StreamAbortedError, StreamingError,
|
|
30
|
+
export { AlreadyRunningError, AuthenticationError as ServerAuthenticationError, AuthorizationError as ServerAuthorizationError, ConfigurationError, ErrorRecoveryStrategies, HandlerError, InvalidAuthenticationError, MissingDependencyError, NotRunningError, RateLimitError as ServerRateLimitError, RouteConflictError, RouteNotFoundError, ServerAdapterError, ServerStartError, ServerStopError, StreamAbortedError, StreamingError, ServerTimeoutError, ValidationError as ServerValidationError, WebSocketConnectionError, WebSocketError, wrapError, } from "./errors.js";
|
|
31
31
|
export { createServer, ServerAdapterFactory, } from "./factory/serverAdapterFactory.js";
|
|
32
32
|
export { createAbortSignalMiddleware, createExpressAbortMiddleware, } from "./middleware/abortSignal.js";
|
|
33
33
|
export { createAuthMiddleware, createRoleMiddleware, } from "./middleware/auth.js";
|
|
@@ -35,7 +35,7 @@ export { createCacheInvalidator, createCacheMiddleware, InMemoryCacheStore, } fr
|
|
|
35
35
|
export { createCompressionMiddleware, createErrorHandlingMiddleware, createLoggingMiddleware, createRequestIdMiddleware, createSecurityHeadersMiddleware, createTimingMiddleware, } from "./middleware/common.js";
|
|
36
36
|
export { createDeprecationMiddleware } from "./middleware/deprecation.js";
|
|
37
37
|
export { createMCPBodyAttachmentMiddleware, fastifyMCPBodyHook, } from "./middleware/mcpBodyAttachment.js";
|
|
38
|
-
export { createRateLimitMiddleware, createSlidingWindowRateLimitMiddleware, InMemoryRateLimitStore,
|
|
38
|
+
export { createRateLimitMiddleware, createSlidingWindowRateLimitMiddleware, InMemoryRateLimitStore, } from "./middleware/rateLimit.js";
|
|
39
39
|
export { CommonSchemas, createFieldValidator, createRequestValidationMiddleware, ValidationError, } from "./middleware/validation.js";
|
|
40
40
|
export { AgentExecuteRequestSchema as OpenAPIAgentExecuteRequestSchema, AgentExecuteResponseSchema, AgentInputSchema, ApiKeySecurityScheme, BasicSecurityScheme, BearerSecurityScheme, CommonParameters, ConversationMessageSchema, createApiInfo, createDeleteOperation, createErrorResponse as createOpenAPIErrorResponse, createGetOperation, createHeaderParameter, createOpenAPIGenerator, createPathParameter, createPostOperation, createQueryParameter, createServer as createOpenAPIServer, createStreamingPostOperation, createStreamingResponse, createSuccessResponse, DefaultServers, ErrorResponseSchema, generateOpenAPIFromConfig, generateOpenAPISpec, HealthResponseSchema, MCPServerStatusSchema, MCPServersListResponseSchema, MCPServerToolSchema, MetricsResponseSchema, NeuroLinkApiInfo, OpenAPIGenerator, OpenAPISchemas, ProviderInfoSchema, ReadyResponseSchema, SessionSchema, SessionsListResponseSchema, StandardErrorResponses, StandardTags, TokenUsageSchema, ToolCallSchema, ToolDefinitionSchema, ToolExecuteRequestSchema as OpenAPIToolExecuteRequestSchema, ToolExecuteResponseSchema, ToolListResponseSchema, ToolParameterSchema, } from "./openapi/index.js";
|
|
41
41
|
export { createAgentRoutes, createAllRoutes, createHealthRoutes, createMCPRoutes, createMemoryRoutes, createOpenApiRoutes, createToolRoutes, registerAllRoutes, } from "./routes/index.js";
|
package/dist/lib/server/index.js
CHANGED
|
@@ -38,7 +38,9 @@ export { KoaServerAdapter } from "./adapters/koaAdapter.js";
|
|
|
38
38
|
// ============================================
|
|
39
39
|
export { AlreadyRunningError,
|
|
40
40
|
// Authentication/Authorization errors
|
|
41
|
-
|
|
41
|
+
// (aliased: the bare names resolve to the provider-error classes of the
|
|
42
|
+
// same name from types/ on the public @juspay/neurolink surface)
|
|
43
|
+
AuthenticationError as ServerAuthenticationError, AuthorizationError as ServerAuthorizationError,
|
|
42
44
|
// Configuration errors
|
|
43
45
|
ConfigurationError,
|
|
44
46
|
// Error recovery
|
|
@@ -56,7 +58,7 @@ ServerStartError, ServerStopError, StreamAbortedError,
|
|
|
56
58
|
// Streaming errors
|
|
57
59
|
StreamingError,
|
|
58
60
|
// Timeout errors
|
|
59
|
-
|
|
61
|
+
ServerTimeoutError,
|
|
60
62
|
// Validation errors
|
|
61
63
|
ValidationError as ServerValidationError, WebSocketConnectionError,
|
|
62
64
|
// WebSocket errors
|
|
@@ -76,7 +78,7 @@ export { createCacheInvalidator, createCacheMiddleware, InMemoryCacheStore, } fr
|
|
|
76
78
|
export { createCompressionMiddleware, createErrorHandlingMiddleware, createLoggingMiddleware, createRequestIdMiddleware, createSecurityHeadersMiddleware, createTimingMiddleware, } from "./middleware/common.js";
|
|
77
79
|
export { createDeprecationMiddleware } from "./middleware/deprecation.js";
|
|
78
80
|
export { createMCPBodyAttachmentMiddleware, fastifyMCPBodyHook, } from "./middleware/mcpBodyAttachment.js";
|
|
79
|
-
export { createRateLimitMiddleware, createSlidingWindowRateLimitMiddleware, InMemoryRateLimitStore,
|
|
81
|
+
export { createRateLimitMiddleware, createSlidingWindowRateLimitMiddleware, InMemoryRateLimitStore, } from "./middleware/rateLimit.js";
|
|
80
82
|
export { CommonSchemas, createFieldValidator, createRequestValidationMiddleware, ValidationError, } from "./middleware/validation.js";
|
|
81
83
|
// ============================================
|
|
82
84
|
// OpenAPI
|
|
@@ -40,10 +40,6 @@ export declare class InMemoryRateLimitStore implements RateLimitStore {
|
|
|
40
40
|
* ```
|
|
41
41
|
*/
|
|
42
42
|
export declare function createRateLimitMiddleware(config: RateLimitMiddlewareConfig): MiddlewareDefinition;
|
|
43
|
-
/**
|
|
44
|
-
* Re-export RateLimitError from errors for convenience
|
|
45
|
-
*/
|
|
46
|
-
export { RateLimitError } from "../errors.js";
|
|
47
43
|
/**
|
|
48
44
|
* Create a sliding window rate limiter
|
|
49
45
|
* More accurate than fixed window but slightly more complex
|
|
@@ -114,10 +114,6 @@ function defaultKeyGenerator(ctx) {
|
|
|
114
114
|
ctx.headers["x-real-ip"] ||
|
|
115
115
|
"unknown");
|
|
116
116
|
}
|
|
117
|
-
/**
|
|
118
|
-
* Re-export RateLimitError from errors for convenience
|
|
119
|
-
*/
|
|
120
|
-
export { RateLimitError } from "../errors.js";
|
|
121
117
|
/**
|
|
122
118
|
* Create a sliding window rate limiter
|
|
123
119
|
* More accurate than fixed window but slightly more complex
|
|
@@ -47,6 +47,41 @@ export declare class RateLimitError extends ProviderError {
|
|
|
47
47
|
export declare class InvalidModelError extends ProviderError {
|
|
48
48
|
constructor(message: string, provider?: string);
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Everything a ProviderErrorRule's `match`/`message` functions can inspect
|
|
52
|
+
* about a raw thrown error, pre-extracted once so every rule doesn't
|
|
53
|
+
* re-derive the same duck-typed fields.
|
|
54
|
+
*/
|
|
55
|
+
export type ProviderErrorContext = {
|
|
56
|
+
/** The raw thrown value, for rules that need custom inspection beyond the extracted fields. */
|
|
57
|
+
error: unknown;
|
|
58
|
+
/** `.message` off the raw error, or "Unknown error" if absent/non-string. */
|
|
59
|
+
message: string;
|
|
60
|
+
/** HTTP status code, duck-typed from `.statusCode` / `.status`. */
|
|
61
|
+
statusCode: number | undefined;
|
|
62
|
+
/** `.name` off the raw error (e.g. AWS SDK exception names like "ThrottlingException"). */
|
|
63
|
+
errorName: string | undefined;
|
|
64
|
+
/** `.code` off the raw error (e.g. AWS SDK / Node network error codes). */
|
|
65
|
+
errorCode: string | undefined;
|
|
66
|
+
/** Provider key passed to classifyProviderError (e.g. "mistral", "vertex"). */
|
|
67
|
+
provider: string;
|
|
68
|
+
/** Model name in effect for this call, when the caller has one available. */
|
|
69
|
+
modelName: string | undefined;
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* One row of a provider's error-classification table. Rules are tried in
|
|
73
|
+
* array order; the first `match` to return true wins. `errorClass` must be
|
|
74
|
+
* `ProviderError` or one of its subclasses (AuthenticationError,
|
|
75
|
+
* RateLimitError, InvalidModelError, NetworkError, ...) sharing its
|
|
76
|
+
* `(message, provider?)` constructor shape. `message` can be a static
|
|
77
|
+
* string or a function of the context, for providers that need to
|
|
78
|
+
* interpolate a model name, a scraped retry-delay, or an AWS error code.
|
|
79
|
+
*/
|
|
80
|
+
export type ProviderErrorRule = {
|
|
81
|
+
match: (ctx: ProviderErrorContext) => boolean;
|
|
82
|
+
errorClass: new (message: string, provider?: string) => ProviderError;
|
|
83
|
+
message: string | ((ctx: ProviderErrorContext) => string);
|
|
84
|
+
};
|
|
50
85
|
/**
|
|
51
86
|
* Base class for OAuth-specific errors
|
|
52
87
|
*/
|
|
@@ -60,7 +60,6 @@ export * from "./tools.js";
|
|
|
60
60
|
export * from "./vectorStoreChroma.js";
|
|
61
61
|
export * from "./vectorStorePinecone.js";
|
|
62
62
|
export * from "./voice.js";
|
|
63
|
-
export * from "./universalProviderOptions.js";
|
|
64
63
|
export * from "./utilities.js";
|
|
65
64
|
export * from "./workflow.js";
|
|
66
65
|
export * from "./ioProcessor.js";
|
package/dist/lib/types/index.js
CHANGED
|
@@ -61,7 +61,6 @@ export * from "./tools.js";
|
|
|
61
61
|
export * from "./vectorStoreChroma.js";
|
|
62
62
|
export * from "./vectorStorePinecone.js";
|
|
63
63
|
export * from "./voice.js";
|
|
64
|
-
export * from "./universalProviderOptions.js";
|
|
65
64
|
export * from "./utilities.js";
|
|
66
65
|
export * from "./workflow.js";
|
|
67
66
|
// Processor base types are re-exported via ./processor.js
|