@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.
Files changed (241) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/dist/browser/neurolink.min.js +504 -506
  3. package/dist/cli/commands/setup.d.ts +20 -1
  4. package/dist/cli/commands/setup.js +160 -36
  5. package/dist/cli/factories/commandFactory.d.ts +1157 -1
  6. package/dist/cli/factories/commandFactory.js +20 -53
  7. package/dist/core/baseProvider.js +3 -3
  8. package/dist/core/dynamicModels.d.ts +1 -1
  9. package/dist/core/dynamicModels.js +1 -23
  10. package/dist/core/modelConfiguration.d.ts +1 -70
  11. package/dist/core/modelConfiguration.js +0 -303
  12. package/dist/core/modules/GenerationHandler.js +2 -2
  13. package/dist/core/modules/structuredOutputPolicy.d.ts +2 -2
  14. package/dist/core/modules/structuredOutputPolicy.js +2 -2
  15. package/dist/factories/providerDescriptors.d.ts +18 -0
  16. package/dist/factories/providerDescriptors.js +536 -0
  17. package/dist/factories/providerFactory.d.ts +28 -2
  18. package/dist/factories/providerFactory.js +53 -42
  19. package/dist/factories/providerRegistry.js +33 -32
  20. package/dist/index.d.ts +10 -1
  21. package/dist/index.js +13 -3
  22. package/dist/lib/core/baseProvider.js +3 -3
  23. package/dist/lib/core/dynamicModels.d.ts +1 -1
  24. package/dist/lib/core/dynamicModels.js +1 -23
  25. package/dist/lib/core/modelConfiguration.d.ts +1 -70
  26. package/dist/lib/core/modelConfiguration.js +0 -303
  27. package/dist/lib/core/modules/GenerationHandler.js +2 -2
  28. package/dist/lib/core/modules/structuredOutputPolicy.d.ts +2 -2
  29. package/dist/lib/core/modules/structuredOutputPolicy.js +2 -2
  30. package/dist/lib/factories/providerDescriptors.d.ts +18 -0
  31. package/dist/lib/factories/providerDescriptors.js +537 -0
  32. package/dist/lib/factories/providerFactory.d.ts +28 -2
  33. package/dist/lib/factories/providerFactory.js +53 -42
  34. package/dist/lib/factories/providerRegistry.js +33 -32
  35. package/dist/lib/index.d.ts +10 -1
  36. package/dist/lib/index.js +13 -3
  37. package/dist/lib/models/anthropicModels.d.ts +0 -7
  38. package/dist/lib/models/anthropicModels.js +0 -9
  39. package/dist/lib/neurolink.js +25 -37
  40. package/dist/lib/providers/amazonBedrock/client.js +34 -16
  41. package/dist/lib/providers/anthropic/client.js +39 -34
  42. package/dist/lib/providers/anthropic/constants.d.ts +0 -1
  43. package/dist/lib/providers/anthropic/constants.js +0 -2
  44. package/dist/lib/providers/anthropic/index.d.ts +0 -1
  45. package/dist/lib/providers/anthropic/index.js +0 -1
  46. package/dist/lib/providers/azureOpenai.js +17 -15
  47. package/dist/lib/providers/cloudflare.js +12 -21
  48. package/dist/lib/providers/cohere.js +31 -25
  49. package/dist/lib/providers/deepseek.js +23 -26
  50. package/dist/lib/providers/fireworks.js +12 -21
  51. package/dist/lib/providers/googleAiStudio/client.d.ts +2 -0
  52. package/dist/lib/providers/googleAiStudio/client.js +39 -17
  53. package/dist/lib/providers/googleAiStudio/index.d.ts +0 -1
  54. package/dist/lib/providers/googleAiStudio/index.js +0 -1
  55. package/dist/lib/providers/googleNativeGemini3/index.d.ts +0 -1
  56. package/dist/lib/providers/googleNativeGemini3/index.js +0 -1
  57. package/dist/lib/providers/googleVertex/client.d.ts +0 -51
  58. package/dist/lib/providers/googleVertex/client.js +107 -777
  59. package/dist/lib/providers/groq.js +19 -22
  60. package/dist/lib/providers/huggingFace/client.d.ts +1 -1
  61. package/dist/lib/providers/huggingFace/client.js +27 -25
  62. package/dist/lib/providers/huggingFace/index.d.ts +0 -1
  63. package/dist/lib/providers/huggingFace/index.js +0 -1
  64. package/dist/lib/providers/jina.d.ts +0 -1
  65. package/dist/lib/providers/jina.js +0 -1
  66. package/dist/lib/providers/litellm/client.js +54 -39
  67. package/dist/lib/providers/litellm/index.d.ts +0 -2
  68. package/dist/lib/providers/litellm/index.js +0 -2
  69. package/dist/lib/providers/llamaCpp.d.ts +1 -0
  70. package/dist/lib/providers/llamaCpp.js +24 -18
  71. package/dist/lib/providers/lmStudio.js +25 -42
  72. package/dist/lib/providers/mistral.js +12 -24
  73. package/dist/lib/providers/nvidiaNim/client.js +37 -34
  74. package/dist/lib/providers/nvidiaNim/index.d.ts +0 -1
  75. package/dist/lib/providers/nvidiaNim/index.js +0 -1
  76. package/dist/lib/providers/ollama/client.js +51 -58
  77. package/dist/lib/providers/ollama/index.d.ts +0 -1
  78. package/dist/lib/providers/ollama/index.js +0 -1
  79. package/dist/lib/providers/openAI/client.js +37 -40
  80. package/dist/lib/providers/openAI/index.d.ts +0 -2
  81. package/dist/lib/providers/openAI/index.js +0 -2
  82. package/dist/lib/providers/openRouter/client.js +53 -47
  83. package/dist/lib/providers/openRouter/utils.d.ts +0 -2
  84. package/dist/lib/providers/openRouter/utils.js +0 -12
  85. package/dist/lib/providers/openaiChatCompletionsBase.d.ts +9 -0
  86. package/dist/lib/providers/openaiChatCompletionsBase.js +73 -16
  87. package/dist/lib/providers/openaiCompatible/client.js +36 -32
  88. package/dist/lib/providers/perplexity.d.ts +2 -1
  89. package/dist/lib/providers/perplexity.js +14 -22
  90. package/dist/lib/providers/replicate.d.ts +0 -1
  91. package/dist/lib/providers/replicate.js +22 -9
  92. package/dist/lib/providers/togetherAi.js +12 -21
  93. package/dist/lib/providers/voyage.d.ts +0 -1
  94. package/dist/lib/providers/voyage.js +0 -1
  95. package/dist/lib/providers/xai.js +17 -26
  96. package/dist/lib/server/errors.d.ts +1 -1
  97. package/dist/lib/server/errors.js +2 -2
  98. package/dist/lib/server/index.d.ts +2 -2
  99. package/dist/lib/server/index.js +5 -3
  100. package/dist/lib/server/middleware/rateLimit.d.ts +0 -4
  101. package/dist/lib/server/middleware/rateLimit.js +0 -4
  102. package/dist/lib/types/errors.d.ts +35 -0
  103. package/dist/lib/types/index.d.ts +0 -1
  104. package/dist/lib/types/index.js +0 -1
  105. package/dist/lib/types/providers.d.ts +66 -11
  106. package/dist/lib/utils/errorClassifier.d.ts +30 -0
  107. package/dist/lib/utils/errorClassifier.js +94 -0
  108. package/dist/lib/utils/fileDetector.js +6 -43
  109. package/dist/lib/utils/providerConfig.d.ts +0 -8
  110. package/dist/lib/utils/providerConfig.js +0 -37
  111. package/dist/lib/utils/providerHealth.d.ts +42 -7
  112. package/dist/lib/utils/providerHealth.js +115 -122
  113. package/dist/lib/utils/providerUtils.js +21 -87
  114. package/dist/models/anthropicModels.d.ts +0 -7
  115. package/dist/models/anthropicModels.js +0 -9
  116. package/dist/neurolink.js +25 -37
  117. package/dist/providers/amazonBedrock/client.js +34 -16
  118. package/dist/providers/amazonSagemaker.d.ts +1 -1
  119. package/dist/providers/anthropic/client.js +39 -34
  120. package/dist/providers/anthropic/constants.d.ts +0 -1
  121. package/dist/providers/anthropic/constants.js +0 -2
  122. package/dist/providers/anthropic/index.d.ts +0 -1
  123. package/dist/providers/anthropic/index.js +0 -1
  124. package/dist/providers/azureOpenai.js +17 -15
  125. package/dist/providers/cloudflare.js +12 -21
  126. package/dist/providers/cohere.js +31 -25
  127. package/dist/providers/deepseek.js +23 -26
  128. package/dist/providers/fireworks.js +12 -21
  129. package/dist/providers/googleAiStudio/client.d.ts +2 -0
  130. package/dist/providers/googleAiStudio/client.js +39 -17
  131. package/dist/providers/googleAiStudio/index.d.ts +0 -1
  132. package/dist/providers/googleAiStudio/index.js +0 -1
  133. package/dist/providers/googleNativeGemini3/index.d.ts +0 -1
  134. package/dist/providers/googleNativeGemini3/index.js +0 -1
  135. package/dist/providers/googleVertex/client.d.ts +0 -51
  136. package/dist/providers/googleVertex/client.js +107 -777
  137. package/dist/providers/groq.js +19 -22
  138. package/dist/providers/huggingFace/client.d.ts +1 -1
  139. package/dist/providers/huggingFace/client.js +27 -25
  140. package/dist/providers/huggingFace/index.d.ts +0 -1
  141. package/dist/providers/huggingFace/index.js +0 -1
  142. package/dist/providers/jina.d.ts +0 -1
  143. package/dist/providers/jina.js +0 -1
  144. package/dist/providers/litellm/client.js +54 -39
  145. package/dist/providers/litellm/index.d.ts +0 -2
  146. package/dist/providers/litellm/index.js +0 -2
  147. package/dist/providers/llamaCpp.d.ts +1 -0
  148. package/dist/providers/llamaCpp.js +24 -18
  149. package/dist/providers/lmStudio.js +25 -42
  150. package/dist/providers/mistral.js +12 -24
  151. package/dist/providers/nvidiaNim/client.js +37 -34
  152. package/dist/providers/nvidiaNim/index.d.ts +0 -1
  153. package/dist/providers/nvidiaNim/index.js +0 -1
  154. package/dist/providers/ollama/client.js +51 -58
  155. package/dist/providers/ollama/index.d.ts +0 -1
  156. package/dist/providers/ollama/index.js +0 -1
  157. package/dist/providers/openAI/client.js +37 -40
  158. package/dist/providers/openAI/index.d.ts +0 -2
  159. package/dist/providers/openAI/index.js +0 -2
  160. package/dist/providers/openRouter/client.js +53 -47
  161. package/dist/providers/openRouter/utils.d.ts +0 -2
  162. package/dist/providers/openRouter/utils.js +0 -12
  163. package/dist/providers/openaiChatCompletionsBase.d.ts +9 -0
  164. package/dist/providers/openaiChatCompletionsBase.js +73 -16
  165. package/dist/providers/openaiCompatible/client.js +36 -32
  166. package/dist/providers/perplexity.d.ts +2 -1
  167. package/dist/providers/perplexity.js +14 -22
  168. package/dist/providers/replicate.d.ts +0 -1
  169. package/dist/providers/replicate.js +22 -9
  170. package/dist/providers/sagemaker/language-model.d.ts +2 -2
  171. package/dist/providers/togetherAi.js +12 -21
  172. package/dist/providers/voyage.d.ts +0 -1
  173. package/dist/providers/voyage.js +0 -1
  174. package/dist/providers/xai.js +17 -26
  175. package/dist/server/errors.d.ts +1 -1
  176. package/dist/server/errors.js +2 -2
  177. package/dist/server/index.d.ts +2 -2
  178. package/dist/server/index.js +5 -3
  179. package/dist/server/middleware/rateLimit.d.ts +0 -4
  180. package/dist/server/middleware/rateLimit.js +0 -4
  181. package/dist/types/errors.d.ts +35 -0
  182. package/dist/types/index.d.ts +0 -1
  183. package/dist/types/index.js +0 -1
  184. package/dist/types/providers.d.ts +66 -11
  185. package/dist/utils/errorClassifier.d.ts +30 -0
  186. package/dist/utils/errorClassifier.js +93 -0
  187. package/dist/utils/fileDetector.js +6 -43
  188. package/dist/utils/providerConfig.d.ts +0 -8
  189. package/dist/utils/providerConfig.js +0 -37
  190. package/dist/utils/providerHealth.d.ts +42 -7
  191. package/dist/utils/providerHealth.js +115 -122
  192. package/dist/utils/providerUtils.js +21 -87
  193. package/package.json +21 -75
  194. package/dist/lib/providers/anthropic/utils.d.ts +0 -7
  195. package/dist/lib/providers/anthropic/utils.js +0 -150
  196. package/dist/lib/providers/googleAiStudio/utils.d.ts +0 -2
  197. package/dist/lib/providers/googleAiStudio/utils.js +0 -19
  198. package/dist/lib/providers/googleNativeGemini3/constants.d.ts +0 -1
  199. package/dist/lib/providers/googleNativeGemini3/constants.js +0 -2
  200. package/dist/lib/providers/huggingFace/utils.d.ts +0 -2
  201. package/dist/lib/providers/huggingFace/utils.js +0 -8
  202. package/dist/lib/providers/index.d.ts +0 -33
  203. package/dist/lib/providers/index.js +0 -34
  204. package/dist/lib/providers/litellm/constants.d.ts +0 -1
  205. package/dist/lib/providers/litellm/constants.js +0 -3
  206. package/dist/lib/providers/litellm/utils.d.ts +0 -5
  207. package/dist/lib/providers/litellm/utils.js +0 -11
  208. package/dist/lib/providers/nvidiaNim/utils.d.ts +0 -9
  209. package/dist/lib/providers/nvidiaNim/utils.js +0 -101
  210. package/dist/lib/providers/ollama/utils.d.ts +0 -8
  211. package/dist/lib/providers/ollama/utils.js +0 -43
  212. package/dist/lib/providers/openAI/constants.d.ts +0 -1
  213. package/dist/lib/providers/openAI/constants.js +0 -3
  214. package/dist/lib/providers/openAI/utils.d.ts +0 -2
  215. package/dist/lib/providers/openAI/utils.js +0 -8
  216. package/dist/lib/types/universalProviderOptions.d.ts +0 -89
  217. package/dist/lib/types/universalProviderOptions.js +0 -55
  218. package/dist/providers/anthropic/utils.d.ts +0 -7
  219. package/dist/providers/anthropic/utils.js +0 -149
  220. package/dist/providers/googleAiStudio/utils.d.ts +0 -2
  221. package/dist/providers/googleAiStudio/utils.js +0 -18
  222. package/dist/providers/googleNativeGemini3/constants.d.ts +0 -1
  223. package/dist/providers/googleNativeGemini3/constants.js +0 -1
  224. package/dist/providers/huggingFace/utils.d.ts +0 -2
  225. package/dist/providers/huggingFace/utils.js +0 -7
  226. package/dist/providers/index.d.ts +0 -33
  227. package/dist/providers/index.js +0 -33
  228. package/dist/providers/litellm/constants.d.ts +0 -1
  229. package/dist/providers/litellm/constants.js +0 -2
  230. package/dist/providers/litellm/utils.d.ts +0 -5
  231. package/dist/providers/litellm/utils.js +0 -10
  232. package/dist/providers/nvidiaNim/utils.d.ts +0 -9
  233. package/dist/providers/nvidiaNim/utils.js +0 -100
  234. package/dist/providers/ollama/utils.d.ts +0 -8
  235. package/dist/providers/ollama/utils.js +0 -42
  236. package/dist/providers/openAI/constants.d.ts +0 -1
  237. package/dist/providers/openAI/constants.js +0 -2
  238. package/dist/providers/openAI/utils.d.ts +0 -2
  239. package/dist/providers/openAI/utils.js +0 -7
  240. package/dist/types/universalProviderOptions.d.ts +0 -89
  241. package/dist/types/universalProviderOptions.js +0 -54
@@ -1,6 +1,26 @@
1
1
  import { logger } from "../utils/logger.js";
2
+ import { PROVIDER_DESCRIPTORS, PROVIDER_DESCRIPTORS_BY_NAME, PROVIDER_ALIAS_INDEX, } from "./providerDescriptors.js";
2
3
  // Pure factory pattern with no hardcoded imports
3
4
  // All providers loaded dynamically via registry to avoid circular dependencies
5
+ /**
6
+ * Resolve a registered provider name (or alias) to its NeurolinkCredentials
7
+ * key. Backed by ProviderFactory.getDescriptor() — PROVIDER_DESCRIPTORS is
8
+ * the single source of truth for provider identity — instead of a
9
+ * hand-maintained map, so this can no longer drift out of sync with the
10
+ * descriptors, and it correctly resolves aliases (e.g. "hf") through
11
+ * PROVIDER_ALIAS_INDEX, not just canonical names. Falls back to the
12
+ * lowercased input when no descriptor is found, matching the retired
13
+ * map's behavior for unknown provider names.
14
+ *
15
+ * Referencing ProviderFactory here (defined further down this file) is
16
+ * safe: this function's body only runs when called, by which point the
17
+ * module has finished evaluating and ProviderFactory is fully defined —
18
+ * there is no temporal-dead-zone hazard from the declaration order.
19
+ */
20
+ export function resolveCredentialKey(providerName) {
21
+ const normalized = providerName.toLowerCase();
22
+ return (ProviderFactory.getDescriptor(normalized)?.credentialsKey ?? normalized);
23
+ }
4
24
  /**
5
25
  * True Factory Pattern implementation for AI Providers
6
26
  * Uses registration-based approach to eliminate switch statements
@@ -13,11 +33,12 @@ export class ProviderFactory {
13
33
  * Register a provider with the factory
14
34
  */
15
35
  static registerProvider(name, constructor, defaultModel, // Optional - provider can read from env
16
- aliases = []) {
36
+ aliases = [], descriptor) {
17
37
  const registration = {
18
38
  constructor,
19
39
  defaultModel,
20
40
  aliases,
41
+ descriptor,
21
42
  };
22
43
  // Register main name
23
44
  ProviderFactory.providers.set(name.toLowerCase(), registration);
@@ -58,21 +79,7 @@ export class ProviderFactory {
58
79
  // Fallback to registry default if no env var
59
80
  model = model || registration.defaultModel;
60
81
  }
61
- // Map registered provider names to NeurolinkCredentials keys.
62
- // Most names match (openai, anthropic, vertex, bedrock, etc.)
63
- // but every kebab-case provider whose canonical credentials key is
64
- // camelCase MUST be mapped here — otherwise per-call credential
65
- // overrides silently get dropped (the factory looks up
66
- // credentials["lm-studio"] which is undefined while the user wrote
67
- // credentials.lmStudio).
68
- const credentialKeyMap = {
69
- "google-ai": "googleAiStudio",
70
- "openai-compatible": "openaiCompatible",
71
- huggingface: "huggingFace",
72
- "lm-studio": "lmStudio",
73
- "nvidia-nim": "nvidiaNim",
74
- };
75
- const credKey = credentialKeyMap[normalizedName] ?? normalizedName;
82
+ const credKey = resolveCredentialKey(normalizedName);
76
83
  // Extract provider-scoped credential slice (e.g. credentials.openai for OpenAI)
77
84
  const scopedCredentials = credentials
78
85
  ? credentials[credKey]
@@ -81,30 +88,8 @@ export class ProviderFactory {
81
88
  if (typeof registration.constructor !== "function") {
82
89
  throw new Error(`Invalid constructor for provider ${providerName}: not a function`);
83
90
  }
84
- let result;
85
- try {
86
- const factoryResult = registration.constructor(model, resolvedProviderName, sdk, region, scopedCredentials);
87
- // Handle both sync and async results
88
- result =
89
- factoryResult instanceof Promise
90
- ? await factoryResult
91
- : factoryResult;
92
- }
93
- catch (factoryError) {
94
- if (registration.constructor.prototype &&
95
- registration.constructor.prototype.constructor ===
96
- registration.constructor) {
97
- try {
98
- result = new registration.constructor(model, resolvedProviderName, sdk, region, scopedCredentials);
99
- }
100
- catch (constructorError) {
101
- throw new Error(`Both factory function and constructor failed. Factory error: ${factoryError}. Constructor error: ${constructorError}`, { cause: constructorError });
102
- }
103
- }
104
- else {
105
- throw factoryError;
106
- }
107
- }
91
+ const factoryResult = registration.constructor(model, resolvedProviderName, sdk, region, scopedCredentials);
92
+ const result = factoryResult instanceof Promise ? await factoryResult : factoryResult;
108
93
  return result;
109
94
  }
110
95
  catch (error) {
@@ -130,16 +115,42 @@ export class ProviderFactory {
130
115
  static getProviderInfo(providerName) {
131
116
  return ProviderFactory.providers.get(providerName.toLowerCase());
132
117
  }
118
+ /**
119
+ * Look up a provider's static descriptor. Checks the built-in
120
+ * PROVIDER_DESCRIPTORS first (works even before registerAllProviders()
121
+ * has run, and resolves aliases via PROVIDER_ALIAS_INDEX), then falls
122
+ * back to whatever descriptor a live custom registration attached via
123
+ * registerProvider()'s 5th parameter.
124
+ */
125
+ static getDescriptor(name) {
126
+ const normalized = name.toLowerCase();
127
+ const canonical = PROVIDER_ALIAS_INDEX.get(normalized);
128
+ if (canonical) {
129
+ const builtIn = PROVIDER_DESCRIPTORS_BY_NAME.get(canonical);
130
+ if (builtIn) {
131
+ return builtIn;
132
+ }
133
+ }
134
+ return ProviderFactory.providers.get(normalized)?.descriptor;
135
+ }
136
+ /** All built-in provider descriptors (does not include custom-registered providers that lack a descriptor). */
137
+ static getAllDescriptors() {
138
+ return PROVIDER_DESCRIPTORS;
139
+ }
133
140
  /**
134
141
  * Normalize provider names using aliases (PHASE 1: Factory Pattern)
135
142
  */
136
143
  static normalizeProviderName(providerName) {
137
144
  const normalized = providerName.toLowerCase();
138
- // Check direct registration
139
145
  if (ProviderFactory.providers.has(normalized)) {
140
146
  return normalized;
141
147
  }
142
- // Check aliases from all registrations
148
+ const canonical = PROVIDER_ALIAS_INDEX.get(normalized);
149
+ if (canonical && ProviderFactory.providers.has(canonical)) {
150
+ return canonical;
151
+ }
152
+ // Fallback for providers registered without a built-in descriptor
153
+ // (e.g. TTS/STT/media handlers registered outside PROVIDER_DESCRIPTORS).
143
154
  for (const [name, registration] of ProviderFactory.providers.entries()) {
144
155
  if (registration.aliases?.includes(normalized)) {
145
156
  return name;
@@ -1,6 +1,7 @@
1
1
  import { ProviderFactory } from "./providerFactory.js";
2
2
  import { logger } from "../utils/logger.js";
3
3
  import { AIProviderName, GoogleAIModels, OpenAIModels, AnthropicModels, VertexModels, MistralModels, OllamaModels, LiteLLMModels, HuggingFaceModels, DeepSeekModels, NvidiaNimModels, OpenRouterModels, XaiModels, GroqModels, CohereModels, TogetherAIModels, FireworksModels, PerplexityModels, CloudflareModels, VoyageModels, JinaModels, StabilityModels, IdeogramModels, RecraftModels, ReplicateModels, } from "../constants/enums.js";
4
+ import { PROVIDER_DESCRIPTORS_BY_NAME } from "./providerDescriptors.js";
4
5
  /**
5
6
  * Provider Registry - registers all providers with the factory
6
7
  * This is where we migrate providers one by one to the new pattern
@@ -67,26 +68,26 @@ export class ProviderRegistry {
67
68
  const googleAiCreds = credentials;
68
69
  const { GoogleAIStudioProvider } = await import("../providers/googleAiStudio/index.js");
69
70
  return new GoogleAIStudioProvider(modelName, sdk, googleAiCreds);
70
- }, GoogleAIModels.GEMINI_2_5_FLASH, ["googleAiStudio", "google", "gemini", "google-ai", "google-ai-studio"]);
71
+ }, GoogleAIModels.GEMINI_2_5_FLASH, ["googleAiStudio", "google", "gemini", "google-ai", "google-ai-studio"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.GOOGLE_AI));
71
72
  // Register OpenAI provider
72
73
  ProviderFactory.registerProvider(AIProviderName.OPENAI, async (modelName, _providerName, sdk, _region, credentials) => {
73
74
  const openaiCreds = credentials;
74
75
  const { OpenAIProvider } = await import("../providers/openAI/index.js");
75
76
  return new OpenAIProvider(modelName, sdk, undefined, openaiCreds);
76
- }, OpenAIModels.GPT_4O_MINI, ["gpt", "chatgpt"]);
77
+ }, OpenAIModels.GPT_4O_MINI, ["gpt", "chatgpt"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.OPENAI));
77
78
  // Register Anthropic provider
78
79
  ProviderFactory.registerProvider(AIProviderName.ANTHROPIC, async (modelName, _providerName, sdk, _region, credentials) => {
79
80
  const anthropicCreds = credentials;
80
81
  const { AnthropicProvider } = await import("../providers/anthropic/index.js");
81
82
  return new AnthropicProvider(modelName, sdk, undefined, anthropicCreds);
82
- }, AnthropicModels.CLAUDE_SONNET_4_6, ["claude", "anthropic"]);
83
+ }, AnthropicModels.CLAUDE_SONNET_4_6, ["claude", "anthropic"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.ANTHROPIC));
83
84
  // Register Amazon Bedrock provider
84
85
  ProviderFactory.registerProvider(AIProviderName.BEDROCK, async (modelName, _providerName, sdk, region, credentials) => {
85
86
  const bedrockCreds = credentials;
86
87
  const { AmazonBedrockProvider } = await import("../providers/amazonBedrock/index.js");
87
88
  return new AmazonBedrockProvider(modelName, sdk, region, bedrockCreds);
88
89
  }, undefined, // Let provider read BEDROCK_MODEL from .env
89
- ["bedrock", "aws"]);
90
+ ["bedrock", "aws"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.BEDROCK));
90
91
  // Register Azure OpenAI provider
91
92
  ProviderFactory.registerProvider(AIProviderName.AZURE, async (modelName, _providerName, sdk, _region, credentials) => {
92
93
  const azureCreds = credentials;
@@ -96,45 +97,45 @@ export class ProviderRegistry {
96
97
  process.env.AZURE_OPENAI_MODEL ||
97
98
  process.env.AZURE_OPENAI_DEPLOYMENT ||
98
99
  process.env.AZURE_OPENAI_DEPLOYMENT_ID ||
99
- "gpt-4o-mini", ["azure", "azureOpenai"]);
100
+ "gpt-4o-mini", ["azure", "azureOpenai"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.AZURE));
100
101
  // Register Google Vertex AI provider
101
102
  ProviderFactory.registerProvider(AIProviderName.VERTEX, async (modelName, providerName, sdk, region, credentials) => {
102
103
  const vertexCreds = credentials;
103
104
  const { GoogleVertexProvider } = await import("../providers/googleVertex/index.js");
104
105
  return new GoogleVertexProvider(modelName, providerName, sdk, region, vertexCreds);
105
- }, VertexModels.CLAUDE_4_6_SONNET, ["vertex", "googleVertex"]);
106
+ }, VertexModels.CLAUDE_4_6_SONNET, ["vertex", "googleVertex"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.VERTEX));
106
107
  // Register Hugging Face provider (Unified Router implementation)
107
- ProviderFactory.registerProvider(AIProviderName.HUGGINGFACE, async (modelName, _providerName, _sdk, _region, credentials) => {
108
+ ProviderFactory.registerProvider(AIProviderName.HUGGINGFACE, async (modelName, _providerName, sdk, region, credentials) => {
108
109
  const hfCreds = credentials;
109
110
  const { HuggingFaceProvider } = await import("../providers/huggingFace/index.js");
110
- return new HuggingFaceProvider(modelName, undefined, hfCreds);
111
+ return new HuggingFaceProvider(modelName, sdk, region, hfCreds);
111
112
  }, process.env.HUGGINGFACE_MODEL ||
112
- HuggingFaceModels.QWEN_2_5_72B_INSTRUCT, ["huggingface", "hf"]);
113
+ HuggingFaceModels.QWEN_2_5_72B_INSTRUCT, ["huggingface", "hf"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.HUGGINGFACE));
113
114
  // Register Mistral AI provider
114
115
  ProviderFactory.registerProvider(AIProviderName.MISTRAL, async (modelName, _providerName, sdk, _region, credentials) => {
115
116
  const mistralCreds = credentials;
116
117
  const { MistralProvider } = await import("../providers/mistral.js");
117
118
  return new MistralProvider(modelName, sdk, undefined, mistralCreds);
118
- }, MistralModels.MISTRAL_LARGE_LATEST, ["mistral"]);
119
+ }, MistralModels.MISTRAL_LARGE_LATEST, ["mistral"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.MISTRAL));
119
120
  // Register Ollama provider
120
121
  ProviderFactory.registerProvider(AIProviderName.OLLAMA, async (modelName, _providerName, sdk, _region, credentials) => {
121
122
  const ollamaCreds = credentials;
122
123
  const { OllamaProvider } = await import("../providers/ollama/index.js");
123
124
  return new OllamaProvider(modelName, sdk, undefined, ollamaCreds);
124
- }, process.env.OLLAMA_MODEL || OllamaModels.LLAMA3_2_LATEST, ["ollama", "local"]);
125
+ }, process.env.OLLAMA_MODEL || OllamaModels.LLAMA3_2_LATEST, ["ollama", "local"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.OLLAMA));
125
126
  // Register LiteLLM provider
126
127
  ProviderFactory.registerProvider(AIProviderName.LITELLM, async (modelName, _providerName, sdk, _region, credentials) => {
127
128
  const litellmCreds = credentials;
128
129
  const { LiteLLMProvider } = await import("../providers/litellm/index.js");
129
130
  return new LiteLLMProvider(modelName, sdk, undefined, litellmCreds);
130
- }, process.env.LITELLM_MODEL || LiteLLMModels.OPENAI_GPT_4O_MINI, ["litellm"]);
131
+ }, process.env.LITELLM_MODEL || LiteLLMModels.OPENAI_GPT_4O_MINI, ["litellm"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.LITELLM));
131
132
  // Register OpenAI Compatible provider
132
133
  ProviderFactory.registerProvider(AIProviderName.OPENAI_COMPATIBLE, async (modelName, _providerName, sdk, _region, credentials) => {
133
134
  const openaiCompatCreds = credentials;
134
135
  const { OpenAICompatibleProvider } = await import("../providers/openaiCompatible/index.js");
135
136
  return new OpenAICompatibleProvider(modelName, sdk, undefined, openaiCompatCreds);
136
137
  }, process.env.OPENAI_COMPATIBLE_MODEL || undefined, // Enable auto-discovery when no model specified
137
- ["openai-compatible", "vllm", "compatible"]);
138
+ ["openai-compatible", "vllm", "compatible"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.OPENAI_COMPATIBLE));
138
139
  // Register OpenRouter provider (300+ models from 60+ providers)
139
140
  ProviderFactory.registerProvider(AIProviderName.OPENROUTER, async (modelName, _providerName, sdk, _region, credentials) => {
140
141
  const openrouterCreds = credentials;
@@ -146,117 +147,117 @@ export class ProviderRegistry {
146
147
  // for the rationale. Keep the three defaults aligned at the new
147
148
  // model (claude-sonnet-4.5) so the registry doesn't override the
148
149
  // provider's getDefault.
149
- process.env.OPENROUTER_MODEL || OpenRouterModels.CLAUDE_SONNET_4_5, ["openrouter", "or"]);
150
+ process.env.OPENROUTER_MODEL || OpenRouterModels.CLAUDE_SONNET_4_5, ["openrouter", "or"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.OPENROUTER));
150
151
  // Register Amazon SageMaker provider
151
152
  ProviderFactory.registerProvider(AIProviderName.SAGEMAKER, async (modelName, _providerName, _sdk, region, credentials) => {
152
153
  const sagemakerCreds = credentials;
153
154
  const { AmazonSageMakerProvider } = await import("../providers/amazonSagemaker.js");
154
155
  return new AmazonSageMakerProvider(modelName, undefined, region, undefined, sagemakerCreds);
155
- }, process.env.SAGEMAKER_MODEL || "sagemaker-model", ["sagemaker", "aws-sagemaker"]);
156
+ }, process.env.SAGEMAKER_MODEL || "sagemaker-model", ["sagemaker", "aws-sagemaker"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.SAGEMAKER));
156
157
  // Register DeepSeek provider
157
158
  ProviderFactory.registerProvider(AIProviderName.DEEPSEEK, async (modelName, _providerName, sdk, _region, credentials) => {
158
159
  const deepseekCreds = credentials;
159
160
  const { DeepSeekProvider } = await import("../providers/deepseek.js");
160
161
  return new DeepSeekProvider(modelName, sdk, undefined, deepseekCreds);
161
- }, process.env.DEEPSEEK_MODEL || DeepSeekModels.DEEPSEEK_CHAT, ["deepseek", "ds"]);
162
+ }, process.env.DEEPSEEK_MODEL || DeepSeekModels.DEEPSEEK_CHAT, ["deepseek", "ds"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.DEEPSEEK));
162
163
  // Register NVIDIA NIM provider
163
164
  ProviderFactory.registerProvider(AIProviderName.NVIDIA_NIM, async (modelName, _providerName, sdk, _region, credentials) => {
164
165
  const nimCreds = credentials;
165
166
  const { NvidiaNimProvider } = await import("../providers/nvidiaNim/index.js");
166
167
  return new NvidiaNimProvider(modelName, sdk, undefined, nimCreds);
167
- }, process.env.NVIDIA_NIM_MODEL || NvidiaNimModels.LLAMA_3_3_70B_INSTRUCT, ["nvidia", "nim", "nvidia-nim"]);
168
+ }, process.env.NVIDIA_NIM_MODEL || NvidiaNimModels.LLAMA_3_3_70B_INSTRUCT, ["nvidia", "nim", "nvidia-nim"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.NVIDIA_NIM));
168
169
  // Register LM Studio provider (local)
169
170
  ProviderFactory.registerProvider(AIProviderName.LM_STUDIO, async (modelName, _providerName, sdk, _region, credentials) => {
170
171
  const lmStudioCreds = credentials;
171
172
  const { LMStudioProvider } = await import("../providers/lmStudio.js");
172
173
  return new LMStudioProvider(modelName, sdk, undefined, lmStudioCreds);
173
- }, process.env.LM_STUDIO_MODEL || undefined, ["lmstudio", "lm-studio", "lms"]);
174
+ }, process.env.LM_STUDIO_MODEL || undefined, ["lmstudio", "lm-studio", "lms"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.LM_STUDIO));
174
175
  // Register llama.cpp provider (local)
175
176
  ProviderFactory.registerProvider(AIProviderName.LLAMACPP, async (modelName, _providerName, sdk, _region, credentials) => {
176
177
  const llamaCppCreds = credentials;
177
178
  const { LlamaCppProvider } = await import("../providers/llamaCpp.js");
178
179
  return new LlamaCppProvider(modelName, sdk, undefined, llamaCppCreds);
179
- }, process.env.LLAMACPP_MODEL || undefined, ["llamacpp", "llama.cpp", "llama-cpp"]);
180
+ }, process.env.LLAMACPP_MODEL || undefined, ["llamacpp", "llama.cpp", "llama-cpp"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.LLAMACPP));
180
181
  // Register xAI Grok provider
181
182
  ProviderFactory.registerProvider(AIProviderName.XAI, async (modelName, _providerName, sdk, _region, credentials) => {
182
183
  const xaiCreds = credentials;
183
184
  const { XaiProvider } = await import("../providers/xai.js");
184
185
  return new XaiProvider(modelName, sdk, undefined, xaiCreds);
185
- }, process.env.XAI_MODEL || XaiModels.GROK_3, ["xai", "grok"]);
186
+ }, process.env.XAI_MODEL || XaiModels.GROK_3, ["xai", "grok"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.XAI));
186
187
  // Register Groq provider
187
188
  ProviderFactory.registerProvider(AIProviderName.GROQ, async (modelName, _providerName, sdk, _region, credentials) => {
188
189
  const groqCreds = credentials;
189
190
  const { GroqProvider } = await import("../providers/groq.js");
190
191
  return new GroqProvider(modelName, sdk, undefined, groqCreds);
191
- }, process.env.GROQ_MODEL || GroqModels.LLAMA_3_3_70B_VERSATILE, ["groq"]);
192
+ }, process.env.GROQ_MODEL || GroqModels.LLAMA_3_3_70B_VERSATILE, ["groq"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.GROQ));
192
193
  // Register Cohere provider
193
194
  ProviderFactory.registerProvider(AIProviderName.COHERE, async (modelName, _providerName, sdk, _region, credentials) => {
194
195
  const cohereCreds = credentials;
195
196
  const { CohereProvider } = await import("../providers/cohere.js");
196
197
  return new CohereProvider(modelName, sdk, undefined, cohereCreds);
197
- }, process.env.COHERE_MODEL || CohereModels.COMMAND_R_PLUS, ["cohere"]);
198
+ }, process.env.COHERE_MODEL || CohereModels.COMMAND_R_PLUS, ["cohere"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.COHERE));
198
199
  // Register Together AI provider
199
200
  ProviderFactory.registerProvider(AIProviderName.TOGETHER_AI, async (modelName, _providerName, sdk, _region, credentials) => {
200
201
  const togetherCreds = credentials;
201
202
  const { TogetherAIProvider } = await import("../providers/togetherAi.js");
202
203
  return new TogetherAIProvider(modelName, sdk, undefined, togetherCreds);
203
204
  }, process.env.TOGETHER_MODEL ||
204
- TogetherAIModels.LLAMA_3_3_70B_INSTRUCT_TURBO, ["together-ai", "together"]);
205
+ TogetherAIModels.LLAMA_3_3_70B_INSTRUCT_TURBO, ["together-ai", "together"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.TOGETHER_AI));
205
206
  // Register Fireworks AI provider
206
207
  ProviderFactory.registerProvider(AIProviderName.FIREWORKS, async (modelName, _providerName, sdk, _region, credentials) => {
207
208
  const fireworksCreds = credentials;
208
209
  const { FireworksProvider } = await import("../providers/fireworks.js");
209
210
  return new FireworksProvider(modelName, sdk, undefined, fireworksCreds);
210
- }, process.env.FIREWORKS_MODEL || FireworksModels.DEEPSEEK_V4_PRO, ["fireworks"]);
211
+ }, process.env.FIREWORKS_MODEL || FireworksModels.DEEPSEEK_V4_PRO, ["fireworks"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.FIREWORKS));
211
212
  // Register Perplexity provider
212
213
  ProviderFactory.registerProvider(AIProviderName.PERPLEXITY, async (modelName, _providerName, sdk, _region, credentials) => {
213
214
  const perplexityCreds = credentials;
214
215
  const { PerplexityProvider } = await import("../providers/perplexity.js");
215
216
  return new PerplexityProvider(modelName, sdk, undefined, perplexityCreds);
216
- }, process.env.PERPLEXITY_MODEL || PerplexityModels.SONAR, ["perplexity", "pplx"]);
217
+ }, process.env.PERPLEXITY_MODEL || PerplexityModels.SONAR, ["perplexity", "pplx"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.PERPLEXITY));
217
218
  // Register Cloudflare Workers AI provider
218
219
  ProviderFactory.registerProvider(AIProviderName.CLOUDFLARE, async (modelName, _providerName, sdk, _region, credentials) => {
219
220
  const cloudflareCreds = credentials;
220
221
  const { CloudflareProvider } = await import("../providers/cloudflare.js");
221
222
  return new CloudflareProvider(modelName, sdk, undefined, cloudflareCreds);
222
- }, process.env.CLOUDFLARE_MODEL || CloudflareModels.LLAMA_3_3_70B_FAST, ["cloudflare", "workers-ai", "cf-ai"]);
223
+ }, process.env.CLOUDFLARE_MODEL || CloudflareModels.LLAMA_3_3_70B_FAST, ["cloudflare", "workers-ai", "cf-ai"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.CLOUDFLARE));
223
224
  // Register Voyage AI embeddings provider
224
225
  ProviderFactory.registerProvider(AIProviderName.VOYAGE, async (modelName, _providerName, sdk, _region, credentials) => {
225
226
  const voyageCreds = credentials;
226
227
  const { VoyageProvider } = await import("../providers/voyage.js");
227
228
  return new VoyageProvider(modelName, sdk, undefined, voyageCreds);
228
- }, process.env.VOYAGE_MODEL || VoyageModels.VOYAGE_3_5, ["voyage", "voyage-ai"]);
229
+ }, process.env.VOYAGE_MODEL || VoyageModels.VOYAGE_3_5, ["voyage", "voyage-ai"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.VOYAGE));
229
230
  // Register Jina AI embeddings + reranking provider
230
231
  ProviderFactory.registerProvider(AIProviderName.JINA, async (modelName, _providerName, sdk, _region, credentials) => {
231
232
  const jinaCreds = credentials;
232
233
  const { JinaProvider } = await import("../providers/jina.js");
233
234
  return new JinaProvider(modelName, sdk, undefined, jinaCreds);
234
- }, process.env.JINA_MODEL || JinaModels.JINA_EMBEDDINGS_V3, ["jina", "jina-ai"]);
235
+ }, process.env.JINA_MODEL || JinaModels.JINA_EMBEDDINGS_V3, ["jina", "jina-ai"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.JINA));
235
236
  // Register Stability AI image-gen provider
236
237
  ProviderFactory.registerProvider(AIProviderName.STABILITY, async (modelName, _providerName, sdk, _region, credentials) => {
237
238
  const stabilityCreds = credentials;
238
239
  const { StabilityProvider } = await import("../providers/stability.js");
239
240
  return new StabilityProvider(modelName, sdk, undefined, stabilityCreds);
240
- }, process.env.STABILITY_MODEL || StabilityModels.STABLE_IMAGE_ULTRA, ["stability", "stability-ai", "sd"]);
241
+ }, process.env.STABILITY_MODEL || StabilityModels.STABLE_IMAGE_ULTRA, ["stability", "stability-ai", "sd"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.STABILITY));
241
242
  // Register Ideogram image-gen provider
242
243
  ProviderFactory.registerProvider(AIProviderName.IDEOGRAM, async (modelName, _providerName, sdk, _region, credentials) => {
243
244
  const ideogramCreds = credentials;
244
245
  const { IdeogramProvider } = await import("../providers/ideogram.js");
245
246
  return new IdeogramProvider(modelName, sdk, undefined, ideogramCreds);
246
- }, process.env.IDEOGRAM_MODEL || IdeogramModels.IDEOGRAM_V3, ["ideogram"]);
247
+ }, process.env.IDEOGRAM_MODEL || IdeogramModels.IDEOGRAM_V3, ["ideogram"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.IDEOGRAM));
247
248
  // Register Replicate LLM provider (multi-modal — also serves video /
248
249
  // avatar / music handlers via dedicated processors registered below)
249
250
  ProviderFactory.registerProvider(AIProviderName.REPLICATE, async (modelName, _providerName, sdk, _region, credentials) => {
250
251
  const replicateCreds = credentials;
251
252
  const { ReplicateProvider } = await import("../providers/replicate.js");
252
253
  return new ReplicateProvider(modelName, sdk, undefined, replicateCreds);
253
- }, process.env.REPLICATE_MODEL || ReplicateModels.LLAMA_3_70B_INSTRUCT, ["replicate"]);
254
+ }, process.env.REPLICATE_MODEL || ReplicateModels.LLAMA_3_70B_INSTRUCT, ["replicate"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.REPLICATE));
254
255
  // Register Recraft image-gen provider
255
256
  ProviderFactory.registerProvider(AIProviderName.RECRAFT, async (modelName, _providerName, sdk, _region, credentials) => {
256
257
  const recraftCreds = credentials;
257
258
  const { RecraftProvider } = await import("../providers/recraft.js");
258
259
  return new RecraftProvider(modelName, sdk, undefined, recraftCreds);
259
- }, process.env.RECRAFT_MODEL || RecraftModels.RECRAFT_V3, ["recraft"]);
260
+ }, process.env.RECRAFT_MODEL || RecraftModels.RECRAFT_V3, ["recraft"], PROVIDER_DESCRIPTORS_BY_NAME.get(AIProviderName.RECRAFT));
260
261
  logger.debug("All AI providers registered successfully");
261
262
  // ===== TTS HANDLER REGISTRATION =====
262
263
  try {
package/dist/index.d.ts CHANGED
@@ -33,6 +33,8 @@
33
33
  */
34
34
  import { AIProviderFactory } from "./core/factory.js";
35
35
  export { AIProviderFactory };
36
+ export { ProviderFactory } from "./factories/providerFactory.js";
37
+ export { PROVIDER_DESCRIPTORS, PROVIDER_DESCRIPTORS_BY_NAME, PROVIDER_ALIAS_INDEX, } from "./factories/providerDescriptors.js";
36
38
  export { NeuroLinkConfigManager as ConfigManager } from "./config/configManager.js";
37
39
  export { BaseFactory, BaseRegistry, NeuroLinkFeatureError, createErrorFactory, withRetry, TypedEventEmitter, } from "./core/infrastructure/index.js";
38
40
  export { NeuroLinkClient, createClient, NeuroLinkApiError, } from "./client/httpClient.js";
@@ -396,7 +398,14 @@ export { classifyProviderError, ModelPool, createDefaultRequestRouter, Classifie
396
398
  * await server.start();
397
399
  * ```
398
400
  */
399
- export { AgentExecuteRequestSchema, AlreadyRunningError, AuthenticationError, AuthorizationError, BaseServerAdapter, ConfigurationError, createAgentRoutes, createAgentWebSocketHandler, createAllRoutes, createAuthMiddleware, createCacheInvalidator, createCacheMiddleware, createCompressionMiddleware, createDataStreamResponse, createDataStreamWriter, createErrorHandlingMiddleware, createErrorResponse, createFieldValidator, createHealthRoutes, createLoggingMiddleware, createMCPRoutes, createMemoryRoutes, createNDJSONHeaders, createOpenAPIGenerator, createRateLimitMiddleware, createRequestIdMiddleware, createRequestValidationMiddleware, createRoleMiddleware, createSecurityHeadersMiddleware, createServer, createSlidingWindowRateLimitMiddleware, createSSEHeaders, createTimingMiddleware, createToolRoutes, ErrorCategory, ErrorRecoveryStrategies, ErrorSeverity, ExpressServerAdapter, FastifyServerAdapter, generateOpenAPIFromConfig, generateOpenAPISpec, HandlerError, HonoServerAdapter, InMemoryCacheStore, InMemoryRateLimitStore, InvalidAuthenticationError, KoaServerAdapter, MissingDependencyError, NotRunningError, pipeAsyncIterableToDataStream, RateLimitError, RouteConflictError, RouteNotFoundError, registerAllRoutes, ServerAdapterError, ServerAdapterErrorCode, ServerAdapterFactory, ServerNameParamSchema, ServerRateLimitError, ServerStartError, ServerStopError, ServerValidationError, SessionIdParamSchema, StreamAbortedError, StreamingError, TimeoutError, ToolArgumentsSchema, ToolExecuteRequestSchema, ToolNameParamSchema, ToolSearchQuerySchema, ValidationError, validateParams, validateQuery, validateRequest, WebSocketConnectionError, WebSocketConnectionManager, WebSocketError, WebSocketMessageRouter, wrapError, } from "./server/index.js";
401
+ export { AgentExecuteRequestSchema, AlreadyRunningError, BaseServerAdapter, ConfigurationError, createAgentRoutes, createAgentWebSocketHandler, createAllRoutes, createAuthMiddleware, createCacheInvalidator, createCacheMiddleware, createCompressionMiddleware, createDataStreamResponse, createDataStreamWriter, createErrorHandlingMiddleware, createErrorResponse, createFieldValidator, createHealthRoutes, createLoggingMiddleware, createMCPRoutes, createMemoryRoutes, createNDJSONHeaders, createOpenAPIGenerator, createRateLimitMiddleware, createRequestIdMiddleware, createRequestValidationMiddleware, createRoleMiddleware, createSecurityHeadersMiddleware, createServer, createSlidingWindowRateLimitMiddleware, createSSEHeaders, createTimingMiddleware, createToolRoutes, ErrorCategory, ErrorRecoveryStrategies, ErrorSeverity, ExpressServerAdapter, FastifyServerAdapter, generateOpenAPIFromConfig, generateOpenAPISpec, HandlerError, HonoServerAdapter, InMemoryCacheStore, InMemoryRateLimitStore, InvalidAuthenticationError, KoaServerAdapter, MissingDependencyError, NotRunningError, pipeAsyncIterableToDataStream, RouteConflictError, RouteNotFoundError, registerAllRoutes, ServerAdapterError, ServerAdapterErrorCode, ServerAdapterFactory, ServerAuthenticationError, ServerAuthorizationError, ServerNameParamSchema, ServerRateLimitError, ServerStartError, ServerStopError, ServerTimeoutError, ServerValidationError, SessionIdParamSchema, StreamAbortedError, StreamingError, ToolArgumentsSchema, ToolExecuteRequestSchema, ToolNameParamSchema, ToolSearchQuerySchema, ValidationError, validateParams, validateQuery, validateRequest, WebSocketConnectionError, WebSocketConnectionManager, WebSocketError, WebSocketMessageRouter, wrapError, } from "./server/index.js";
402
+ /**
403
+ * @deprecated Use `ServerTimeoutError` instead — renamed to end the naming
404
+ * collision with the canonical `utils/timeout.ts` `TimeoutError`. Kept as an
405
+ * alias so existing callers importing `TimeoutError` from `@juspay/neurolink`
406
+ * are not broken.
407
+ */
408
+ export { ServerTimeoutError as TimeoutError } from "./server/index.js";
400
409
  /**
401
410
  * RAG (Retrieval-Augmented Generation) Document Processing
402
411
  *
package/dist/index.js CHANGED
@@ -34,6 +34,9 @@
34
34
  // Core exports
35
35
  import { AIProviderFactory } from "./core/factory.js";
36
36
  export { AIProviderFactory };
37
+ // Provider descriptor exports (single source of truth for provider identity)
38
+ export { ProviderFactory } from "./factories/providerFactory.js";
39
+ export { PROVIDER_DESCRIPTORS, PROVIDER_DESCRIPTORS_BY_NAME, PROVIDER_ALIAS_INDEX, } from "./factories/providerDescriptors.js";
37
40
  // Config Manager export
38
41
  export { NeuroLinkConfigManager as ConfigManager } from "./config/configManager.js";
39
42
  // Core Infrastructure exports (factory + registry patterns)
@@ -613,7 +616,7 @@ export { classifyProviderError, ModelPool, createDefaultRequestRouter, Classifie
613
616
  */
614
617
  export {
615
618
  // Validation
616
- AgentExecuteRequestSchema, AlreadyRunningError, AuthenticationError, AuthorizationError,
619
+ AgentExecuteRequestSchema, AlreadyRunningError,
617
620
  // Framework Adapters
618
621
  BaseServerAdapter, ConfigurationError,
619
622
  // Routes
@@ -627,11 +630,18 @@ createServer, createSlidingWindowRateLimitMiddleware, createSSEHeaders, createTi
627
630
  // Error Constants
628
631
  ErrorCategory, ErrorRecoveryStrategies, ErrorSeverity, ExpressServerAdapter, FastifyServerAdapter, generateOpenAPIFromConfig, generateOpenAPISpec, HandlerError, HonoServerAdapter, InMemoryCacheStore, InMemoryRateLimitStore, InvalidAuthenticationError, KoaServerAdapter, MissingDependencyError, NotRunningError,
629
632
  // OpenAPI
630
- pipeAsyncIterableToDataStream, RateLimitError, RouteConflictError, RouteNotFoundError, registerAllRoutes,
633
+ pipeAsyncIterableToDataStream, RouteConflictError, RouteNotFoundError, registerAllRoutes,
631
634
  // Errors
632
- ServerAdapterError, ServerAdapterErrorCode, ServerAdapterFactory, ServerNameParamSchema, ServerRateLimitError, ServerStartError, ServerStopError, ServerValidationError, SessionIdParamSchema, StreamAbortedError, StreamingError, TimeoutError, ToolArgumentsSchema, ToolExecuteRequestSchema, ToolNameParamSchema, ToolSearchQuerySchema, ValidationError, validateParams, validateQuery, validateRequest, WebSocketConnectionError,
635
+ ServerAdapterError, ServerAdapterErrorCode, ServerAdapterFactory, ServerAuthenticationError, ServerAuthorizationError, ServerNameParamSchema, ServerRateLimitError, ServerStartError, ServerStopError, ServerTimeoutError, ServerValidationError, SessionIdParamSchema, StreamAbortedError, StreamingError, ToolArgumentsSchema, ToolExecuteRequestSchema, ToolNameParamSchema, ToolSearchQuerySchema, ValidationError, validateParams, validateQuery, validateRequest, WebSocketConnectionError,
633
636
  // WebSocket
634
637
  WebSocketConnectionManager, WebSocketError, WebSocketMessageRouter, wrapError, } from "./server/index.js";
638
+ /**
639
+ * @deprecated Use `ServerTimeoutError` instead — renamed to end the naming
640
+ * collision with the canonical `utils/timeout.ts` `TimeoutError`. Kept as an
641
+ * alias so existing callers importing `TimeoutError` from `@juspay/neurolink`
642
+ * are not broken.
643
+ */
644
+ export { ServerTimeoutError as TimeoutError } from "./server/index.js";
635
645
  // ============================================================================
636
646
  // RAG DOCUMENT PROCESSING - Retrieval-Augmented Generation
637
647
  // ============================================================================
@@ -1,6 +1,6 @@
1
1
  import { context, SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
2
2
  import { directAgentTools } from "../agent/directTools.js";
3
- import { IMAGE_GENERATION_MODELS } from "../core/constants.js";
3
+ import { isImageGenerationModel } from "../core/constants.js";
4
4
  import { MiddlewareFactory } from "../middleware/factory.js";
5
5
  import { modelSupports } from "../models/modelRegistry.js";
6
6
  import { ATTR, tracers } from "../telemetry/index.js";
@@ -195,7 +195,7 @@ export class BaseProvider {
195
195
  // Skip this path when the caller explicitly requests non-image output (e.g.
196
196
  // JSON analysis) so dual-mode models like gemini-3.1-flash-image-preview
197
197
  // can still perform text/structured generation.
198
- const isImageModel = IMAGE_GENERATION_MODELS.some((m) => this.modelName.includes(m));
198
+ const isImageModel = isImageGenerationModel(this.modelName);
199
199
  const requestsNonImageOutput = options.output?.format === "json" ||
200
200
  options.output?.format === "structured" ||
201
201
  options.output?.format === "text";
@@ -966,7 +966,7 @@ export class BaseProvider {
966
966
  if (options.output?.mode === "video") {
967
967
  return await this.handleVideoGeneration(options, startTime);
968
968
  }
969
- const isImageModel = IMAGE_GENERATION_MODELS.some((m) => this.modelName.includes(m));
969
+ const isImageModel = isImageGenerationModel(this.modelName);
970
970
  const requestsNonImageOutput = options.output?.format === "json" ||
971
971
  options.output?.format === "structured" ||
972
972
  options.output?.format === "text";
@@ -1,4 +1,4 @@
1
- import type { DynamicModelConfig as ModelConfig } from "../types/index.js";
1
+ import { type DynamicModelConfig as ModelConfig } from "../types/index.js";
2
2
  /**
3
3
  * Dynamic Model Provider
4
4
  * Loads and manages model configurations from external sources
@@ -1,28 +1,6 @@
1
- import { z } from "zod";
2
1
  import { isAbortError } from "../utils/errorHandling.js";
3
2
  import { logger } from "../utils/logger.js";
4
- /**
5
- * Model configuration schema for validation
6
- */
7
- const ModelConfigSchema = z.object({
8
- id: z.string(),
9
- displayName: z.string(),
10
- capabilities: z.array(z.string()),
11
- deprecated: z.boolean(),
12
- pricing: z.object({
13
- input: z.number(),
14
- output: z.number(),
15
- }),
16
- contextWindow: z.number(),
17
- releaseDate: z.string(),
18
- });
19
- const ModelRegistrySchema = z.object({
20
- version: z.string(),
21
- lastUpdated: z.string(),
22
- models: z.record(z.string(), z.record(z.string(), ModelConfigSchema)),
23
- aliases: z.record(z.string(), z.string()).optional(),
24
- defaults: z.record(z.string(), z.string()).optional(),
25
- });
3
+ import { ModelRegistrySchema, } from "../types/index.js";
26
4
  /**
27
5
  * Dynamic Model Provider
28
6
  * Loads and manages model configurations from external sources
@@ -4,7 +4,7 @@
4
4
  * Replaces hardcoded model-specific logic with configurable, runtime-updateable configurations.
5
5
  * This addresses GitHub Copilot review comment about making model-specific logic configuration-based.
6
6
  */
7
- import type { ModelTier, ProviderConfiguration, ConfigSource } from "../types/index.js";
7
+ import type { ModelTier, ProviderConfiguration } from "../types/index.js";
8
8
  /**
9
9
  * Model name constants - extracted from hardcoded values for better maintainability
10
10
  * These constants can be overridden by environment variables
@@ -153,53 +153,6 @@ export declare class ModelConfigurationManager {
153
153
  * Get all provider configurations
154
154
  */
155
155
  getAllConfigurations(): Map<string, ProviderConfiguration>;
156
- /**
157
- * Update provider configuration (runtime updates)
158
- */
159
- updateProviderConfiguration(provider: string, config: ProviderConfiguration): void;
160
- /**
161
- * Parse YAML content with basic support
162
- * For full YAML support, would need a proper YAML library
163
- */
164
- private parseYAMLContent;
165
- /**
166
- * Convert simple YAML to JSON object
167
- * Handles basic key-value pairs only
168
- */
169
- private convertSimpleYAMLToJSON;
170
- /**
171
- * Process a single YAML line
172
- * Returns key-value pair if valid, null otherwise
173
- */
174
- private processYAMLLine;
175
- /**
176
- * Convert YAML value to appropriate JavaScript type
177
- */
178
- private convertYAMLValue;
179
- /**
180
- * Load configurations from external source
181
- */
182
- loadConfigurationsFromFile(configPath: string): void;
183
- /**
184
- * Validate provider configuration structure
185
- */
186
- private isValidProviderConfiguration;
187
- /**
188
- * Apply model name overrides from configuration file
189
- */
190
- private applyModelNameOverrides;
191
- /**
192
- * Apply global default configurations
193
- */
194
- private applyGlobalDefaults;
195
- /**
196
- * Get configuration metadata
197
- */
198
- getConfigurationMeta(): {
199
- source: ConfigSource;
200
- lastUpdated: number;
201
- providerCount: number;
202
- };
203
156
  /**
204
157
  * Get model for specific tier and provider
205
158
  */
@@ -224,25 +177,3 @@ export declare class ModelConfigurationManager {
224
177
  * Global instance accessor
225
178
  */
226
179
  export declare const modelConfig: ModelConfigurationManager;
227
- /**
228
- * Convenience functions for common operations
229
- */
230
- /**
231
- * Get provider configuration (backwards compatible)
232
- */
233
- export declare function getProviderConfiguration(provider: string): ProviderConfiguration | null;
234
- /**
235
- * Get model for tier (backwards compatible)
236
- */
237
- export declare function getModelForTier(provider: string, tier: ModelTier): string | null;
238
- /**
239
- * Get cost information (backwards compatible)
240
- */
241
- export declare function getCostInfo(provider: string, model?: string): {
242
- input: number;
243
- output: number;
244
- } | null;
245
- /**
246
- * Check provider availability (backwards compatible)
247
- */
248
- export declare function isProviderAvailable(provider: string): boolean;