@juspay/neurolink 9.64.0 → 9.65.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 (322) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +18 -17
  3. package/dist/adapters/providerImageAdapter.js +29 -1
  4. package/dist/adapters/replicate/auth.d.ts +19 -0
  5. package/dist/adapters/replicate/auth.js +32 -0
  6. package/dist/adapters/replicate/predictionLifecycle.d.ts +46 -0
  7. package/dist/adapters/replicate/predictionLifecycle.js +283 -0
  8. package/dist/adapters/video/klingVideoHandler.d.ts +37 -0
  9. package/dist/adapters/video/klingVideoHandler.js +305 -0
  10. package/dist/adapters/video/replicateVideoHandler.d.ts +29 -0
  11. package/dist/adapters/video/replicateVideoHandler.js +157 -0
  12. package/dist/adapters/video/runwayVideoHandler.d.ts +32 -0
  13. package/dist/adapters/video/runwayVideoHandler.js +316 -0
  14. package/dist/adapters/video/vertexVideoHandler.d.ts +19 -1
  15. package/dist/adapters/video/vertexVideoHandler.js +33 -9
  16. package/dist/autoresearch/runner.js +8 -2
  17. package/dist/avatar/index.d.ts +13 -0
  18. package/dist/avatar/index.js +13 -0
  19. package/dist/avatar/providers/DIDAvatar.d.ts +49 -0
  20. package/dist/avatar/providers/DIDAvatar.js +501 -0
  21. package/dist/avatar/providers/HeyGenAvatar.d.ts +30 -0
  22. package/dist/avatar/providers/HeyGenAvatar.js +337 -0
  23. package/dist/avatar/providers/ReplicateAvatar.d.ts +36 -0
  24. package/dist/avatar/providers/ReplicateAvatar.js +267 -0
  25. package/dist/browser/neurolink.min.js +633 -610
  26. package/dist/cli/commands/mcp.js +29 -0
  27. package/dist/cli/commands/proxy.js +24 -5
  28. package/dist/cli/factories/commandFactory.d.ts +11 -1
  29. package/dist/cli/factories/commandFactory.js +291 -38
  30. package/dist/constants/contextWindows.js +101 -0
  31. package/dist/constants/enums.d.ts +273 -2
  32. package/dist/constants/enums.js +290 -1
  33. package/dist/constants/videoErrors.d.ts +4 -0
  34. package/dist/constants/videoErrors.js +4 -0
  35. package/dist/core/baseProvider.d.ts +22 -2
  36. package/dist/core/baseProvider.js +217 -11
  37. package/dist/core/constants.d.ts +11 -0
  38. package/dist/core/constants.js +69 -1
  39. package/dist/core/redisConversationMemoryManager.js +6 -0
  40. package/dist/evaluation/index.d.ts +2 -0
  41. package/dist/evaluation/index.js +4 -0
  42. package/dist/factories/providerFactory.js +7 -1
  43. package/dist/factories/providerRegistry.js +202 -5
  44. package/dist/features/ppt/contentPlanner.js +42 -14
  45. package/dist/index.d.ts +9 -1
  46. package/dist/index.js +16 -1
  47. package/dist/lib/adapters/providerImageAdapter.js +29 -1
  48. package/dist/lib/adapters/replicate/auth.d.ts +19 -0
  49. package/dist/lib/adapters/replicate/auth.js +33 -0
  50. package/dist/lib/adapters/replicate/predictionLifecycle.d.ts +46 -0
  51. package/dist/lib/adapters/replicate/predictionLifecycle.js +284 -0
  52. package/dist/lib/adapters/video/klingVideoHandler.d.ts +37 -0
  53. package/dist/lib/adapters/video/klingVideoHandler.js +306 -0
  54. package/dist/lib/adapters/video/replicateVideoHandler.d.ts +29 -0
  55. package/dist/lib/adapters/video/replicateVideoHandler.js +158 -0
  56. package/dist/lib/adapters/video/runwayVideoHandler.d.ts +32 -0
  57. package/dist/lib/adapters/video/runwayVideoHandler.js +317 -0
  58. package/dist/lib/adapters/video/vertexVideoHandler.d.ts +19 -1
  59. package/dist/lib/adapters/video/vertexVideoHandler.js +33 -9
  60. package/dist/lib/autoresearch/runner.js +8 -2
  61. package/dist/lib/avatar/index.d.ts +13 -0
  62. package/dist/lib/avatar/index.js +14 -0
  63. package/dist/lib/avatar/providers/DIDAvatar.d.ts +49 -0
  64. package/dist/lib/avatar/providers/DIDAvatar.js +502 -0
  65. package/dist/lib/avatar/providers/HeyGenAvatar.d.ts +30 -0
  66. package/dist/lib/avatar/providers/HeyGenAvatar.js +338 -0
  67. package/dist/lib/avatar/providers/ReplicateAvatar.d.ts +36 -0
  68. package/dist/lib/avatar/providers/ReplicateAvatar.js +268 -0
  69. package/dist/lib/constants/contextWindows.js +101 -0
  70. package/dist/lib/constants/enums.d.ts +273 -2
  71. package/dist/lib/constants/enums.js +290 -1
  72. package/dist/lib/constants/videoErrors.d.ts +4 -0
  73. package/dist/lib/constants/videoErrors.js +4 -0
  74. package/dist/lib/core/baseProvider.d.ts +22 -2
  75. package/dist/lib/core/baseProvider.js +217 -11
  76. package/dist/lib/core/constants.d.ts +11 -0
  77. package/dist/lib/core/constants.js +69 -1
  78. package/dist/lib/core/redisConversationMemoryManager.js +6 -0
  79. package/dist/lib/evaluation/index.d.ts +2 -0
  80. package/dist/lib/evaluation/index.js +4 -0
  81. package/dist/lib/factories/providerFactory.js +7 -1
  82. package/dist/lib/factories/providerRegistry.js +202 -5
  83. package/dist/lib/features/ppt/contentPlanner.js +42 -14
  84. package/dist/lib/index.d.ts +9 -1
  85. package/dist/lib/index.js +16 -1
  86. package/dist/lib/middleware/builtin/lifecycle.js +39 -9
  87. package/dist/lib/music/index.d.ts +13 -0
  88. package/dist/lib/music/index.js +14 -0
  89. package/dist/lib/music/providers/BeatovenMusic.d.ts +31 -0
  90. package/dist/lib/music/providers/BeatovenMusic.js +334 -0
  91. package/dist/lib/music/providers/ElevenLabsMusic.d.ts +30 -0
  92. package/dist/lib/music/providers/ElevenLabsMusic.js +169 -0
  93. package/dist/lib/music/providers/LyriaMusic.d.ts +29 -0
  94. package/dist/lib/music/providers/LyriaMusic.js +173 -0
  95. package/dist/lib/music/providers/ReplicateMusic.d.ts +31 -0
  96. package/dist/lib/music/providers/ReplicateMusic.js +262 -0
  97. package/dist/lib/neurolink.d.ts +30 -0
  98. package/dist/lib/neurolink.js +323 -77
  99. package/dist/lib/providers/amazonBedrock.d.ts +10 -0
  100. package/dist/lib/providers/amazonBedrock.js +94 -39
  101. package/dist/lib/providers/anthropic.js +55 -7
  102. package/dist/lib/providers/anthropicBaseProvider.js +1 -1
  103. package/dist/lib/providers/azureOpenai.js +66 -17
  104. package/dist/lib/providers/cloudflare.d.ts +35 -0
  105. package/dist/lib/providers/cloudflare.js +174 -0
  106. package/dist/lib/providers/cohere.d.ts +52 -0
  107. package/dist/lib/providers/cohere.js +253 -0
  108. package/dist/lib/providers/deepseek.js +72 -17
  109. package/dist/lib/providers/fireworks.d.ts +33 -0
  110. package/dist/lib/providers/fireworks.js +164 -0
  111. package/dist/lib/providers/googleAiStudio.js +45 -6
  112. package/dist/lib/providers/googleNativeGemini3.d.ts +24 -1
  113. package/dist/lib/providers/googleNativeGemini3.js +173 -21
  114. package/dist/lib/providers/googleVertex.js +173 -17
  115. package/dist/lib/providers/groq.d.ts +33 -0
  116. package/dist/lib/providers/groq.js +181 -0
  117. package/dist/lib/providers/huggingFace.js +9 -8
  118. package/dist/lib/providers/ideogram.d.ts +34 -0
  119. package/dist/lib/providers/ideogram.js +184 -0
  120. package/dist/lib/providers/index.d.ts +13 -0
  121. package/dist/lib/providers/index.js +13 -0
  122. package/dist/lib/providers/jina.d.ts +59 -0
  123. package/dist/lib/providers/jina.js +218 -0
  124. package/dist/lib/providers/llamaCpp.js +14 -46
  125. package/dist/lib/providers/lmStudio.js +14 -47
  126. package/dist/lib/providers/mistral.js +7 -7
  127. package/dist/lib/providers/nvidiaNim.js +160 -19
  128. package/dist/lib/providers/ollama.js +7 -7
  129. package/dist/lib/providers/openAI.d.ts +22 -1
  130. package/dist/lib/providers/openAI.js +181 -0
  131. package/dist/lib/providers/openRouter.js +35 -23
  132. package/dist/lib/providers/openaiCompatible.js +9 -8
  133. package/dist/lib/providers/perplexity.d.ts +33 -0
  134. package/dist/lib/providers/perplexity.js +179 -0
  135. package/dist/lib/providers/recraft.d.ts +34 -0
  136. package/dist/lib/providers/recraft.js +197 -0
  137. package/dist/lib/providers/replicate.d.ts +75 -0
  138. package/dist/lib/providers/replicate.js +403 -0
  139. package/dist/lib/providers/stability.d.ts +37 -0
  140. package/dist/lib/providers/stability.js +191 -0
  141. package/dist/lib/providers/togetherAi.d.ts +33 -0
  142. package/dist/lib/providers/togetherAi.js +176 -0
  143. package/dist/lib/providers/voyage.d.ts +47 -0
  144. package/dist/lib/providers/voyage.js +177 -0
  145. package/dist/lib/providers/xai.d.ts +33 -0
  146. package/dist/lib/providers/xai.js +172 -0
  147. package/dist/lib/telemetry/index.d.ts +1 -1
  148. package/dist/lib/telemetry/index.js +1 -1
  149. package/dist/lib/telemetry/tracers.d.ts +19 -0
  150. package/dist/lib/telemetry/tracers.js +19 -0
  151. package/dist/lib/telemetry/withSpan.d.ts +35 -0
  152. package/dist/lib/telemetry/withSpan.js +103 -0
  153. package/dist/lib/types/avatar.d.ts +143 -0
  154. package/dist/lib/types/avatar.js +20 -0
  155. package/dist/lib/types/cli.d.ts +6 -0
  156. package/dist/lib/types/generate.d.ts +62 -5
  157. package/dist/lib/types/index.d.ts +5 -0
  158. package/dist/lib/types/index.js +7 -0
  159. package/dist/lib/types/middleware.d.ts +27 -0
  160. package/dist/lib/types/multimodal.d.ts +35 -2
  161. package/dist/lib/types/music.d.ts +165 -0
  162. package/dist/lib/types/music.js +21 -0
  163. package/dist/lib/types/providers.d.ts +144 -1
  164. package/dist/lib/types/replicate.d.ts +67 -0
  165. package/dist/lib/types/replicate.js +10 -0
  166. package/dist/lib/types/safeFetch.d.ts +15 -0
  167. package/dist/lib/types/safeFetch.js +7 -0
  168. package/dist/lib/types/stream.d.ts +2 -1
  169. package/dist/lib/types/tools.d.ts +13 -0
  170. package/dist/lib/types/video.d.ts +89 -0
  171. package/dist/lib/types/video.js +15 -0
  172. package/dist/lib/utils/avatarProcessor.d.ts +68 -0
  173. package/dist/lib/utils/avatarProcessor.js +172 -0
  174. package/dist/lib/utils/cloneOptions.d.ts +36 -0
  175. package/dist/lib/utils/cloneOptions.js +62 -0
  176. package/dist/lib/utils/lifecycleCallbacks.d.ts +51 -8
  177. package/dist/lib/utils/lifecycleCallbacks.js +82 -26
  178. package/dist/lib/utils/lifecycleTimeout.d.ts +25 -0
  179. package/dist/lib/utils/lifecycleTimeout.js +39 -0
  180. package/dist/lib/utils/logSanitize.d.ts +49 -0
  181. package/dist/lib/utils/logSanitize.js +170 -0
  182. package/dist/lib/utils/loggingFetch.d.ts +29 -0
  183. package/dist/lib/utils/loggingFetch.js +60 -0
  184. package/dist/lib/utils/messageBuilder.js +43 -25
  185. package/dist/lib/utils/modelChoices.js +236 -3
  186. package/dist/lib/utils/musicProcessor.d.ts +67 -0
  187. package/dist/lib/utils/musicProcessor.js +189 -0
  188. package/dist/lib/utils/optionsConversion.js +3 -2
  189. package/dist/lib/utils/parameterValidation.js +14 -4
  190. package/dist/lib/utils/pricing.js +193 -0
  191. package/dist/lib/utils/providerConfig.d.ts +55 -0
  192. package/dist/lib/utils/providerConfig.js +224 -0
  193. package/dist/lib/utils/safeFetch.d.ts +26 -0
  194. package/dist/lib/utils/safeFetch.js +83 -0
  195. package/dist/lib/utils/sizeGuard.d.ts +34 -0
  196. package/dist/lib/utils/sizeGuard.js +45 -0
  197. package/dist/lib/utils/ssrfGuard.d.ts +52 -0
  198. package/dist/lib/utils/ssrfGuard.js +411 -0
  199. package/dist/lib/utils/videoProcessor.d.ts +60 -0
  200. package/dist/lib/utils/videoProcessor.js +201 -0
  201. package/dist/lib/voice/providers/FishAudioTTS.d.ts +27 -0
  202. package/dist/lib/voice/providers/FishAudioTTS.js +183 -0
  203. package/dist/lib/workflow/core/ensembleExecutor.js +26 -9
  204. package/dist/middleware/builtin/lifecycle.js +39 -9
  205. package/dist/music/index.d.ts +13 -0
  206. package/dist/music/index.js +13 -0
  207. package/dist/music/providers/BeatovenMusic.d.ts +31 -0
  208. package/dist/music/providers/BeatovenMusic.js +333 -0
  209. package/dist/music/providers/ElevenLabsMusic.d.ts +30 -0
  210. package/dist/music/providers/ElevenLabsMusic.js +168 -0
  211. package/dist/music/providers/LyriaMusic.d.ts +29 -0
  212. package/dist/music/providers/LyriaMusic.js +172 -0
  213. package/dist/music/providers/ReplicateMusic.d.ts +31 -0
  214. package/dist/music/providers/ReplicateMusic.js +261 -0
  215. package/dist/neurolink.d.ts +30 -0
  216. package/dist/neurolink.js +323 -77
  217. package/dist/providers/amazonBedrock.d.ts +10 -0
  218. package/dist/providers/amazonBedrock.js +94 -39
  219. package/dist/providers/anthropic.js +55 -7
  220. package/dist/providers/anthropicBaseProvider.js +1 -1
  221. package/dist/providers/azureOpenai.js +66 -17
  222. package/dist/providers/cloudflare.d.ts +35 -0
  223. package/dist/providers/cloudflare.js +173 -0
  224. package/dist/providers/cohere.d.ts +52 -0
  225. package/dist/providers/cohere.js +252 -0
  226. package/dist/providers/deepseek.js +72 -17
  227. package/dist/providers/fireworks.d.ts +33 -0
  228. package/dist/providers/fireworks.js +163 -0
  229. package/dist/providers/googleAiStudio.js +45 -6
  230. package/dist/providers/googleNativeGemini3.d.ts +24 -1
  231. package/dist/providers/googleNativeGemini3.js +173 -21
  232. package/dist/providers/googleVertex.js +173 -17
  233. package/dist/providers/groq.d.ts +33 -0
  234. package/dist/providers/groq.js +180 -0
  235. package/dist/providers/huggingFace.js +9 -8
  236. package/dist/providers/ideogram.d.ts +34 -0
  237. package/dist/providers/ideogram.js +183 -0
  238. package/dist/providers/index.d.ts +13 -0
  239. package/dist/providers/index.js +13 -0
  240. package/dist/providers/jina.d.ts +59 -0
  241. package/dist/providers/jina.js +217 -0
  242. package/dist/providers/llamaCpp.js +14 -46
  243. package/dist/providers/lmStudio.js +14 -47
  244. package/dist/providers/mistral.js +7 -7
  245. package/dist/providers/nvidiaNim.js +160 -19
  246. package/dist/providers/ollama.js +7 -7
  247. package/dist/providers/openAI.d.ts +22 -1
  248. package/dist/providers/openAI.js +181 -0
  249. package/dist/providers/openRouter.js +35 -23
  250. package/dist/providers/openaiCompatible.js +9 -8
  251. package/dist/providers/perplexity.d.ts +33 -0
  252. package/dist/providers/perplexity.js +178 -0
  253. package/dist/providers/recraft.d.ts +34 -0
  254. package/dist/providers/recraft.js +196 -0
  255. package/dist/providers/replicate.d.ts +75 -0
  256. package/dist/providers/replicate.js +402 -0
  257. package/dist/providers/stability.d.ts +37 -0
  258. package/dist/providers/stability.js +190 -0
  259. package/dist/providers/togetherAi.d.ts +33 -0
  260. package/dist/providers/togetherAi.js +175 -0
  261. package/dist/providers/voyage.d.ts +47 -0
  262. package/dist/providers/voyage.js +176 -0
  263. package/dist/providers/xai.d.ts +33 -0
  264. package/dist/providers/xai.js +171 -0
  265. package/dist/telemetry/index.d.ts +1 -1
  266. package/dist/telemetry/index.js +1 -1
  267. package/dist/telemetry/tracers.d.ts +19 -0
  268. package/dist/telemetry/tracers.js +19 -0
  269. package/dist/telemetry/withSpan.d.ts +35 -0
  270. package/dist/telemetry/withSpan.js +103 -0
  271. package/dist/types/avatar.d.ts +143 -0
  272. package/dist/types/avatar.js +19 -0
  273. package/dist/types/cli.d.ts +6 -0
  274. package/dist/types/generate.d.ts +62 -5
  275. package/dist/types/index.d.ts +5 -0
  276. package/dist/types/index.js +7 -0
  277. package/dist/types/middleware.d.ts +27 -0
  278. package/dist/types/multimodal.d.ts +35 -2
  279. package/dist/types/music.d.ts +165 -0
  280. package/dist/types/music.js +20 -0
  281. package/dist/types/providers.d.ts +144 -1
  282. package/dist/types/replicate.d.ts +67 -0
  283. package/dist/types/replicate.js +9 -0
  284. package/dist/types/safeFetch.d.ts +15 -0
  285. package/dist/types/safeFetch.js +6 -0
  286. package/dist/types/stream.d.ts +2 -1
  287. package/dist/types/tools.d.ts +13 -0
  288. package/dist/types/video.d.ts +89 -0
  289. package/dist/types/video.js +14 -0
  290. package/dist/utils/avatarProcessor.d.ts +68 -0
  291. package/dist/utils/avatarProcessor.js +171 -0
  292. package/dist/utils/cloneOptions.d.ts +36 -0
  293. package/dist/utils/cloneOptions.js +61 -0
  294. package/dist/utils/lifecycleCallbacks.d.ts +51 -8
  295. package/dist/utils/lifecycleCallbacks.js +82 -26
  296. package/dist/utils/lifecycleTimeout.d.ts +25 -0
  297. package/dist/utils/lifecycleTimeout.js +38 -0
  298. package/dist/utils/logSanitize.d.ts +49 -0
  299. package/dist/utils/logSanitize.js +169 -0
  300. package/dist/utils/loggingFetch.d.ts +29 -0
  301. package/dist/utils/loggingFetch.js +59 -0
  302. package/dist/utils/messageBuilder.js +43 -25
  303. package/dist/utils/modelChoices.js +236 -3
  304. package/dist/utils/musicProcessor.d.ts +67 -0
  305. package/dist/utils/musicProcessor.js +188 -0
  306. package/dist/utils/optionsConversion.js +3 -2
  307. package/dist/utils/parameterValidation.js +14 -4
  308. package/dist/utils/pricing.js +193 -0
  309. package/dist/utils/providerConfig.d.ts +55 -0
  310. package/dist/utils/providerConfig.js +224 -0
  311. package/dist/utils/safeFetch.d.ts +26 -0
  312. package/dist/utils/safeFetch.js +82 -0
  313. package/dist/utils/sizeGuard.d.ts +34 -0
  314. package/dist/utils/sizeGuard.js +44 -0
  315. package/dist/utils/ssrfGuard.d.ts +52 -0
  316. package/dist/utils/ssrfGuard.js +410 -0
  317. package/dist/utils/videoProcessor.d.ts +60 -0
  318. package/dist/utils/videoProcessor.js +200 -0
  319. package/dist/voice/providers/FishAudioTTS.d.ts +27 -0
  320. package/dist/voice/providers/FishAudioTTS.js +182 -0
  321. package/dist/workflow/core/ensembleExecutor.js +26 -9
  322. package/package.json +32 -5
@@ -0,0 +1,191 @@
1
+ import { StabilityModels } from "../constants/enums.js";
2
+ import { BaseProvider } from "../core/baseProvider.js";
3
+ import { isNeuroLink } from "../neurolink.js";
4
+ import { createProxyFetch } from "../proxy/proxyFetch.js";
5
+ import { AuthenticationError, InvalidModelError, ProviderError, RateLimitError, } from "../types/index.js";
6
+ import { logger } from "../utils/logger.js";
7
+ import { getProviderModel } from "../utils/providerConfig.js";
8
+ const STABILITY_DEFAULT_BASE_URL = "https://api.stability.ai";
9
+ const REQUEST_TIMEOUT_MS = 120_000;
10
+ /**
11
+ * Returns the Stability AI API key from env vars, or `undefined` when none
12
+ * is set. The constructor stores `undefined` instead of throwing so that
13
+ * callers who only supply per-call credentials via `options.credentials` can
14
+ * still instantiate the provider. Validation is deferred to the actual
15
+ * call site inside `executeImageGeneration`.
16
+ */
17
+ const getStabilityApiKeyOptional = () => (process.env.STABILITY_API_KEY ??
18
+ process.env.STABILITY_AI_API_KEY ??
19
+ "").trim() || undefined;
20
+ const getDefaultStabilityModel = () => getProviderModel("STABILITY_MODEL", StabilityModels.STABLE_IMAGE_ULTRA);
21
+ /**
22
+ * Stability AI Provider — direct image generation.
23
+ *
24
+ * Hits api.stability.ai/v2beta/stable-image/generate/{model}. Returns
25
+ * base64 PNG. No chat / streaming / tool calling.
26
+ *
27
+ * The constructor no longer throws when `STABILITY_API_KEY` is absent so
28
+ * that per-call credentials (passed via `options.credentials.stability`) can
29
+ * be used without requiring a global env var at startup.
30
+ *
31
+ * @see https://platform.stability.ai/docs/api-reference
32
+ */
33
+ export class StabilityProvider extends BaseProvider {
34
+ apiKey;
35
+ baseURL;
36
+ proxyFetch;
37
+ constructor(modelName, sdk, _region, credentials) {
38
+ const validatedNeurolink = isNeuroLink(sdk) ? sdk : undefined;
39
+ super(modelName, "stability", validatedNeurolink);
40
+ const overrideKey = credentials?.apiKey?.trim();
41
+ this.apiKey =
42
+ overrideKey && overrideKey.length > 0
43
+ ? overrideKey
44
+ : getStabilityApiKeyOptional();
45
+ this.baseURL =
46
+ credentials?.baseURL ??
47
+ process.env.STABILITY_BASE_URL ??
48
+ STABILITY_DEFAULT_BASE_URL;
49
+ this.proxyFetch = createProxyFetch();
50
+ logger.debug("Stability AI Provider initialized (image-gen only)", {
51
+ modelName: this.modelName,
52
+ baseURL: this.baseURL,
53
+ });
54
+ }
55
+ getProviderName() {
56
+ return this.providerName;
57
+ }
58
+ getDefaultModel() {
59
+ return getDefaultStabilityModel();
60
+ }
61
+ supportsTools() {
62
+ return false;
63
+ }
64
+ getAISDKModel() {
65
+ throw new Error("Stability AI is an image-generation-only provider; chat completions are not available.");
66
+ }
67
+ async executeStream(_options, _analysisSchema) {
68
+ throw new Error("Stability AI is an image-generation-only provider; streaming chat is not available. Use generate({output:{format:'binary'}}) with a Stable Image / SD 3.5 model.");
69
+ }
70
+ formatProviderError(error) {
71
+ const message = error instanceof Error
72
+ ? error.message
73
+ : typeof error === "string"
74
+ ? error
75
+ : "Unknown error";
76
+ if (message.includes("401") ||
77
+ message.toLowerCase().includes("unauthorized")) {
78
+ return new AuthenticationError("Invalid Stability AI API key. Get one at https://platform.stability.ai/account/keys", "stability");
79
+ }
80
+ if (message.includes("429") ||
81
+ message.toLowerCase().includes("rate limit")) {
82
+ return new RateLimitError("Stability AI rate limit exceeded. Back off and retry.", "stability");
83
+ }
84
+ if (message.includes("content_filtered") ||
85
+ message.includes("CONTENT_FILTERED")) {
86
+ return new ProviderError("Stability AI declined the request due to content policy. Adjust the prompt and retry.", "stability");
87
+ }
88
+ if (message.includes("404")) {
89
+ return new InvalidModelError(`Stability AI model '${this.modelName}' not found. Use stable-image-ultra, stable-image-core, sd3.5-large, sd3.5-large-turbo, or sd3.5-medium.`, "stability");
90
+ }
91
+ return new ProviderError(`Stability AI error: ${message}`, "stability");
92
+ }
93
+ async executeImageGeneration(options) {
94
+ const startTime = Date.now();
95
+ // Resolve per-call credentials first, then fall back to instance-level.
96
+ const perCallCreds = options.credentials?.stability;
97
+ const resolvedApiKey = perCallCreds?.apiKey?.trim() || this.apiKey;
98
+ if (!resolvedApiKey) {
99
+ throw new Error("Stability AI API key is required. Set STABILITY_API_KEY or pass credentials.stability.apiKey per-call.");
100
+ }
101
+ const effectiveApiKey = resolvedApiKey;
102
+ const effectiveBaseURL = perCallCreds?.baseURL || this.baseURL;
103
+ const prompt = options.prompt ?? options.input?.text ?? "";
104
+ if (!prompt.trim()) {
105
+ throw new Error("Stability AI image generation requires a prompt (input.text or prompt)");
106
+ }
107
+ // Stability's URL slugs are `ultra` / `core` / `sd3` — not the user-facing
108
+ // `stable-image-ultra` / `stable-image-core` model identifiers we expose
109
+ // via StabilityModels. Map both shapes onto the actual path here.
110
+ const modelPath = this.modelName.startsWith("sd3.5-")
111
+ ? "sd3"
112
+ : this.modelName === "stable-image-ultra"
113
+ ? "ultra"
114
+ : this.modelName === "stable-image-core"
115
+ ? "core"
116
+ : this.modelName;
117
+ // Image-gen extras live in `output` / image-specific fields. Cast
118
+ // to a permissive shape so we can read aspectRatio / negativePrompt
119
+ // / seed without polluting TextGenerationOptions.
120
+ const extras = options;
121
+ const form = new FormData();
122
+ form.append("prompt", prompt);
123
+ form.append("output_format", "png");
124
+ if (extras.aspectRatio) {
125
+ form.append("aspect_ratio", String(extras.aspectRatio));
126
+ }
127
+ if (extras.negativePrompt) {
128
+ form.append("negative_prompt", extras.negativePrompt);
129
+ }
130
+ if (this.modelName.startsWith("sd3.5-")) {
131
+ form.append("model", this.modelName);
132
+ }
133
+ if (extras.seed !== undefined) {
134
+ form.append("seed", String(extras.seed));
135
+ }
136
+ const controller = new AbortController();
137
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
138
+ let response;
139
+ try {
140
+ response = await this.proxyFetch(`${effectiveBaseURL}/v2beta/stable-image/generate/${modelPath}`, {
141
+ method: "POST",
142
+ headers: {
143
+ Authorization: `Bearer ${effectiveApiKey}`,
144
+ Accept: "application/json", // base64 in body
145
+ },
146
+ body: form,
147
+ signal: controller.signal,
148
+ });
149
+ }
150
+ catch (err) {
151
+ if (err instanceof Error && err.name === "AbortError") {
152
+ throw this.formatProviderError(new Error(`Stability image-gen request timed out after ${REQUEST_TIMEOUT_MS / 1000}s`));
153
+ }
154
+ throw this.formatProviderError(err);
155
+ }
156
+ finally {
157
+ clearTimeout(timeoutId);
158
+ }
159
+ if (!response.ok) {
160
+ const text = await response.text();
161
+ throw this.formatProviderError(new Error(`Stability image-gen failed: ${response.status} — ${text}`));
162
+ }
163
+ const data = (await response.json());
164
+ if (!data.image) {
165
+ throw new Error(`Stability AI returned no image (finish_reason: ${data.finish_reason ?? "unknown"})`);
166
+ }
167
+ const generationTimeMs = Date.now() - startTime;
168
+ logger.info(`[StabilityProvider] Generated image (${data.image.length} base64 chars) in ${generationTimeMs}ms — model ${this.modelName}`);
169
+ return {
170
+ content: prompt,
171
+ provider: this.providerName,
172
+ model: this.modelName,
173
+ // output: 1000 = sentinel for per-image pricing (see pricing.ts)
174
+ usage: { input: 0, output: 1000, total: 1000 },
175
+ imageOutput: { base64: data.image },
176
+ };
177
+ }
178
+ async validateConfiguration() {
179
+ return this.apiKey !== undefined && this.apiKey.trim().length > 0;
180
+ }
181
+ getConfiguration() {
182
+ return {
183
+ provider: this.providerName,
184
+ model: this.modelName,
185
+ defaultModel: getDefaultStabilityModel(),
186
+ baseURL: this.baseURL,
187
+ };
188
+ }
189
+ }
190
+ export default StabilityProvider;
191
+ //# sourceMappingURL=stability.js.map
@@ -0,0 +1,33 @@
1
+ import { type LanguageModel } from "ai";
2
+ import type { AIProviderName } from "../constants/enums.js";
3
+ import { BaseProvider } from "../core/baseProvider.js";
4
+ import type { NeurolinkCredentials, StreamOptions, StreamResult, ValidationSchema } from "../types/index.js";
5
+ /**
6
+ * Together AI Provider
7
+ *
8
+ * Hosted open-model gateway at api.together.xyz/v1 (OpenAI-compatible).
9
+ * Llama / Mistral / Qwen / DeepSeek / Gemma / WizardLM available
10
+ * server-less; pass any catalog id via `--model`.
11
+ *
12
+ * @see https://docs.together.ai/docs/openai-api-compatibility
13
+ */
14
+ export declare class TogetherAIProvider extends BaseProvider {
15
+ private model;
16
+ private apiKey;
17
+ private baseURL;
18
+ constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["together"]);
19
+ protected executeStream(options: StreamOptions, _analysisSchema?: ValidationSchema): Promise<StreamResult>;
20
+ private executeStreamInner;
21
+ protected getProviderName(): AIProviderName;
22
+ protected getDefaultModel(): string;
23
+ protected getAISDKModel(): LanguageModel;
24
+ protected formatProviderError(error: unknown): Error;
25
+ validateConfiguration(): Promise<boolean>;
26
+ getConfiguration(): {
27
+ provider: AIProviderName;
28
+ model: string;
29
+ defaultModel: string;
30
+ baseURL: string;
31
+ };
32
+ }
33
+ export default TogetherAIProvider;
@@ -0,0 +1,176 @@
1
+ import { createOpenAI } from "@ai-sdk/openai";
2
+ import { stepCountIs, streamText } from "ai";
3
+ import { TogetherAIModels } from "../constants/enums.js";
4
+ import { BaseProvider } from "../core/baseProvider.js";
5
+ import { DEFAULT_MAX_STEPS } from "../core/constants.js";
6
+ import { streamAnalyticsCollector } from "../core/streamAnalytics.js";
7
+ import { isNeuroLink } from "../neurolink.js";
8
+ import { createLoggingFetch } from "../utils/loggingFetch.js";
9
+ import { tracers, ATTR, withClientStreamSpan } from "../telemetry/index.js";
10
+ import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
11
+ import { logger } from "../utils/logger.js";
12
+ import { createTogetherAIConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
13
+ import { composeAbortSignals, createTimeoutController, TimeoutError, } from "../utils/timeout.js";
14
+ import { emitToolEndFromStepFinish } from "../utils/toolEndEmitter.js";
15
+ import { resolveToolChoice } from "../utils/toolChoice.js";
16
+ import { toAnalyticsStreamResult } from "./providerTypeUtils.js";
17
+ const TOGETHER_DEFAULT_BASE_URL = "https://api.together.xyz/v1";
18
+ const getTogetherApiKey = () => validateApiKey(createTogetherAIConfig());
19
+ const getDefaultTogetherModel = () => getProviderModel("TOGETHER_MODEL", TogetherAIModels.LLAMA_3_3_70B_INSTRUCT_TURBO);
20
+ /**
21
+ * Together AI Provider
22
+ *
23
+ * Hosted open-model gateway at api.together.xyz/v1 (OpenAI-compatible).
24
+ * Llama / Mistral / Qwen / DeepSeek / Gemma / WizardLM available
25
+ * server-less; pass any catalog id via `--model`.
26
+ *
27
+ * @see https://docs.together.ai/docs/openai-api-compatibility
28
+ */
29
+ export class TogetherAIProvider extends BaseProvider {
30
+ model;
31
+ apiKey;
32
+ baseURL;
33
+ constructor(modelName, sdk, _region, credentials) {
34
+ const validatedNeurolink = isNeuroLink(sdk) ? sdk : undefined;
35
+ super(modelName, "together-ai", validatedNeurolink);
36
+ const overrideApiKey = credentials?.apiKey?.trim();
37
+ this.apiKey =
38
+ overrideApiKey && overrideApiKey.length > 0
39
+ ? overrideApiKey
40
+ : getTogetherApiKey();
41
+ this.baseURL =
42
+ credentials?.baseURL ??
43
+ process.env.TOGETHER_BASE_URL ??
44
+ TOGETHER_DEFAULT_BASE_URL;
45
+ const together = createOpenAI({
46
+ apiKey: this.apiKey,
47
+ baseURL: this.baseURL,
48
+ fetch: createLoggingFetch("together-ai"),
49
+ });
50
+ this.model = together.chat(this.modelName);
51
+ logger.debug("Together AI Provider initialized", {
52
+ modelName: this.modelName,
53
+ providerName: this.providerName,
54
+ baseURL: this.baseURL,
55
+ });
56
+ }
57
+ async executeStream(options, _analysisSchema) {
58
+ return withClientStreamSpan({
59
+ name: "neurolink.provider.stream",
60
+ tracer: tracers.provider,
61
+ attributes: {
62
+ [ATTR.GEN_AI_SYSTEM]: "together-ai",
63
+ [ATTR.GEN_AI_MODEL]: this.modelName,
64
+ [ATTR.GEN_AI_OPERATION]: "stream",
65
+ [ATTR.NL_STREAM_MODE]: true,
66
+ },
67
+ }, async () => this.executeStreamInner(options), (r) => r.stream, (r, wrapped) => ({ ...r, stream: wrapped }));
68
+ }
69
+ async executeStreamInner(options) {
70
+ this.validateStreamOptions(options);
71
+ // Resolve per-call credentials first, then fall back to instance-level.
72
+ const perCallCreds = options.credentials?.together;
73
+ const effectiveApiKey = perCallCreds?.apiKey?.trim() || this.apiKey;
74
+ const effectiveBaseURL = perCallCreds?.baseURL || this.baseURL;
75
+ const startTime = Date.now();
76
+ const timeout = this.getTimeout(options);
77
+ const timeoutController = createTimeoutController(timeout, this.providerName, "stream");
78
+ try {
79
+ const shouldUseTools = !options.disableTools && this.supportsTools();
80
+ const tools = shouldUseTools
81
+ ? options.tools || (await this.getAllTools())
82
+ : {};
83
+ const messages = await this.buildMessagesForStream(options);
84
+ // When per-call credentials differ from instance, build a fresh client.
85
+ const hasDifferentCreds = effectiveApiKey !== this.apiKey || effectiveBaseURL !== this.baseURL;
86
+ const model = hasDifferentCreds
87
+ ? createOpenAI({
88
+ apiKey: effectiveApiKey,
89
+ baseURL: effectiveBaseURL,
90
+ fetch: createLoggingFetch("together-ai"),
91
+ }).chat(this.modelName)
92
+ : await this.getAISDKModelWithMiddleware(options);
93
+ const result = await streamText({
94
+ model,
95
+ messages,
96
+ temperature: options.temperature,
97
+ maxOutputTokens: options.maxTokens,
98
+ tools,
99
+ stopWhen: stepCountIs(options.maxSteps || DEFAULT_MAX_STEPS),
100
+ toolChoice: resolveToolChoice(options, tools, shouldUseTools),
101
+ abortSignal: composeAbortSignals(options.abortSignal, timeoutController?.controller.signal),
102
+ experimental_telemetry: this.telemetryHandler.getTelemetryConfig(options),
103
+ experimental_repairToolCall: this.getToolCallRepairFn(options),
104
+ onStepFinish: ({ toolCalls, toolResults }) => {
105
+ emitToolEndFromStepFinish(this.neurolink?.getEventEmitter(), toolResults);
106
+ this.handleToolExecutionStorage(toolCalls, toolResults, options, new Date()).catch((error) => {
107
+ logger.warn("[TogetherAIProvider] Failed to store tool executions", {
108
+ provider: this.providerName,
109
+ error: error instanceof Error ? error.message : String(error),
110
+ });
111
+ });
112
+ },
113
+ });
114
+ timeoutController?.cleanup();
115
+ const transformedStream = this.createTextStream(result);
116
+ const analyticsPromise = streamAnalyticsCollector.createAnalytics(this.providerName, this.modelName, toAnalyticsStreamResult(result), Date.now() - startTime, {
117
+ requestId: `together-stream-${Date.now()}`,
118
+ streamingMode: true,
119
+ });
120
+ return {
121
+ stream: transformedStream,
122
+ provider: this.providerName,
123
+ model: this.modelName,
124
+ analytics: analyticsPromise,
125
+ metadata: { startTime, streamId: `together-${Date.now()}` },
126
+ };
127
+ }
128
+ catch (error) {
129
+ timeoutController?.cleanup();
130
+ throw this.handleProviderError(error);
131
+ }
132
+ }
133
+ getProviderName() {
134
+ return this.providerName;
135
+ }
136
+ getDefaultModel() {
137
+ return getDefaultTogetherModel();
138
+ }
139
+ getAISDKModel() {
140
+ return this.model;
141
+ }
142
+ formatProviderError(error) {
143
+ if (error instanceof TimeoutError) {
144
+ return new NetworkError(`Request timed out: ${error.message}`, "together-ai");
145
+ }
146
+ const errorRecord = error;
147
+ const message = typeof errorRecord?.message === "string"
148
+ ? errorRecord.message
149
+ : "Unknown error";
150
+ if (message.includes("Invalid API key") ||
151
+ message.includes("Authentication") ||
152
+ message.includes("401")) {
153
+ return new AuthenticationError("Invalid Together AI API key. Get one at https://api.together.xyz/settings/api-keys", "together-ai");
154
+ }
155
+ if (message.includes("rate limit") || message.includes("429")) {
156
+ return new RateLimitError("Together AI rate limit exceeded. Back off and retry.", "together-ai");
157
+ }
158
+ if (message.includes("model_not_found") || message.includes("404")) {
159
+ return new InvalidModelError(`Together AI model '${this.modelName}' not found. Browse the catalog at https://api.together.xyz/models`, "together-ai");
160
+ }
161
+ return new ProviderError(`Together AI error: ${message}`, "together-ai");
162
+ }
163
+ async validateConfiguration() {
164
+ return typeof this.apiKey === "string" && this.apiKey.trim().length > 0;
165
+ }
166
+ getConfiguration() {
167
+ return {
168
+ provider: this.providerName,
169
+ model: this.modelName,
170
+ defaultModel: getDefaultTogetherModel(),
171
+ baseURL: this.baseURL,
172
+ };
173
+ }
174
+ }
175
+ export default TogetherAIProvider;
176
+ //# sourceMappingURL=togetherAi.js.map
@@ -0,0 +1,47 @@
1
+ import type { LanguageModel } from "ai";
2
+ import type { AIProviderName } from "../constants/enums.js";
3
+ import { BaseProvider } from "../core/baseProvider.js";
4
+ import type { NeurolinkCredentials, StreamOptions, StreamResult, ValidationSchema } from "../types/index.js";
5
+ /**
6
+ * Voyage AI Provider — embedding-only.
7
+ *
8
+ * Top-tier RAG embedder. Native API at api.voyageai.com/v1/embeddings.
9
+ * Chat / streaming / tool calling are not supported — `executeStream` and
10
+ * `getAISDKModel` throw a friendly error so callers get an actionable
11
+ * message instead of a runtime crash deep in the streaming layer.
12
+ *
13
+ * @see https://docs.voyageai.com/docs/embeddings
14
+ */
15
+ export declare class VoyageProvider extends BaseProvider {
16
+ private readonly apiKey;
17
+ private readonly baseURL;
18
+ private readonly proxyFetch;
19
+ constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["voyage"]);
20
+ protected getProviderName(): AIProviderName;
21
+ protected getDefaultModel(): string;
22
+ supportsTools(): boolean;
23
+ protected getDefaultEmbeddingModel(): string | undefined;
24
+ /**
25
+ * Voyage is embedding-only — chat models do not exist on this endpoint.
26
+ * Caller surface stays consistent: returns an `AbortError`-shaped failure
27
+ * via `BaseProvider.handleProviderError`, not a TypeScript-level cast.
28
+ */
29
+ protected getAISDKModel(): LanguageModel;
30
+ protected executeStream(_options: StreamOptions, _analysisSchema?: ValidationSchema): Promise<StreamResult>;
31
+ protected formatProviderError(error: unknown): Error;
32
+ embed(text: string, modelName?: string): Promise<number[]>;
33
+ embedMany(texts: string[], modelName?: string): Promise<number[][]>;
34
+ /**
35
+ * POST /embeddings — Voyage accepts up to 128 inputs per request.
36
+ * Caller batches above that (see `embedMany`).
37
+ */
38
+ private callEmbeddings;
39
+ validateConfiguration(): Promise<boolean>;
40
+ getConfiguration(): {
41
+ provider: AIProviderName;
42
+ model: string;
43
+ defaultModel: string;
44
+ baseURL: string;
45
+ };
46
+ }
47
+ export default VoyageProvider;
@@ -0,0 +1,177 @@
1
+ import { VoyageModels } from "../constants/enums.js";
2
+ import { BaseProvider } from "../core/baseProvider.js";
3
+ import { isNeuroLink } from "../neurolink.js";
4
+ import { createProxyFetch } from "../proxy/proxyFetch.js";
5
+ import { AuthenticationError, InvalidModelError, ProviderError, RateLimitError, } from "../types/index.js";
6
+ import { withTimeout } from "../utils/errorHandling.js";
7
+ import { logger } from "../utils/logger.js";
8
+ import { createVoyageConfig, getProviderModel, validateApiKey, } from "../utils/providerConfig.js";
9
+ const VOYAGE_DEFAULT_BASE_URL = "https://api.voyageai.com/v1";
10
+ const REQUEST_TIMEOUT_MS = 60_000;
11
+ const getVoyageApiKey = () => validateApiKey(createVoyageConfig());
12
+ const getDefaultVoyageModel = () => getProviderModel("VOYAGE_MODEL", VoyageModels.VOYAGE_3_5);
13
+ /**
14
+ * Voyage AI Provider — embedding-only.
15
+ *
16
+ * Top-tier RAG embedder. Native API at api.voyageai.com/v1/embeddings.
17
+ * Chat / streaming / tool calling are not supported — `executeStream` and
18
+ * `getAISDKModel` throw a friendly error so callers get an actionable
19
+ * message instead of a runtime crash deep in the streaming layer.
20
+ *
21
+ * @see https://docs.voyageai.com/docs/embeddings
22
+ */
23
+ export class VoyageProvider extends BaseProvider {
24
+ apiKey;
25
+ baseURL;
26
+ proxyFetch;
27
+ constructor(modelName, sdk, _region, credentials) {
28
+ const validatedNeurolink = isNeuroLink(sdk) ? sdk : undefined;
29
+ super(modelName, "voyage", validatedNeurolink);
30
+ const overrideKey = credentials?.apiKey?.trim();
31
+ this.apiKey =
32
+ overrideKey && overrideKey.length > 0 ? overrideKey : getVoyageApiKey();
33
+ this.baseURL =
34
+ credentials?.baseURL ??
35
+ process.env.VOYAGE_BASE_URL ??
36
+ VOYAGE_DEFAULT_BASE_URL;
37
+ this.proxyFetch = createProxyFetch();
38
+ logger.debug("Voyage Provider initialized (embeddings only)", {
39
+ modelName: this.modelName,
40
+ baseURL: this.baseURL,
41
+ });
42
+ }
43
+ // ===== Required abstract overrides =====
44
+ getProviderName() {
45
+ return this.providerName;
46
+ }
47
+ getDefaultModel() {
48
+ return getDefaultVoyageModel();
49
+ }
50
+ supportsTools() {
51
+ return false;
52
+ }
53
+ getDefaultEmbeddingModel() {
54
+ return getDefaultVoyageModel();
55
+ }
56
+ /**
57
+ * Voyage is embedding-only — chat models do not exist on this endpoint.
58
+ * Caller surface stays consistent: returns an `AbortError`-shaped failure
59
+ * via `BaseProvider.handleProviderError`, not a TypeScript-level cast.
60
+ */
61
+ getAISDKModel() {
62
+ throw new ProviderError("Voyage AI is an embedding-only provider; chat completions are not available. Use `embed()` or `embedMany()` instead, or pick a different provider for `generate()` / `stream()`.", "voyage");
63
+ }
64
+ async executeStream(_options, _analysisSchema) {
65
+ throw new ProviderError("Voyage AI is an embedding-only provider; streaming chat is not available. Use `embed()` / `embedMany()`, or pick another provider for `stream()`.", "voyage");
66
+ }
67
+ formatProviderError(error) {
68
+ const message = error instanceof Error
69
+ ? error.message
70
+ : typeof error === "string"
71
+ ? error
72
+ : "Unknown error";
73
+ if (message.includes("401") ||
74
+ message.toLowerCase().includes("unauthorized") ||
75
+ message.includes("invalid_api_key")) {
76
+ return new AuthenticationError("Invalid Voyage AI API key. Get one at https://dash.voyageai.com/api-keys", "voyage");
77
+ }
78
+ if (message.includes("429") ||
79
+ message.toLowerCase().includes("rate limit")) {
80
+ return new RateLimitError("Voyage AI rate limit exceeded. Back off and retry.", "voyage");
81
+ }
82
+ if (message.includes("404") ||
83
+ message.toLowerCase().includes("model_not_found")) {
84
+ return new InvalidModelError(`Voyage AI model '${this.modelName}' not found. Browse https://docs.voyageai.com/docs/embeddings`, "voyage");
85
+ }
86
+ return new ProviderError(`Voyage AI error: ${message}`, "voyage");
87
+ }
88
+ // ===== Embedding implementations =====
89
+ async embed(text, modelName) {
90
+ const vectors = await this.callEmbeddings([text], modelName);
91
+ if (!vectors[0]) {
92
+ throw new ProviderError("Voyage AI returned no embedding for the provided text", "voyage");
93
+ }
94
+ return vectors[0];
95
+ }
96
+ async embedMany(texts, modelName) {
97
+ if (texts.length === 0) {
98
+ return [];
99
+ }
100
+ // Voyage AI's /embeddings endpoint accepts up to 128 inputs per request.
101
+ // Split larger payloads into sequential batches to avoid API rejection.
102
+ const VOYAGE_MAX_BATCH_SIZE = 128;
103
+ const out = [];
104
+ for (let i = 0; i < texts.length; i += VOYAGE_MAX_BATCH_SIZE) {
105
+ const batch = texts.slice(i, i + VOYAGE_MAX_BATCH_SIZE);
106
+ const vectors = await this.callEmbeddings(batch, modelName);
107
+ out.push(...vectors);
108
+ }
109
+ return out;
110
+ }
111
+ /**
112
+ * POST /embeddings — Voyage accepts up to 128 inputs per request.
113
+ * Caller batches above that (see `embedMany`).
114
+ */
115
+ async callEmbeddings(inputs, modelName) {
116
+ const model = modelName ?? this.modelName;
117
+ let response;
118
+ try {
119
+ response = await withTimeout(this.proxyFetch(`${this.baseURL}/embeddings`, {
120
+ method: "POST",
121
+ headers: {
122
+ Authorization: `Bearer ${this.apiKey}`,
123
+ "Content-Type": "application/json",
124
+ },
125
+ body: JSON.stringify({
126
+ input: inputs,
127
+ model,
128
+ }),
129
+ }), REQUEST_TIMEOUT_MS, new ProviderError(`Voyage embeddings request timed out after ${REQUEST_TIMEOUT_MS / 1000}s`, "voyage"));
130
+ }
131
+ catch (err) {
132
+ // Re-throw typed provider errors produced by withTimeout (ProviderError
133
+ // subclasses: AuthenticationError, RateLimitError, InvalidModelError)
134
+ // so they are not double-wrapped by formatProviderError.
135
+ if (err instanceof ProviderError) {
136
+ throw err;
137
+ }
138
+ throw this.formatProviderError(err);
139
+ }
140
+ if (!response.ok) {
141
+ const text = await response.text();
142
+ throw this.formatProviderError(new Error(`Voyage embeddings failed: ${response.status} — ${text}`));
143
+ }
144
+ const data = (await response.json());
145
+ if (!data.data || data.data.length === 0) {
146
+ throw new ProviderError("Voyage embeddings response missing data", "voyage");
147
+ }
148
+ // Validate that the response covers all requested inputs.
149
+ // Voyage may return partial results in edge-case error scenarios.
150
+ if (data.data.length !== inputs.length) {
151
+ throw new ProviderError(`Voyage embeddings response count mismatch: expected ${inputs.length}, got ${data.data.length}`, "voyage");
152
+ }
153
+ // Sort by index (Voyage returns out-of-order under some conditions)
154
+ // and drop to a flat number[][] result.
155
+ const sorted = data.data.slice().sort((a, b) => a.index - b.index);
156
+ // Verify that index coverage is complete (0 … n-1).
157
+ for (let i = 0; i < sorted.length; i++) {
158
+ if (sorted[i].index !== i) {
159
+ throw new ProviderError(`Voyage embeddings response has unexpected index ordering: position ${i} has index ${sorted[i].index}`, "voyage");
160
+ }
161
+ }
162
+ return sorted.map((d) => d.embedding);
163
+ }
164
+ async validateConfiguration() {
165
+ return typeof this.apiKey === "string" && this.apiKey.trim().length > 0;
166
+ }
167
+ getConfiguration() {
168
+ return {
169
+ provider: this.providerName,
170
+ model: this.modelName,
171
+ defaultModel: getDefaultVoyageModel(),
172
+ baseURL: this.baseURL,
173
+ };
174
+ }
175
+ }
176
+ export default VoyageProvider;
177
+ //# sourceMappingURL=voyage.js.map
@@ -0,0 +1,33 @@
1
+ import { type LanguageModel } from "ai";
2
+ import type { AIProviderName } from "../constants/enums.js";
3
+ import { BaseProvider } from "../core/baseProvider.js";
4
+ import type { NeurolinkCredentials, StreamOptions, StreamResult, ValidationSchema } from "../types/index.js";
5
+ /**
6
+ * xAI Grok Provider
7
+ *
8
+ * OpenAI-compatible chat completions at api.x.ai/v1. Supports the Grok
9
+ * family: grok-2, grok-3, grok-3-mini, grok-2-vision-latest (multimodal),
10
+ * and grok-beta. Streaming and tool calling supported.
11
+ *
12
+ * @see https://docs.x.ai/api
13
+ */
14
+ export declare class XaiProvider extends BaseProvider {
15
+ private model;
16
+ private apiKey;
17
+ private baseURL;
18
+ constructor(modelName?: string, sdk?: unknown, _region?: string, credentials?: NeurolinkCredentials["xai"]);
19
+ protected executeStream(options: StreamOptions, _analysisSchema?: ValidationSchema): Promise<StreamResult>;
20
+ private executeStreamInner;
21
+ protected getProviderName(): AIProviderName;
22
+ protected getDefaultModel(): string;
23
+ protected getAISDKModel(): LanguageModel;
24
+ protected formatProviderError(error: unknown): Error;
25
+ validateConfiguration(): Promise<boolean>;
26
+ getConfiguration(): {
27
+ provider: AIProviderName;
28
+ model: string;
29
+ defaultModel: string;
30
+ baseURL: string;
31
+ };
32
+ }
33
+ export default XaiProvider;