@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,164 @@
1
+ import { createOpenAI } from "@ai-sdk/openai";
2
+ import { stepCountIs, streamText } from "ai";
3
+ import { FireworksModels } 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 { createFireworksConfig, 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 FIREWORKS_DEFAULT_BASE_URL = "https://api.fireworks.ai/inference/v1";
18
+ const getFireworksApiKey = () => validateApiKey(createFireworksConfig());
19
+ const getDefaultFireworksModel = () => getProviderModel("FIREWORKS_MODEL", FireworksModels.DEEPSEEK_V4_PRO);
20
+ /**
21
+ * Fireworks AI Provider
22
+ *
23
+ * Hosted open-model serving at api.fireworks.ai/inference/v1
24
+ * (OpenAI-compatible). Best for low-latency at scale on Llama / Mixtral /
25
+ * Qwen / DeepSeek.
26
+ *
27
+ * @see https://docs.fireworks.ai/api-reference/introduction
28
+ */
29
+ export class FireworksProvider extends BaseProvider {
30
+ model;
31
+ apiKey;
32
+ baseURL;
33
+ constructor(modelName, sdk, _region, credentials) {
34
+ const validatedNeurolink = isNeuroLink(sdk) ? sdk : undefined;
35
+ super(modelName, "fireworks", validatedNeurolink);
36
+ const overrideApiKey = credentials?.apiKey?.trim();
37
+ this.apiKey =
38
+ overrideApiKey && overrideApiKey.length > 0
39
+ ? overrideApiKey
40
+ : getFireworksApiKey();
41
+ this.baseURL =
42
+ credentials?.baseURL ??
43
+ process.env.FIREWORKS_BASE_URL ??
44
+ FIREWORKS_DEFAULT_BASE_URL;
45
+ const fireworks = createOpenAI({
46
+ apiKey: this.apiKey,
47
+ baseURL: this.baseURL,
48
+ fetch: createLoggingFetch("fireworks"),
49
+ });
50
+ this.model = fireworks.chat(this.modelName);
51
+ logger.debug("Fireworks 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]: "fireworks",
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
+ const startTime = Date.now();
72
+ const timeout = this.getTimeout(options);
73
+ const timeoutController = createTimeoutController(timeout, this.providerName, "stream");
74
+ try {
75
+ const shouldUseTools = !options.disableTools && this.supportsTools();
76
+ const tools = shouldUseTools
77
+ ? options.tools || (await this.getAllTools())
78
+ : {};
79
+ const messages = await this.buildMessagesForStream(options);
80
+ const model = await this.getAISDKModelWithMiddleware(options);
81
+ const result = await streamText({
82
+ model,
83
+ messages,
84
+ temperature: options.temperature,
85
+ maxOutputTokens: options.maxTokens,
86
+ tools,
87
+ stopWhen: stepCountIs(options.maxSteps || DEFAULT_MAX_STEPS),
88
+ toolChoice: resolveToolChoice(options, tools, shouldUseTools),
89
+ abortSignal: composeAbortSignals(options.abortSignal, timeoutController?.controller.signal),
90
+ experimental_telemetry: this.telemetryHandler.getTelemetryConfig(options),
91
+ experimental_repairToolCall: this.getToolCallRepairFn(options),
92
+ onStepFinish: ({ toolCalls, toolResults }) => {
93
+ emitToolEndFromStepFinish(this.neurolink?.getEventEmitter(), toolResults);
94
+ this.handleToolExecutionStorage(toolCalls, toolResults, options, new Date()).catch((error) => {
95
+ logger.warn("[FireworksProvider] Failed to store tool executions", {
96
+ provider: this.providerName,
97
+ error: error instanceof Error ? error.message : String(error),
98
+ });
99
+ });
100
+ },
101
+ });
102
+ timeoutController?.cleanup();
103
+ const transformedStream = this.createTextStream(result);
104
+ const analyticsPromise = streamAnalyticsCollector.createAnalytics(this.providerName, this.modelName, toAnalyticsStreamResult(result), Date.now() - startTime, {
105
+ requestId: `fireworks-stream-${Date.now()}`,
106
+ streamingMode: true,
107
+ });
108
+ return {
109
+ stream: transformedStream,
110
+ provider: this.providerName,
111
+ model: this.modelName,
112
+ analytics: analyticsPromise,
113
+ metadata: { startTime, streamId: `fireworks-${Date.now()}` },
114
+ };
115
+ }
116
+ catch (error) {
117
+ timeoutController?.cleanup();
118
+ throw this.handleProviderError(error);
119
+ }
120
+ }
121
+ getProviderName() {
122
+ return this.providerName;
123
+ }
124
+ getDefaultModel() {
125
+ return getDefaultFireworksModel();
126
+ }
127
+ getAISDKModel() {
128
+ return this.model;
129
+ }
130
+ formatProviderError(error) {
131
+ if (error instanceof TimeoutError) {
132
+ return new NetworkError(`Request timed out: ${error.message}`, "fireworks");
133
+ }
134
+ const errorRecord = error;
135
+ const message = typeof errorRecord?.message === "string"
136
+ ? errorRecord.message
137
+ : "Unknown error";
138
+ if (message.includes("Invalid API key") ||
139
+ message.includes("Authentication") ||
140
+ message.includes("401")) {
141
+ return new AuthenticationError("Invalid Fireworks API key. Get one at https://fireworks.ai/account/api-keys", "fireworks");
142
+ }
143
+ if (message.includes("rate limit") || message.includes("429")) {
144
+ return new RateLimitError("Fireworks rate limit exceeded. Back off and retry.", "fireworks");
145
+ }
146
+ if (message.includes("model_not_found") || message.includes("404")) {
147
+ return new InvalidModelError(`Fireworks model '${this.modelName}' not found. Browse https://fireworks.ai/models`, "fireworks");
148
+ }
149
+ return new ProviderError(`Fireworks error: ${message}`, "fireworks");
150
+ }
151
+ async validateConfiguration() {
152
+ return typeof this.apiKey === "string" && this.apiKey.trim().length > 0;
153
+ }
154
+ getConfiguration() {
155
+ return {
156
+ provider: this.providerName,
157
+ model: this.modelName,
158
+ defaultModel: getDefaultFireworksModel(),
159
+ baseURL: this.baseURL,
160
+ };
161
+ }
162
+ }
163
+ export default FireworksProvider;
164
+ //# sourceMappingURL=fireworks.js.map
@@ -3,7 +3,7 @@ import { ErrorCategory, ErrorSeverity, GoogleAIModels, } from "../constants/enum
3
3
  import { BaseProvider } from "../core/baseProvider.js";
4
4
  import { IMAGE_GENERATION_MODELS } from "../core/constants.js";
5
5
  import { processUnifiedFilesArray } from "../utils/messageBuilder.js";
6
- import { ATTR, tracers, withClientSpan } from "../telemetry/index.js";
6
+ import { ATTR, tracers, withClientSpan, withClientStreamSpan, withSpan, } from "../telemetry/index.js";
7
7
  import { AuthenticationError, InvalidModelError, NetworkError, ProviderError, RateLimitError, } from "../types/index.js";
8
8
  import { ERROR_CODES, NeuroLinkError } from "../utils/errorHandling.js";
9
9
  import { logger } from "../utils/logger.js";
@@ -481,7 +481,7 @@ export class GoogleAIStudioProvider extends BaseProvider {
481
481
  */
482
482
  async executeNativeGemini3Stream(options) {
483
483
  const modelName = options.model || this.modelName;
484
- return withClientSpan({
484
+ return withClientStreamSpan({
485
485
  name: "neurolink.provider.stream",
486
486
  tracer: tracers.provider,
487
487
  attributes: {
@@ -521,12 +521,14 @@ export class GoogleAIStudioProvider extends BaseProvider {
521
521
  // Convert tools
522
522
  let toolsConfig;
523
523
  let executeMap = new Map();
524
+ let originalNameMap = new Map();
524
525
  if (options.tools &&
525
526
  Object.keys(options.tools).length > 0 &&
526
527
  !options.disableTools) {
527
528
  const result = buildNativeToolDeclarations(options.tools);
528
529
  toolsConfig = result.toolsConfig;
529
530
  executeMap = result.executeMap;
531
+ originalNameMap = result.originalNameMap;
530
532
  logger.debug("[GoogleAIStudio] Converted tools for native SDK", {
531
533
  toolCount: toolsConfig[0].functionDeclarations.length,
532
534
  toolNames: toolsConfig[0].functionDeclarations.map((t) => t.name),
@@ -625,7 +627,7 @@ export class GoogleAIStudioProvider extends BaseProvider {
625
627
  logger.debug(`[GoogleAIStudio] Executing ${chunkResult.stepFunctionCalls.length} function calls`);
626
628
  // Add model response with ALL parts (including thoughtSignature) to history
627
629
  pushModelResponseToHistory(currentContents, chunkResult.rawResponseParts, chunkResult.stepFunctionCalls);
628
- const functionResponses = await executeNativeToolCalls("[GoogleAIStudio]", chunkResult.stepFunctionCalls, executeMap, failedTools, allToolCalls, { abortSignal: composedSignal });
630
+ const functionResponses = await executeNativeToolCalls("[GoogleAIStudio]", chunkResult.stepFunctionCalls, executeMap, failedTools, allToolCalls, { abortSignal: composedSignal, originalNameMap });
629
631
  // Add function responses to history — the @google/genai SDK
630
632
  // only accepts "user" and "model" as valid roles in contents.
631
633
  // Function/tool responses must use role: "user" (matching the
@@ -694,7 +696,7 @@ export class GoogleAIStudioProvider extends BaseProvider {
694
696
  finally {
695
697
  // Timeout controller cleanup is managed inside the background loop
696
698
  }
697
- });
699
+ }, (r) => r.stream, (r, wrapped) => ({ ...r, stream: wrapped }));
698
700
  }
699
701
  /**
700
702
  * Execute generate using native @google/genai SDK for Gemini 3 models
@@ -743,6 +745,7 @@ export class GoogleAIStudioProvider extends BaseProvider {
743
745
  // Convert tools (a0269210: trust options.tools — already merged + filtered upstream)
744
746
  let toolsConfig;
745
747
  let executeMap = new Map();
748
+ let originalNameMap = new Map();
746
749
  const shouldUseTools = !options.disableTools;
747
750
  if (shouldUseTools) {
748
751
  const tools = options.tools || {};
@@ -750,6 +753,7 @@ export class GoogleAIStudioProvider extends BaseProvider {
750
753
  const result = buildNativeToolDeclarations(tools);
751
754
  toolsConfig = result.toolsConfig;
752
755
  executeMap = result.executeMap;
756
+ originalNameMap = result.originalNameMap;
753
757
  logger.debug("[GoogleAIStudio] Converted tools for native SDK generate", {
754
758
  toolCount: toolsConfig[0].functionDeclarations.length,
755
759
  toolNames: toolsConfig[0].functionDeclarations.map((t) => t.name),
@@ -818,7 +822,11 @@ export class GoogleAIStudioProvider extends BaseProvider {
818
822
  // Add model response with ALL parts (including thoughtSignature) to history
819
823
  // This is critical for Gemini 3 - it requires thought signatures in subsequent turns
820
824
  pushModelResponseToHistory(currentContents, chunkResult.rawResponseParts, chunkResult.stepFunctionCalls);
821
- const functionResponses = await executeNativeToolCalls("[GoogleAIStudio]", chunkResult.stepFunctionCalls, executeMap, failedTools, allToolCalls, { toolExecutions, abortSignal: composedSignal });
825
+ const functionResponses = await executeNativeToolCalls("[GoogleAIStudio]", chunkResult.stepFunctionCalls, executeMap, failedTools, allToolCalls, {
826
+ toolExecutions,
827
+ abortSignal: composedSignal,
828
+ originalNameMap,
829
+ });
822
830
  // Add function responses to history — the @google/genai SDK
823
831
  // only accepts "user" and "model" as valid roles in contents.
824
832
  // Function/tool responses must use role: "user" (matching the
@@ -886,6 +894,13 @@ export class GoogleAIStudioProvider extends BaseProvider {
886
894
  logger.info("[GoogleAIStudio] Routing image generation model to executeImageGeneration", { model: modelName });
887
895
  return this.executeImageGeneration(options);
888
896
  }
897
+ // TTS direct-synthesis mode: synthesise the input text directly (no LLM
898
+ // call). BaseProvider.runGenerateInActiveContext does the same dispatch
899
+ // — replicated here because AI Studio's override bypasses that path.
900
+ if (options.tts?.enabled && !options.tts?.useAiResponse) {
901
+ logger.info("[GoogleAIStudio] Routing TTS direct-synthesis to handleDirectTTSSynthesis", { model: modelName });
902
+ return this.handleDirectTTSSynthesis(options, Date.now());
903
+ }
889
904
  // Process the unified `input.files` array before routing to the
890
905
  // native SDK. BaseProvider.generate() runs this preprocessing via
891
906
  // buildMultimodalMessagesArray, but AI Studio's override skips it,
@@ -940,7 +955,23 @@ export class GoogleAIStudioProvider extends BaseProvider {
940
955
  mergedOptions.prompt ||
941
956
  "";
942
957
  try {
943
- const result = await this.executeNativeGemini3Generate(mergedOptions);
958
+ // Wrap in `neurolink.executeGeneration` so the observability span
959
+ // chain (Test: Generate Span Chain) sees a third inner span on the
960
+ // native @google/genai path — Pipeline A providers get this from
961
+ // GenerationHandler.executeGeneration; the native path bypasses
962
+ // GenerationHandler so we add the span here.
963
+ let result = await withSpan({
964
+ name: "neurolink.executeGeneration",
965
+ tracer: tracers.provider,
966
+ attributes: {
967
+ [ATTR.GEN_AI_SYSTEM]: this.providerName,
968
+ [ATTR.GEN_AI_MODEL]: modelName,
969
+ "neurolink.path": "native.google-genai",
970
+ },
971
+ }, async () => this.executeNativeGemini3Generate(mergedOptions));
972
+ // Pipe through TTS-of-AI-response when caller asks for it. No-op when
973
+ // tts is disabled or useAiResponse is false.
974
+ result = await this.synthesizeAIResponseIfNeeded(result, options);
944
975
  this.emitPipelineBGenerationEvent(modelName, result, generateStartTime, true, undefined, inputPrompt);
945
976
  return result;
946
977
  }
@@ -963,6 +994,14 @@ export class GoogleAIStudioProvider extends BaseProvider {
963
994
  const usage = result?.usage && typeof result.usage === "object"
964
995
  ? result.usage
965
996
  : { input: 0, output: 0, total: 0 };
997
+ // Mark on the result so the SDK-level runStandardGenerateRequest knows
998
+ // this provider already emitted `generation:end` itself and skips its
999
+ // own duplicate emission. Without this flag the public event listener
1000
+ // (and the observability test) would see two events per generate call.
1001
+ if (result && typeof result === "object") {
1002
+ result._generationEndEmitted =
1003
+ true;
1004
+ }
966
1005
  emitter.emit("generation:end", {
967
1006
  provider: this.providerName,
968
1007
  responseTime: Date.now() - startTime,
@@ -10,6 +10,19 @@
10
10
  */
11
11
  import { type Tool } from "ai";
12
12
  import type { ThinkingConfig, CollectedChunkResult, NativeFunctionCall, NativeFunctionResponse, NativeToolDeclarationsResult, NativeToolsConfig, TextChannel, VertexNativePart, GeminiMultimodalInput } from "../types/index.js";
13
+ export declare function sanitizeForGoogleFunctionName(name: string): string;
14
+ /**
15
+ * Resolve a sanitized Gemini tool name to one that is both unique within
16
+ * the current request and at most 128 characters. When the candidate
17
+ * collides with an already-used name we append `_2`, `_3`, … — but
18
+ * reserve room for the suffix by truncating the base first so the
19
+ * resolved name never exceeds Google's `function_declarations[].name`
20
+ * limit.
21
+ *
22
+ * @param base The already-sanitized candidate name.
23
+ * @param isTaken Predicate that returns true if `name` is already used.
24
+ */
25
+ export declare function resolveUniqueGoogleFunctionName(base: string, isTaken: (name: string) => boolean): string;
13
26
  /**
14
27
  * Sanitize a JSON Schema for Gemini's proto-based API.
15
28
  *
@@ -35,6 +48,12 @@ export declare function sanitizeSchemaForGemini(schema: Record<string, unknown>)
35
48
  export declare function sanitizeToolsForGemini(tools: Record<string, Tool>): {
36
49
  tools: Record<string, Tool>;
37
50
  dropped: string[];
51
+ /**
52
+ * Reverse map: Google-safe sanitized name → original consumer-supplied
53
+ * name. Lets the calling layer translate tool-call results back so the
54
+ * sanitization stays transport-only (see CodeRabbit thread, PR #1006).
55
+ */
56
+ originalNameMap: Map<string, string>;
38
57
  };
39
58
  export declare function normalizeToolsForJsonSchemaProvider(tools: Record<string, Tool>): {
40
59
  tools: Record<string, Tool>;
@@ -128,7 +147,10 @@ export declare function extractTextFromParts(rawResponseParts: unknown[]): strin
128
147
  * @param executeMap - Map of tool name to execute function
129
148
  * @param failedTools - Mutable map tracking per-tool failure counts
130
149
  * @param allToolCalls - Mutable array accumulating all tool call records
131
- * @param options - Optional settings for execution tracking and cancellation
150
+ * @param options - Optional settings for execution tracking and cancellation,
151
+ * plus an `originalNameMap` (Google-safe → consumer-supplied
152
+ * identifier) so the sanitization stays transport-only and
153
+ * consumers see the names they registered.
132
154
  * @returns Array of function responses for conversation history
133
155
  */
134
156
  export declare function executeNativeToolCalls(logLabel: string, stepFunctionCalls: NativeFunctionCall[], executeMap: Map<string, Tool["execute"]>, failedTools: Map<string, {
@@ -144,6 +166,7 @@ export declare function executeNativeToolCalls(logLabel: string, stepFunctionCal
144
166
  output: unknown;
145
167
  }>;
146
168
  abortSignal?: AbortSignal;
169
+ originalNameMap?: Map<string, string>;
147
170
  }): Promise<NativeFunctionResponse[]>;
148
171
  /**
149
172
  * Handle maxSteps termination by producing a final text when the model