@juspay/neurolink 9.64.0 → 9.65.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/CHANGELOG.md +12 -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/agent/directTools.js +11 -3
  17. package/dist/autoresearch/runner.js +8 -2
  18. package/dist/avatar/index.d.ts +13 -0
  19. package/dist/avatar/index.js +13 -0
  20. package/dist/avatar/providers/DIDAvatar.d.ts +49 -0
  21. package/dist/avatar/providers/DIDAvatar.js +501 -0
  22. package/dist/avatar/providers/HeyGenAvatar.d.ts +30 -0
  23. package/dist/avatar/providers/HeyGenAvatar.js +337 -0
  24. package/dist/avatar/providers/ReplicateAvatar.d.ts +36 -0
  25. package/dist/avatar/providers/ReplicateAvatar.js +267 -0
  26. package/dist/browser/neurolink.min.js +624 -601
  27. package/dist/cli/commands/mcp.js +29 -0
  28. package/dist/cli/commands/proxy.js +24 -5
  29. package/dist/cli/factories/commandFactory.d.ts +11 -1
  30. package/dist/cli/factories/commandFactory.js +291 -38
  31. package/dist/constants/contextWindows.js +101 -0
  32. package/dist/constants/enums.d.ts +273 -2
  33. package/dist/constants/enums.js +290 -1
  34. package/dist/constants/videoErrors.d.ts +4 -0
  35. package/dist/constants/videoErrors.js +4 -0
  36. package/dist/core/baseProvider.d.ts +22 -2
  37. package/dist/core/baseProvider.js +217 -11
  38. package/dist/core/constants.d.ts +12 -0
  39. package/dist/core/constants.js +72 -1
  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/agent/directTools.js +11 -3
  61. package/dist/lib/autoresearch/runner.js +8 -2
  62. package/dist/lib/avatar/index.d.ts +13 -0
  63. package/dist/lib/avatar/index.js +14 -0
  64. package/dist/lib/avatar/providers/DIDAvatar.d.ts +49 -0
  65. package/dist/lib/avatar/providers/DIDAvatar.js +502 -0
  66. package/dist/lib/avatar/providers/HeyGenAvatar.d.ts +30 -0
  67. package/dist/lib/avatar/providers/HeyGenAvatar.js +338 -0
  68. package/dist/lib/avatar/providers/ReplicateAvatar.d.ts +36 -0
  69. package/dist/lib/avatar/providers/ReplicateAvatar.js +268 -0
  70. package/dist/lib/constants/contextWindows.js +101 -0
  71. package/dist/lib/constants/enums.d.ts +273 -2
  72. package/dist/lib/constants/enums.js +290 -1
  73. package/dist/lib/constants/videoErrors.d.ts +4 -0
  74. package/dist/lib/constants/videoErrors.js +4 -0
  75. package/dist/lib/core/baseProvider.d.ts +22 -2
  76. package/dist/lib/core/baseProvider.js +217 -11
  77. package/dist/lib/core/constants.d.ts +12 -0
  78. package/dist/lib/core/constants.js +72 -1
  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 +126 -10
  112. package/dist/lib/providers/googleNativeGemini3.d.ts +26 -6
  113. package/dist/lib/providers/googleNativeGemini3.js +276 -29
  114. package/dist/lib/providers/googleVertex.js +639 -181
  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/conversation.d.ts +16 -0
  157. package/dist/lib/types/generate.d.ts +62 -5
  158. package/dist/lib/types/index.d.ts +5 -0
  159. package/dist/lib/types/index.js +7 -0
  160. package/dist/lib/types/middleware.d.ts +27 -0
  161. package/dist/lib/types/multimodal.d.ts +35 -2
  162. package/dist/lib/types/music.d.ts +165 -0
  163. package/dist/lib/types/music.js +21 -0
  164. package/dist/lib/types/providers.d.ts +144 -1
  165. package/dist/lib/types/replicate.d.ts +67 -0
  166. package/dist/lib/types/replicate.js +10 -0
  167. package/dist/lib/types/safeFetch.d.ts +15 -0
  168. package/dist/lib/types/safeFetch.js +7 -0
  169. package/dist/lib/types/stream.d.ts +2 -1
  170. package/dist/lib/types/tools.d.ts +13 -0
  171. package/dist/lib/types/video.d.ts +89 -0
  172. package/dist/lib/types/video.js +15 -0
  173. package/dist/lib/utils/avatarProcessor.d.ts +68 -0
  174. package/dist/lib/utils/avatarProcessor.js +172 -0
  175. package/dist/lib/utils/cloneOptions.d.ts +36 -0
  176. package/dist/lib/utils/cloneOptions.js +62 -0
  177. package/dist/lib/utils/lifecycleCallbacks.d.ts +51 -8
  178. package/dist/lib/utils/lifecycleCallbacks.js +82 -26
  179. package/dist/lib/utils/lifecycleTimeout.d.ts +25 -0
  180. package/dist/lib/utils/lifecycleTimeout.js +39 -0
  181. package/dist/lib/utils/logSanitize.d.ts +49 -0
  182. package/dist/lib/utils/logSanitize.js +170 -0
  183. package/dist/lib/utils/loggingFetch.d.ts +29 -0
  184. package/dist/lib/utils/loggingFetch.js +60 -0
  185. package/dist/lib/utils/messageBuilder.js +43 -25
  186. package/dist/lib/utils/modelChoices.js +236 -3
  187. package/dist/lib/utils/musicProcessor.d.ts +67 -0
  188. package/dist/lib/utils/musicProcessor.js +189 -0
  189. package/dist/lib/utils/optionsConversion.js +3 -2
  190. package/dist/lib/utils/parameterValidation.js +14 -4
  191. package/dist/lib/utils/pricing.js +193 -0
  192. package/dist/lib/utils/providerConfig.d.ts +55 -0
  193. package/dist/lib/utils/providerConfig.js +224 -0
  194. package/dist/lib/utils/safeFetch.d.ts +26 -0
  195. package/dist/lib/utils/safeFetch.js +83 -0
  196. package/dist/lib/utils/sizeGuard.d.ts +34 -0
  197. package/dist/lib/utils/sizeGuard.js +45 -0
  198. package/dist/lib/utils/ssrfGuard.d.ts +52 -0
  199. package/dist/lib/utils/ssrfGuard.js +411 -0
  200. package/dist/lib/utils/videoProcessor.d.ts +60 -0
  201. package/dist/lib/utils/videoProcessor.js +201 -0
  202. package/dist/lib/voice/providers/FishAudioTTS.d.ts +27 -0
  203. package/dist/lib/voice/providers/FishAudioTTS.js +183 -0
  204. package/dist/lib/workflow/core/ensembleExecutor.js +26 -9
  205. package/dist/middleware/builtin/lifecycle.js +39 -9
  206. package/dist/music/index.d.ts +13 -0
  207. package/dist/music/index.js +13 -0
  208. package/dist/music/providers/BeatovenMusic.d.ts +31 -0
  209. package/dist/music/providers/BeatovenMusic.js +333 -0
  210. package/dist/music/providers/ElevenLabsMusic.d.ts +30 -0
  211. package/dist/music/providers/ElevenLabsMusic.js +168 -0
  212. package/dist/music/providers/LyriaMusic.d.ts +29 -0
  213. package/dist/music/providers/LyriaMusic.js +172 -0
  214. package/dist/music/providers/ReplicateMusic.d.ts +31 -0
  215. package/dist/music/providers/ReplicateMusic.js +261 -0
  216. package/dist/neurolink.d.ts +30 -0
  217. package/dist/neurolink.js +323 -77
  218. package/dist/providers/amazonBedrock.d.ts +10 -0
  219. package/dist/providers/amazonBedrock.js +94 -39
  220. package/dist/providers/anthropic.js +55 -7
  221. package/dist/providers/anthropicBaseProvider.js +1 -1
  222. package/dist/providers/azureOpenai.js +66 -17
  223. package/dist/providers/cloudflare.d.ts +35 -0
  224. package/dist/providers/cloudflare.js +173 -0
  225. package/dist/providers/cohere.d.ts +52 -0
  226. package/dist/providers/cohere.js +252 -0
  227. package/dist/providers/deepseek.js +72 -17
  228. package/dist/providers/fireworks.d.ts +33 -0
  229. package/dist/providers/fireworks.js +163 -0
  230. package/dist/providers/googleAiStudio.js +126 -10
  231. package/dist/providers/googleNativeGemini3.d.ts +26 -6
  232. package/dist/providers/googleNativeGemini3.js +276 -29
  233. package/dist/providers/googleVertex.js +639 -181
  234. package/dist/providers/groq.d.ts +33 -0
  235. package/dist/providers/groq.js +180 -0
  236. package/dist/providers/huggingFace.js +9 -8
  237. package/dist/providers/ideogram.d.ts +34 -0
  238. package/dist/providers/ideogram.js +183 -0
  239. package/dist/providers/index.d.ts +13 -0
  240. package/dist/providers/index.js +13 -0
  241. package/dist/providers/jina.d.ts +59 -0
  242. package/dist/providers/jina.js +217 -0
  243. package/dist/providers/llamaCpp.js +14 -46
  244. package/dist/providers/lmStudio.js +14 -47
  245. package/dist/providers/mistral.js +7 -7
  246. package/dist/providers/nvidiaNim.js +160 -19
  247. package/dist/providers/ollama.js +7 -7
  248. package/dist/providers/openAI.d.ts +22 -1
  249. package/dist/providers/openAI.js +181 -0
  250. package/dist/providers/openRouter.js +35 -23
  251. package/dist/providers/openaiCompatible.js +9 -8
  252. package/dist/providers/perplexity.d.ts +33 -0
  253. package/dist/providers/perplexity.js +178 -0
  254. package/dist/providers/recraft.d.ts +34 -0
  255. package/dist/providers/recraft.js +196 -0
  256. package/dist/providers/replicate.d.ts +75 -0
  257. package/dist/providers/replicate.js +402 -0
  258. package/dist/providers/stability.d.ts +37 -0
  259. package/dist/providers/stability.js +190 -0
  260. package/dist/providers/togetherAi.d.ts +33 -0
  261. package/dist/providers/togetherAi.js +175 -0
  262. package/dist/providers/voyage.d.ts +47 -0
  263. package/dist/providers/voyage.js +176 -0
  264. package/dist/providers/xai.d.ts +33 -0
  265. package/dist/providers/xai.js +171 -0
  266. package/dist/telemetry/index.d.ts +1 -1
  267. package/dist/telemetry/index.js +1 -1
  268. package/dist/telemetry/tracers.d.ts +19 -0
  269. package/dist/telemetry/tracers.js +19 -0
  270. package/dist/telemetry/withSpan.d.ts +35 -0
  271. package/dist/telemetry/withSpan.js +103 -0
  272. package/dist/types/avatar.d.ts +143 -0
  273. package/dist/types/avatar.js +19 -0
  274. package/dist/types/cli.d.ts +6 -0
  275. package/dist/types/conversation.d.ts +16 -0
  276. package/dist/types/generate.d.ts +62 -5
  277. package/dist/types/index.d.ts +5 -0
  278. package/dist/types/index.js +7 -0
  279. package/dist/types/middleware.d.ts +27 -0
  280. package/dist/types/multimodal.d.ts +35 -2
  281. package/dist/types/music.d.ts +165 -0
  282. package/dist/types/music.js +20 -0
  283. package/dist/types/providers.d.ts +144 -1
  284. package/dist/types/replicate.d.ts +67 -0
  285. package/dist/types/replicate.js +9 -0
  286. package/dist/types/safeFetch.d.ts +15 -0
  287. package/dist/types/safeFetch.js +6 -0
  288. package/dist/types/stream.d.ts +2 -1
  289. package/dist/types/tools.d.ts +13 -0
  290. package/dist/types/video.d.ts +89 -0
  291. package/dist/types/video.js +14 -0
  292. package/dist/utils/avatarProcessor.d.ts +68 -0
  293. package/dist/utils/avatarProcessor.js +171 -0
  294. package/dist/utils/cloneOptions.d.ts +36 -0
  295. package/dist/utils/cloneOptions.js +61 -0
  296. package/dist/utils/lifecycleCallbacks.d.ts +51 -8
  297. package/dist/utils/lifecycleCallbacks.js +82 -26
  298. package/dist/utils/lifecycleTimeout.d.ts +25 -0
  299. package/dist/utils/lifecycleTimeout.js +38 -0
  300. package/dist/utils/logSanitize.d.ts +49 -0
  301. package/dist/utils/logSanitize.js +169 -0
  302. package/dist/utils/loggingFetch.d.ts +29 -0
  303. package/dist/utils/loggingFetch.js +59 -0
  304. package/dist/utils/messageBuilder.js +43 -25
  305. package/dist/utils/modelChoices.js +236 -3
  306. package/dist/utils/musicProcessor.d.ts +67 -0
  307. package/dist/utils/musicProcessor.js +188 -0
  308. package/dist/utils/optionsConversion.js +3 -2
  309. package/dist/utils/parameterValidation.js +14 -4
  310. package/dist/utils/pricing.js +193 -0
  311. package/dist/utils/providerConfig.d.ts +55 -0
  312. package/dist/utils/providerConfig.js +224 -0
  313. package/dist/utils/safeFetch.d.ts +26 -0
  314. package/dist/utils/safeFetch.js +82 -0
  315. package/dist/utils/sizeGuard.d.ts +34 -0
  316. package/dist/utils/sizeGuard.js +44 -0
  317. package/dist/utils/ssrfGuard.d.ts +52 -0
  318. package/dist/utils/ssrfGuard.js +410 -0
  319. package/dist/utils/videoProcessor.d.ts +60 -0
  320. package/dist/utils/videoProcessor.js +200 -0
  321. package/dist/voice/providers/FishAudioTTS.d.ts +27 -0
  322. package/dist/voice/providers/FishAudioTTS.js +182 -0
  323. package/dist/workflow/core/ensembleExecutor.js +26 -9
  324. package/package.json +32 -5
package/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [9.65.1](https://github.com/juspay/neurolink/compare/v9.65.0...v9.65.1) (2026-05-24)
2
+
3
+ ### Bug Fixes
4
+
5
+ - **(providers):** restore native Vertex tool storage + Claude streaming + Gemini history replay ([7b00e06](https://github.com/juspay/neurolink/commit/7b00e0608a9184e48f3badd90a2238cb330a8128))
6
+
7
+ ## [9.65.0](https://github.com/juspay/neurolink/compare/v9.64.0...v9.65.0) (2026-05-17)
8
+
9
+ ### Features
10
+
11
+ - **(providers):** add 12 new providers + new modalities (avatar/music/video) + image-gen ([00f88f6](https://github.com/juspay/neurolink/commit/00f88f67161ab170cf2b3b8be3ec683d3cae1c24))
12
+
1
13
  ## [9.64.0](https://github.com/juspay/neurolink/compare/v9.63.1...v9.64.0) (2026-05-16)
2
14
 
3
15
  ### Features
package/README.md CHANGED
@@ -40,21 +40,22 @@ Extracted from production systems at Juspay and battle-tested at enterprise scal
40
40
 
41
41
  ## What's New (Q1 2026)
42
42
 
43
- | Feature | Version | Description | Guide |
44
- | ---------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------- |
45
- | **Multi-Provider Voice (TTS/STT)** | v9.62.0 | 4 TTS providers (OpenAI TTS, ElevenLabs, Google TTS, Azure TTS) + 4 STT providers (Whisper, Deepgram, Azure STT, Google STT) + 2 realtime APIs (OpenAI Realtime, Gemini Live). | [TTS Guide](docs/features/tts.md) \| [STT Guide](docs/features/audio-input.md) \| [Realtime Guide](docs/features/real-time-services.md) |
46
- | **4 New Providers** | v9.60.0 | DeepSeek (V3/R1), NVIDIA NIM (400+ catalog), LM Studio (local), llama.cpp (GGUF local). | [Provider Setup](docs/getting-started/provider-setup.md) |
47
- | **ModelAccessDeniedError** | v9.59.0 | Typed `ModelAccessDeniedError` + `sdk.checkCredentials()` API for proactive credential validation before first call. | [Error Reference](docs/reference/troubleshooting.md) |
48
- | **Provider Fallback Policy** | v9.58.0 | `providerFallback` callback + `modelChain` config for centralized multi-provider fallback logic. | [Advanced Guide](docs/advanced/index.md) |
49
- | **Per-Request Credentials** | v9.52.0 | Pass credentials per-call or per-instance for all providers. Per-call overrides instance; instance overrides env vars. | [Credentials Guide](docs/features/per-request-credentials.md) |
50
- | **AutoResearch** | v9.53.0 | Autonomous AI experiment engine: proposes code changes, runs experiments, evaluates metrics unattended for hours. | [AutoResearch Guide](docs/features/autoresearch.md) |
51
- | **Gemini 3 Multi-turn Tool Fix** | v9.49.0 | Fixed multi-step agentic tool calling on Vertex AI Gemini 3. Correct `thoughtSignature` replay, `stepIndex` grouping, `executionId` session isolation, 5-min timeout. | [Vertex AI Guide](docs/getting-started/providers/google-vertex.md) |
52
- | **MCP Enhancements** | v9.16.0 | Tool routing (6 strategies), result caching (LRU/FIFO/LFU), request batching, annotations, elicitation protocol, multi-server management. | [MCP Enhancements Guide](docs/features/mcp-enhancements.md) |
53
- | **Memory** | v9.12.0 | Per-user condensed memory across conversations. LLM-powered condensation with S3, Redis, or SQLite. | [Memory Guide](docs/features/memory.md) |
54
- | **Context Window Management** | v9.2.0 | 4-stage compaction pipeline with budget gate at 80% usage, per-provider token estimation. | [Context Compaction Guide](docs/features/context-compaction.md) |
55
- | **Tool Execution Control** | v9.3.0 | `prepareStep` and `toolChoice` for per-step tool enforcement in multi-step agentic loops. | [API Reference](docs/api/type-aliases/GenerateOptions.md#preparestep) |
56
- | **File Processor System** | v9.1.0 | 17+ file type processors with ProcessorRegistry, security sanitization, SVG text injection. | [File Processors Guide](docs/features/file-processors.md) |
57
- | **RAG with generate()/stream()** | v9.2.0 | Pass `rag: { files }` for automatic document chunking, embedding, and AI-powered search. 10 chunking strategies, hybrid search, reranking. | [RAG Guide](docs/features/rag.md) |
43
+ | Feature | Version | Description | Guide |
44
+ | -------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
45
+ | **Avatar / Music Modalities + 12 Providers** | next | New `output: { mode: "avatar" \| "music" }` dispatch with handlers for D-ID, HeyGen, Replicate-MuseTalk (avatar) and Beatoven, ElevenLabs Music, Lyria, Replicate-MusicGen (music). Plus Fish Audio TTS, Kling/Runway/Replicate video, xAI/Groq/Cohere/Together/Fireworks/Perplexity/Cloudflare LLMs, Voyage/Jina embeddings, Stability/Ideogram/Recraft/Replicate image-gen. | [Provider Integration](docs/provider-integration/) |
46
+ | **Multi-Provider Voice (TTS/STT)** | v9.62.0 | 4 TTS providers (OpenAI TTS, ElevenLabs, Google TTS, Azure TTS) + 4 STT providers (Whisper, Deepgram, Azure STT, Google STT) + 2 realtime APIs (OpenAI Realtime, Gemini Live). | [TTS Guide](docs/features/tts.md) \| [STT Guide](docs/features/audio-input.md) \| [Realtime Guide](docs/features/real-time-services.md) |
47
+ | **4 New Providers** | v9.60.0 | DeepSeek (V3/R1), NVIDIA NIM (400+ catalog), LM Studio (local), llama.cpp (GGUF local). | [Provider Setup](docs/getting-started/provider-setup.md) |
48
+ | **ModelAccessDeniedError** | v9.59.0 | Typed `ModelAccessDeniedError` + `sdk.checkCredentials()` API for proactive credential validation before first call. | [Error Reference](docs/reference/troubleshooting.md) |
49
+ | **Provider Fallback Policy** | v9.58.0 | `providerFallback` callback + `modelChain` config for centralized multi-provider fallback logic. | [Advanced Guide](docs/advanced/index.md) |
50
+ | **Per-Request Credentials** | v9.52.0 | Pass credentials per-call or per-instance for all providers. Per-call overrides instance; instance overrides env vars. | [Credentials Guide](docs/features/per-request-credentials.md) |
51
+ | **AutoResearch** | v9.53.0 | Autonomous AI experiment engine: proposes code changes, runs experiments, evaluates metrics unattended for hours. | [AutoResearch Guide](docs/features/autoresearch.md) |
52
+ | **Gemini 3 Multi-turn Tool Fix** | v9.49.0 | Fixed multi-step agentic tool calling on Vertex AI Gemini 3. Correct `thoughtSignature` replay, `stepIndex` grouping, `executionId` session isolation, 5-min timeout. | [Vertex AI Guide](docs/getting-started/providers/google-vertex.md) |
53
+ | **MCP Enhancements** | v9.16.0 | Tool routing (6 strategies), result caching (LRU/FIFO/LFU), request batching, annotations, elicitation protocol, multi-server management. | [MCP Enhancements Guide](docs/features/mcp-enhancements.md) |
54
+ | **Memory** | v9.12.0 | Per-user condensed memory across conversations. LLM-powered condensation with S3, Redis, or SQLite. | [Memory Guide](docs/features/memory.md) |
55
+ | **Context Window Management** | v9.2.0 | 4-stage compaction pipeline with budget gate at 80% usage, per-provider token estimation. | [Context Compaction Guide](docs/features/context-compaction.md) |
56
+ | **Tool Execution Control** | v9.3.0 | `prepareStep` and `toolChoice` for per-step tool enforcement in multi-step agentic loops. | [API Reference](docs/api/type-aliases/GenerateOptions.md#preparestep) |
57
+ | **File Processor System** | v9.1.0 | 17+ file type processors with ProcessorRegistry, security sanitization, SVG text injection. | [File Processors Guide](docs/features/file-processors.md) |
58
+ | **RAG with generate()/stream()** | v9.2.0 | Pass `rag: { files }` for automatic document chunking, embedding, and AI-powered search. 10 chunking strategies, hybrid search, reranking. | [RAG Guide](docs/features/rag.md) |
58
59
 
59
60
  ```typescript
60
61
  // Multi-Provider Voice (v9.62.0) — TTS + STT
@@ -406,7 +407,7 @@ const result = await neurolink.generate({
406
407
  ### Next Steps
407
408
 
408
409
  - **[Complete Documentation](https://docs.neurolink.ink)** - Comprehensive guides and API reference
409
- - **[Provider Setup Guide](docs/getting-started/provider-setup.md)** - Configure all 21+ providers
410
+ - **[Provider Setup Guide](docs/getting-started/provider-setup.md)** - Configure all 33+ providers
410
411
  - **[SDK API Reference](docs/sdk/api-reference.md)** - Full TypeScript API documentation
411
412
  - **[CLI Command Reference](docs/cli/commands.md)** - Complete CLI documentation
412
413
  - **[Example Projects](docs/examples/index.md)** - Real-world integration examples
@@ -438,7 +439,7 @@ NeuroLink is a comprehensive AI development platform. Every feature below is pro
438
439
 
439
440
  ### 🤖 AI Provider Integration
440
441
 
441
- **21+ providers unified under one API** - Switch providers with a single parameter change.
442
+ **33+ providers unified under one API** - Switch providers with a single parameter change.
442
443
 
443
444
  | Provider | Models | Free Tier | Tool Support | Status | Documentation |
444
445
  | --------------------- | -------------------------------------------------------------------------- | --------------- | ------------ | ------------- | ----------------------------------------------------------------------------------------------------------------------------- |
@@ -281,7 +281,7 @@ const VISION_CAPABILITIES = {
281
281
  openrouter: [
282
282
  // OpenRouter provides access to vision-capable models from multiple providers
283
283
  // Anthropic Claude models (via OpenRouter)
284
- "anthropic/claude-3-5-sonnet",
284
+ "anthropic/claude-3.7-sonnet",
285
285
  "anthropic/claude-3-5-haiku",
286
286
  "anthropic/claude-3-opus",
287
287
  "anthropic/claude-3-sonnet",
@@ -474,6 +474,34 @@ const VISION_CAPABILITIES = {
474
474
  "qwen2-vl",
475
475
  "phi-3-vision",
476
476
  ],
477
+ // xAI: only grok-2-vision is multimodal today
478
+ xai: ["grok-2-vision-latest"],
479
+ // Groq: vision models are explicit "*-vision-preview" variants
480
+ groq: ["llama-3.2-90b-vision-preview", "llama-3.2-11b-vision-preview"],
481
+ // Cohere: command-r* are text-only (no vision); empty list
482
+ cohere: [],
483
+ // Together AI: text-only by default; add vision variants if/when used.
484
+ "together-ai": [],
485
+ // Fireworks: vision via Phi-3-Vision and Llama 3.2 vision variants.
486
+ fireworks: [
487
+ "accounts/fireworks/models/phi-3-vision-128k-instruct",
488
+ "accounts/fireworks/models/llama-v3p2-90b-vision-instruct",
489
+ "accounts/fireworks/models/llama-v3p2-11b-vision-instruct",
490
+ ],
491
+ // Perplexity Sonar — text-only with web grounding.
492
+ perplexity: [],
493
+ // Cloudflare: explicit vision variants only.
494
+ cloudflare: ["@cf/meta/llama-3.2-11b-vision-instruct"],
495
+ // Replicate: vision capability depends on the specific model id.
496
+ replicate: ["llava", "llama-3.2-vision", "moondream", "qwen2-vl"],
497
+ // Voyage / Jina — embedding-only, not multimodal in this sense.
498
+ voyage: [],
499
+ jina: [],
500
+ // Stability / Ideogram / Recraft — image-OUTPUT, not image-INPUT.
501
+ // VISION_CAPABILITIES tracks reference-image input support.
502
+ stability: [],
503
+ ideogram: [],
504
+ recraft: [],
477
505
  };
478
506
  /**
479
507
  * Provider Image Adapter - Smart routing and formatting
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Replicate Auth Helper
3
+ *
4
+ * Resolves the Replicate API token + base URL from per-call overrides,
5
+ * instance credentials, or env vars. Used by every Replicate-backed
6
+ * handler (LLM, video, avatar, music) so the auth chain is centralised.
7
+ *
8
+ * @module adapters/replicate/auth
9
+ */
10
+ import type { ReplicateAuth } from "../../types/index.js";
11
+ /**
12
+ * Resolve Replicate auth from override → env vars.
13
+ *
14
+ * Returns `null` when `REPLICATE_API_TOKEN` is missing AND no override is
15
+ * provided. Handlers' `isConfigured()` check `auth !== null`.
16
+ *
17
+ * @param override - per-call or instance-level credentials slice
18
+ */
19
+ export declare function getReplicateAuth(override?: Partial<ReplicateAuth>): ReplicateAuth | null;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Replicate Auth Helper
3
+ *
4
+ * Resolves the Replicate API token + base URL from per-call overrides,
5
+ * instance credentials, or env vars. Used by every Replicate-backed
6
+ * handler (LLM, video, avatar, music) so the auth chain is centralised.
7
+ *
8
+ * @module adapters/replicate/auth
9
+ */
10
+ const DEFAULT_BASE_URL = "https://api.replicate.com";
11
+ /**
12
+ * Resolve Replicate auth from override → env vars.
13
+ *
14
+ * Returns `null` when `REPLICATE_API_TOKEN` is missing AND no override is
15
+ * provided. Handlers' `isConfigured()` check `auth !== null`.
16
+ *
17
+ * @param override - per-call or instance-level credentials slice
18
+ */
19
+ export function getReplicateAuth(override) {
20
+ const apiToken = (override?.apiToken ??
21
+ process.env.REPLICATE_API_TOKEN ??
22
+ "").trim();
23
+ if (!apiToken) {
24
+ return null;
25
+ }
26
+ return {
27
+ apiToken,
28
+ baseUrl: (override?.baseUrl ??
29
+ process.env.REPLICATE_BASE_URL ??
30
+ DEFAULT_BASE_URL).replace(/\/$/, ""),
31
+ };
32
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Replicate Prediction Lifecycle
3
+ *
4
+ * Shared async-job helpers used by every Replicate-backed handler. Submits
5
+ * a prediction, polls until terminal status, downloads the binary output.
6
+ *
7
+ * Usage pattern (for handlers — LLM, video, avatar, music):
8
+ *
9
+ * const auth = getReplicateAuth(credentials);
10
+ * if (!auth) throw new XxxError({ code: PROVIDER_NOT_CONFIGURED, ... });
11
+ * const prediction = await predict(auth, { model, input });
12
+ * const buffer = await downloadPredictionOutput(prediction);
13
+ *
14
+ * @module adapters/replicate/predictionLifecycle
15
+ */
16
+ import type { ReplicateAuth, ReplicateCreatePredictionInput, ReplicatePollOptions, ReplicatePrediction } from "../../types/index.js";
17
+ /**
18
+ * Submit a Replicate prediction. Uses `Prefer: wait=60` so quick
19
+ * predictions complete in the initial POST and skip polling entirely.
20
+ */
21
+ export declare function createPrediction(auth: ReplicateAuth, input: ReplicateCreatePredictionInput): Promise<ReplicatePrediction>;
22
+ /**
23
+ * Poll a Replicate prediction until it reaches a terminal status
24
+ * (succeeded / failed / canceled) or the total timeout elapses.
25
+ */
26
+ export declare function pollPrediction(auth: ReplicateAuth, predictionId: string, options?: ReplicatePollOptions): Promise<ReplicatePrediction>;
27
+ /**
28
+ * Submit + poll. Combines `createPrediction` + `pollPrediction`.
29
+ *
30
+ * Uses `Prefer: wait=60` in the submit call so short jobs complete in the
31
+ * initial POST and bypass polling entirely.
32
+ */
33
+ export declare function predict(auth: ReplicateAuth, input: ReplicateCreatePredictionInput, options?: ReplicatePollOptions): Promise<ReplicatePrediction>;
34
+ /**
35
+ * Download a Replicate prediction's binary output.
36
+ *
37
+ * Replicate models return either a single URL string or an array of URL
38
+ * strings (multi-output models). For models that return base64 directly,
39
+ * use a model-specific helper instead.
40
+ *
41
+ * @param prediction The completed prediction to download.
42
+ * @param maxBytes Maximum bytes allowed. Defaults to {@link MAX_VIDEO_BYTES}
43
+ * (256 MiB). Pass {@link MAX_AUDIO_BYTES} for music/TTS
44
+ * outputs or {@link MAX_IMAGE_BYTES} for image outputs.
45
+ */
46
+ export declare function downloadPredictionOutput(prediction: ReplicatePrediction, maxBytes?: number): Promise<Buffer>;
@@ -0,0 +1,283 @@
1
+ /**
2
+ * Replicate Prediction Lifecycle
3
+ *
4
+ * Shared async-job helpers used by every Replicate-backed handler. Submits
5
+ * a prediction, polls until terminal status, downloads the binary output.
6
+ *
7
+ * Usage pattern (for handlers — LLM, video, avatar, music):
8
+ *
9
+ * const auth = getReplicateAuth(credentials);
10
+ * if (!auth) throw new XxxError({ code: PROVIDER_NOT_CONFIGURED, ... });
11
+ * const prediction = await predict(auth, { model, input });
12
+ * const buffer = await downloadPredictionOutput(prediction);
13
+ *
14
+ * @module adapters/replicate/predictionLifecycle
15
+ */
16
+ import { ErrorCategory, ErrorSeverity } from "../../constants/enums.js";
17
+ import { logger } from "../../utils/logger.js";
18
+ import { NeuroLinkError, ERROR_CODES } from "../../utils/errorHandling.js";
19
+ import { sanitizeForLog } from "../../utils/logSanitize.js";
20
+ import { safeDownload } from "../../utils/safeFetch.js";
21
+ import { MAX_VIDEO_BYTES } from "../../utils/sizeGuard.js";
22
+ // The submit path sends `Prefer: wait=60`, so Replicate can legitimately
23
+ // hold the connection for up to 60s while the prediction warms / runs.
24
+ // A 30s client-side timeout aborts in the middle of that window and
25
+ // produces spurious "submit timed out" errors on cold models (e.g. the
26
+ // MusicGen ones). Bump to 90s to cover the server window plus headroom.
27
+ const REQUEST_TIMEOUT_MS = 90_000;
28
+ const DEFAULT_POLL_INTERVAL_MS = 2_000;
29
+ const DEFAULT_TOTAL_TIMEOUT_MS = 5 * 60_000;
30
+ /**
31
+ * Submit a Replicate prediction. Uses `Prefer: wait=60` so quick
32
+ * predictions complete in the initial POST and skip polling entirely.
33
+ */
34
+ export async function createPrediction(auth, input) {
35
+ const baseUrl = auth.baseUrl ?? "https://api.replicate.com";
36
+ const [modelPath, version] = input.model.split(":", 2);
37
+ const endpoint = version
38
+ ? `${baseUrl}/v1/predictions`
39
+ : `${baseUrl}/v1/models/${modelPath}/predictions`;
40
+ const body = version
41
+ ? { version, input: input.input }
42
+ : { input: input.input };
43
+ if (input.webhook) {
44
+ body.webhook = input.webhook;
45
+ }
46
+ if (input.webhookEventsFilter && input.webhookEventsFilter.length > 0) {
47
+ body.webhook_events_filter = input.webhookEventsFilter;
48
+ }
49
+ const controller = new AbortController();
50
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
51
+ let response;
52
+ try {
53
+ response = await fetch(endpoint, {
54
+ method: "POST",
55
+ headers: {
56
+ Authorization: `Token ${auth.apiToken}`,
57
+ "Content-Type": "application/json",
58
+ Prefer: "wait=60",
59
+ },
60
+ body: JSON.stringify(body),
61
+ signal: controller.signal,
62
+ });
63
+ }
64
+ catch (err) {
65
+ if (err instanceof NeuroLinkError) {
66
+ throw err;
67
+ }
68
+ if (err instanceof Error && err.name === "AbortError") {
69
+ throw new NeuroLinkError({
70
+ code: ERROR_CODES.OPERATION_ABORTED,
71
+ message: `Replicate predictions submit timed out after ${REQUEST_TIMEOUT_MS / 1000}s`,
72
+ category: ErrorCategory.TIMEOUT,
73
+ severity: ErrorSeverity.HIGH,
74
+ retriable: true,
75
+ originalError: err,
76
+ });
77
+ }
78
+ throw err;
79
+ }
80
+ finally {
81
+ clearTimeout(timeoutId);
82
+ }
83
+ if (!response.ok) {
84
+ const raw = await response.text();
85
+ throw new NeuroLinkError({
86
+ code: ERROR_CODES.PROVIDER_NOT_AVAILABLE,
87
+ message: `Replicate predictions submit failed: ${response.status} — ${sanitizeForLog(raw, 500)}`,
88
+ category: ErrorCategory.NETWORK,
89
+ severity: ErrorSeverity.HIGH,
90
+ retriable: response.status >= 500,
91
+ });
92
+ }
93
+ return (await response.json());
94
+ }
95
+ /**
96
+ * Poll a Replicate prediction until it reaches a terminal status
97
+ * (succeeded / failed / canceled) or the total timeout elapses.
98
+ */
99
+ export async function pollPrediction(auth, predictionId, options = {}) {
100
+ const baseUrl = auth.baseUrl ?? "https://api.replicate.com";
101
+ const startTime = Date.now();
102
+ const totalTimeout = options.timeoutMs ?? DEFAULT_TOTAL_TIMEOUT_MS;
103
+ const pollInterval = options.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
104
+ while (Date.now() - startTime < totalTimeout) {
105
+ if (options.abortSignal?.aborted) {
106
+ throw new NeuroLinkError({
107
+ code: ERROR_CODES.OPERATION_ABORTED,
108
+ message: "Replicate poll aborted by caller",
109
+ category: ErrorCategory.ABORT,
110
+ severity: ErrorSeverity.LOW,
111
+ retriable: false,
112
+ });
113
+ }
114
+ const controller = new AbortController();
115
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
116
+ // Forward caller abort into the in-flight fetch request.
117
+ const onCallerAbort = () => controller.abort();
118
+ options.abortSignal?.addEventListener("abort", onCallerAbort, {
119
+ once: true,
120
+ });
121
+ let response;
122
+ try {
123
+ response = await fetch(`${baseUrl}/v1/predictions/${predictionId}`, {
124
+ method: "GET",
125
+ headers: { Authorization: `Token ${auth.apiToken}` },
126
+ signal: controller.signal,
127
+ });
128
+ }
129
+ catch (err) {
130
+ if (err instanceof NeuroLinkError) {
131
+ throw err;
132
+ }
133
+ if (err instanceof Error && err.name === "AbortError") {
134
+ // Distinguish caller abort from internal timeout abort.
135
+ if (options.abortSignal?.aborted) {
136
+ throw new NeuroLinkError({
137
+ code: ERROR_CODES.OPERATION_ABORTED,
138
+ message: "Replicate poll aborted by caller",
139
+ category: ErrorCategory.ABORT,
140
+ severity: ErrorSeverity.LOW,
141
+ retriable: false,
142
+ originalError: err,
143
+ });
144
+ }
145
+ throw new NeuroLinkError({
146
+ code: ERROR_CODES.OPERATION_ABORTED,
147
+ message: `Replicate poll request timed out after ${REQUEST_TIMEOUT_MS / 1000}s`,
148
+ category: ErrorCategory.TIMEOUT,
149
+ severity: ErrorSeverity.HIGH,
150
+ retriable: true,
151
+ originalError: err,
152
+ });
153
+ }
154
+ throw err;
155
+ }
156
+ finally {
157
+ options.abortSignal?.removeEventListener("abort", onCallerAbort);
158
+ clearTimeout(timeoutId);
159
+ }
160
+ if (!response.ok) {
161
+ const raw = await response.text();
162
+ throw new NeuroLinkError({
163
+ code: ERROR_CODES.PROVIDER_NOT_AVAILABLE,
164
+ message: `Replicate poll failed: ${response.status} — ${sanitizeForLog(raw, 500)}`,
165
+ category: ErrorCategory.NETWORK,
166
+ severity: ErrorSeverity.HIGH,
167
+ retriable: response.status >= 500,
168
+ });
169
+ }
170
+ const pred = (await response.json());
171
+ if (pred.status === "succeeded") {
172
+ return pred;
173
+ }
174
+ if (pred.status === "failed" || pred.status === "canceled") {
175
+ throw new NeuroLinkError({
176
+ code: ERROR_CODES.PROVIDER_NOT_AVAILABLE,
177
+ message: `Replicate prediction ${pred.id} ${pred.status}: ${pred.error ?? "unknown"}`,
178
+ category: ErrorCategory.EXECUTION,
179
+ severity: ErrorSeverity.HIGH,
180
+ retriable: pred.status === "failed",
181
+ });
182
+ }
183
+ // Abortable sleep: resolves after pollInterval but rejects immediately
184
+ // if the caller's AbortSignal fires, preventing up to pollInterval ms
185
+ // of unnecessary blocking.
186
+ await new Promise((resolve, reject) => {
187
+ const onAbort = () => {
188
+ clearTimeout(timer);
189
+ reject(new NeuroLinkError({
190
+ code: ERROR_CODES.OPERATION_ABORTED,
191
+ message: "Replicate poll aborted by caller",
192
+ category: ErrorCategory.ABORT,
193
+ severity: ErrorSeverity.LOW,
194
+ retriable: false,
195
+ }));
196
+ };
197
+ const timer = setTimeout(() => {
198
+ // Remove the abort listener when the timer fires normally so stale
199
+ // listeners do not accumulate across many poll iterations.
200
+ options.abortSignal?.removeEventListener("abort", onAbort);
201
+ resolve();
202
+ }, pollInterval);
203
+ options.abortSignal?.addEventListener("abort", onAbort, { once: true });
204
+ });
205
+ }
206
+ throw new NeuroLinkError({
207
+ code: ERROR_CODES.OPERATION_ABORTED,
208
+ message: `Replicate prediction ${predictionId} did not complete within ${Math.round(totalTimeout / 1000)}s`,
209
+ category: ErrorCategory.TIMEOUT,
210
+ severity: ErrorSeverity.HIGH,
211
+ retriable: true,
212
+ });
213
+ }
214
+ /**
215
+ * Submit + poll. Combines `createPrediction` + `pollPrediction`.
216
+ *
217
+ * Uses `Prefer: wait=60` in the submit call so short jobs complete in the
218
+ * initial POST and bypass polling entirely.
219
+ */
220
+ export async function predict(auth, input, options = {}) {
221
+ const submitted = await createPrediction(auth, input);
222
+ if (submitted.status === "succeeded") {
223
+ return submitted;
224
+ }
225
+ if (submitted.status === "failed" || submitted.status === "canceled") {
226
+ throw new NeuroLinkError({
227
+ code: ERROR_CODES.PROVIDER_NOT_AVAILABLE,
228
+ message: `Replicate prediction ${submitted.id} ${submitted.status} on submit: ${submitted.error ?? "unknown"}`,
229
+ category: ErrorCategory.EXECUTION,
230
+ severity: ErrorSeverity.HIGH,
231
+ retriable: submitted.status === "failed",
232
+ });
233
+ }
234
+ return pollPrediction(auth, submitted.id, options);
235
+ }
236
+ /**
237
+ * Download a Replicate prediction's binary output.
238
+ *
239
+ * Replicate models return either a single URL string or an array of URL
240
+ * strings (multi-output models). For models that return base64 directly,
241
+ * use a model-specific helper instead.
242
+ *
243
+ * @param prediction The completed prediction to download.
244
+ * @param maxBytes Maximum bytes allowed. Defaults to {@link MAX_VIDEO_BYTES}
245
+ * (256 MiB). Pass {@link MAX_AUDIO_BYTES} for music/TTS
246
+ * outputs or {@link MAX_IMAGE_BYTES} for image outputs.
247
+ */
248
+ export async function downloadPredictionOutput(prediction, maxBytes = MAX_VIDEO_BYTES) {
249
+ const output = prediction.output;
250
+ const url = Array.isArray(output) ? output[0] : output;
251
+ if (typeof url !== "string") {
252
+ throw new NeuroLinkError({
253
+ code: ERROR_CODES.PROVIDER_NOT_AVAILABLE,
254
+ message: `Replicate prediction ${prediction.id} output is not a URL: ${typeof output}`,
255
+ category: ErrorCategory.EXECUTION,
256
+ severity: ErrorSeverity.HIGH,
257
+ retriable: false,
258
+ });
259
+ }
260
+ try {
261
+ const buffer = await safeDownload(url, {
262
+ maxBytes,
263
+ label: `Replicate prediction ${prediction.id}`,
264
+ timeoutMs: REQUEST_TIMEOUT_MS,
265
+ });
266
+ logger.debug(`[Replicate] Downloaded prediction ${prediction.id} output: ${buffer.length} bytes`);
267
+ return buffer;
268
+ }
269
+ catch (err) {
270
+ if (err instanceof NeuroLinkError) {
271
+ throw err;
272
+ }
273
+ const message = err instanceof Error ? err.message : String(err);
274
+ throw new NeuroLinkError({
275
+ code: ERROR_CODES.PROVIDER_NOT_AVAILABLE,
276
+ message: `Replicate output download failed: ${message} — ${url}`,
277
+ category: ErrorCategory.NETWORK,
278
+ severity: ErrorSeverity.HIGH,
279
+ retriable: true,
280
+ originalError: err instanceof Error ? err : undefined,
281
+ });
282
+ }
283
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Kling Video Handler (PiAPI)
3
+ *
4
+ * Image-to-video generation via PiAPI's Kling endpoint. Async job model:
5
+ * POST /image-to-video → poll /task/{id} until completed.
6
+ *
7
+ * NOTE: PiAPI Kling requires a publicly accessible image URL, not inline
8
+ * base64 data. Callers must supply `options.imageUrl` (a URL string) when
9
+ * using KlingVideoHandler. The `image` Buffer parameter is still accepted
10
+ * for interface compatibility (e.g., metadata / downstream use) but is not
11
+ * sent to the API. A clear error is thrown if no URL is provided.
12
+ *
13
+ * @module adapters/video/klingVideoHandler
14
+ * @see https://piapi.ai/docs/kling-api
15
+ */
16
+ import type { VideoGenerationResult, VideoHandler, VideoOutputOptions } from "../../types/index.js";
17
+ /**
18
+ * Kling Video Handler.
19
+ *
20
+ * Auth: `Authorization: Bearer ${KLING_API_KEY}` (PiAPI / Kling key).
21
+ * Models: kling-1.6-i2v (default), kling-1.5-i2v, kling-1.0.
22
+ */
23
+ export declare class KlingVideoHandler implements VideoHandler {
24
+ readonly maxDurationSeconds = 10;
25
+ readonly supportedAspectRatios: readonly ("9:16" | "16:9" | "1:1")[];
26
+ readonly supportedResolutions: readonly ("720p" | "1080p")[];
27
+ private readonly apiKey;
28
+ private readonly baseUrl;
29
+ constructor(apiKey?: string);
30
+ isConfigured(): boolean;
31
+ generate(image: Buffer, prompt: string, options: VideoOutputOptions): Promise<VideoGenerationResult>;
32
+ private submitJob;
33
+ private pollUntilComplete;
34
+ private downloadVideo;
35
+ private fetchWithTimeout;
36
+ private calculateDimensions;
37
+ }