@juspay/neurolink 7.50.0 → 7.51.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 (242) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +12 -9
  3. package/dist/adapters/providerImageAdapter.js +82 -10
  4. package/dist/agent/directTools.d.ts +10 -10
  5. package/dist/agent/directTools.js +5 -3
  6. package/dist/cli/commands/config.js +1 -0
  7. package/dist/cli/commands/mcp.js +1 -0
  8. package/dist/cli/commands/models.js +1 -0
  9. package/dist/cli/commands/ollama.js +1 -0
  10. package/dist/cli/commands/setup-anthropic.js +1 -0
  11. package/dist/cli/commands/setup-azure.js +1 -0
  12. package/dist/cli/commands/setup-bedrock.js +1 -0
  13. package/dist/cli/commands/setup-gcp.js +1 -0
  14. package/dist/cli/commands/setup-google-ai.js +1 -0
  15. package/dist/cli/commands/setup-huggingface.js +1 -0
  16. package/dist/cli/commands/setup-mistral.js +1 -0
  17. package/dist/cli/commands/setup-openai.js +1 -0
  18. package/dist/cli/commands/setup.js +1 -0
  19. package/dist/cli/errorHandler.js +1 -0
  20. package/dist/cli/factories/commandFactory.d.ts +1 -0
  21. package/dist/cli/factories/commandFactory.js +23 -6
  22. package/dist/cli/factories/ollamaCommandFactory.js +1 -0
  23. package/dist/cli/factories/sagemakerCommandFactory.js +1 -0
  24. package/dist/cli/factories/setupCommandFactory.js +1 -0
  25. package/dist/cli/index.js +1 -0
  26. package/dist/cli/loop/conversationSelector.js +1 -0
  27. package/dist/cli/loop/optionsSchema.js +1 -0
  28. package/dist/cli/loop/session.js +1 -0
  29. package/dist/cli/parser.js +1 -0
  30. package/dist/cli/utils/completeSetup.js +1 -0
  31. package/dist/cli/utils/envManager.js +1 -0
  32. package/dist/cli/utils/interactiveSetup.js +1 -0
  33. package/dist/cli/utils/ollamaUtils.js +1 -0
  34. package/dist/constants/index.js +1 -1
  35. package/dist/core/baseProvider.d.ts +5 -0
  36. package/dist/core/baseProvider.js +70 -20
  37. package/dist/index.d.ts +3 -3
  38. package/dist/lib/adapters/providerImageAdapter.js +83 -10
  39. package/dist/lib/agent/directTools.d.ts +10 -10
  40. package/dist/lib/agent/directTools.js +6 -3
  41. package/dist/lib/config/configManager.js +1 -0
  42. package/dist/lib/config/conversationMemory.js +1 -0
  43. package/dist/lib/config/taskClassificationConfig.js +1 -0
  44. package/dist/lib/constants/index.js +2 -1
  45. package/dist/lib/constants/performance.js +1 -0
  46. package/dist/lib/constants/retry.js +1 -0
  47. package/dist/lib/constants/timeouts.js +1 -0
  48. package/dist/lib/constants/tokens.js +1 -0
  49. package/dist/lib/core/analytics.js +1 -0
  50. package/dist/lib/core/baseProvider.d.ts +5 -0
  51. package/dist/lib/core/baseProvider.js +71 -20
  52. package/dist/lib/core/constants.js +1 -0
  53. package/dist/lib/core/conversationMemoryFactory.js +1 -0
  54. package/dist/lib/core/conversationMemoryInitializer.js +1 -0
  55. package/dist/lib/core/conversationMemoryManager.js +1 -0
  56. package/dist/lib/core/dynamicModels.js +1 -0
  57. package/dist/lib/core/evaluation.js +1 -0
  58. package/dist/lib/core/evaluationProviders.js +1 -0
  59. package/dist/lib/core/factory.js +1 -0
  60. package/dist/lib/core/modelConfiguration.js +1 -0
  61. package/dist/lib/core/redisConversationMemoryManager.js +1 -0
  62. package/dist/lib/core/serviceRegistry.js +1 -0
  63. package/dist/lib/core/streamAnalytics.js +1 -0
  64. package/dist/lib/evaluation/contextBuilder.js +1 -0
  65. package/dist/lib/evaluation/index.js +1 -0
  66. package/dist/lib/evaluation/prompts.js +1 -0
  67. package/dist/lib/evaluation/ragasEvaluator.js +1 -0
  68. package/dist/lib/evaluation/retryManager.js +1 -0
  69. package/dist/lib/evaluation/scoring.js +1 -0
  70. package/dist/lib/factories/providerFactory.js +1 -0
  71. package/dist/lib/factories/providerRegistry.js +1 -0
  72. package/dist/lib/hitl/hitlErrors.js +1 -0
  73. package/dist/lib/hitl/hitlManager.js +1 -0
  74. package/dist/lib/hitl/index.js +1 -0
  75. package/dist/lib/hitl/types.js +1 -0
  76. package/dist/lib/index.d.ts +3 -3
  77. package/dist/lib/index.js +1 -0
  78. package/dist/lib/mcp/externalServerManager.js +1 -0
  79. package/dist/lib/mcp/factory.js +1 -0
  80. package/dist/lib/mcp/flexibleToolValidator.js +1 -0
  81. package/dist/lib/mcp/index.js +1 -0
  82. package/dist/lib/mcp/mcpCircuitBreaker.js +1 -0
  83. package/dist/lib/mcp/mcpClientFactory.js +2 -1
  84. package/dist/lib/mcp/registry.js +1 -0
  85. package/dist/lib/mcp/servers/agent/directToolsServer.js +2 -0
  86. package/dist/lib/mcp/servers/aiProviders/aiAnalysisTools.js +1 -0
  87. package/dist/lib/mcp/servers/aiProviders/aiCoreServer.js +1 -0
  88. package/dist/lib/mcp/servers/aiProviders/aiWorkflowTools.js +1 -0
  89. package/dist/lib/mcp/servers/utilities/utilityServer.js +1 -0
  90. package/dist/lib/mcp/toolDiscoveryService.js +1 -0
  91. package/dist/lib/mcp/toolRegistry.js +1 -0
  92. package/dist/lib/memory/mem0Initializer.js +1 -0
  93. package/dist/lib/middleware/builtin/analytics.js +1 -0
  94. package/dist/lib/middleware/builtin/autoEvaluation.js +1 -0
  95. package/dist/lib/middleware/builtin/guardrails.js +1 -0
  96. package/dist/lib/middleware/factory.js +1 -0
  97. package/dist/lib/middleware/index.js +1 -0
  98. package/dist/lib/middleware/registry.js +1 -0
  99. package/dist/lib/middleware/utils/guardrailsUtils.js +1 -0
  100. package/dist/lib/models/modelRegistry.js +1 -0
  101. package/dist/lib/models/modelResolver.js +2 -0
  102. package/dist/lib/neurolink.d.ts +6 -0
  103. package/dist/lib/neurolink.js +135 -5
  104. package/dist/lib/providers/amazonBedrock.d.ts +1 -0
  105. package/dist/lib/providers/amazonBedrock.js +166 -14
  106. package/dist/lib/providers/amazonSagemaker.js +1 -0
  107. package/dist/lib/providers/anthropic.js +7 -21
  108. package/dist/lib/providers/anthropicBaseProvider.js +1 -0
  109. package/dist/lib/providers/azureOpenai.js +5 -21
  110. package/dist/lib/providers/googleAiStudio.js +5 -21
  111. package/dist/lib/providers/googleVertex.js +8 -1
  112. package/dist/lib/providers/huggingFace.js +34 -3
  113. package/dist/lib/providers/index.js +1 -0
  114. package/dist/lib/providers/litellm.js +34 -3
  115. package/dist/lib/providers/mistral.js +32 -2
  116. package/dist/lib/providers/ollama.d.ts +37 -1
  117. package/dist/lib/providers/ollama.js +544 -58
  118. package/dist/lib/providers/openAI.js +5 -21
  119. package/dist/lib/providers/openaiCompatible.js +41 -4
  120. package/dist/lib/providers/sagemaker/adaptive-semaphore.js +1 -0
  121. package/dist/lib/providers/sagemaker/client.js +1 -0
  122. package/dist/lib/providers/sagemaker/config.js +1 -0
  123. package/dist/lib/providers/sagemaker/detection.js +1 -0
  124. package/dist/lib/providers/sagemaker/diagnostics.js +1 -0
  125. package/dist/lib/providers/sagemaker/error-constants.js +1 -0
  126. package/dist/lib/providers/sagemaker/errors.js +1 -0
  127. package/dist/lib/providers/sagemaker/index.js +1 -0
  128. package/dist/lib/providers/sagemaker/language-model.js +1 -0
  129. package/dist/lib/providers/sagemaker/parsers.js +1 -0
  130. package/dist/lib/providers/sagemaker/streaming.js +1 -0
  131. package/dist/lib/providers/sagemaker/structured-parser.js +1 -0
  132. package/dist/lib/proxy/awsProxyIntegration.js +1 -0
  133. package/dist/lib/proxy/proxyFetch.js +1 -0
  134. package/dist/lib/proxy/utils/noProxyUtils.js +1 -0
  135. package/dist/lib/sdk/toolRegistration.js +2 -0
  136. package/dist/lib/services/server/ai/observability/instrumentation.js +1 -0
  137. package/dist/lib/session/globalSessionState.js +1 -0
  138. package/dist/lib/telemetry/index.js +1 -0
  139. package/dist/lib/telemetry/telemetryService.js +1 -0
  140. package/dist/lib/types/analytics.js +1 -0
  141. package/dist/lib/types/cli.js +1 -0
  142. package/dist/lib/types/common.js +1 -0
  143. package/dist/lib/types/configTypes.js +1 -0
  144. package/dist/lib/types/content.d.ts +14 -1
  145. package/dist/lib/types/content.js +1 -0
  146. package/dist/lib/types/contextTypes.js +1 -0
  147. package/dist/lib/types/conversation.js +1 -0
  148. package/dist/lib/types/domainTypes.js +1 -0
  149. package/dist/lib/types/errors.js +1 -0
  150. package/dist/lib/types/evaluation.js +1 -0
  151. package/dist/lib/types/evaluationProviders.js +1 -0
  152. package/dist/lib/types/evaluationTypes.js +1 -0
  153. package/dist/lib/types/externalMcp.js +1 -0
  154. package/dist/lib/types/fileTypes.d.ts +44 -0
  155. package/dist/lib/types/fileTypes.js +1 -0
  156. package/dist/lib/types/generateTypes.d.ts +1 -0
  157. package/dist/lib/types/generateTypes.js +1 -0
  158. package/dist/lib/types/guardrails.js +1 -0
  159. package/dist/lib/types/index.js +1 -0
  160. package/dist/lib/types/mcpTypes.js +1 -0
  161. package/dist/lib/types/middlewareTypes.js +1 -0
  162. package/dist/lib/types/modelTypes.js +1 -0
  163. package/dist/lib/types/observability.js +1 -0
  164. package/dist/lib/types/providers.d.ts +44 -0
  165. package/dist/lib/types/providers.js +1 -0
  166. package/dist/lib/types/sdkTypes.js +1 -0
  167. package/dist/lib/types/serviceTypes.js +1 -0
  168. package/dist/lib/types/streamTypes.d.ts +1 -0
  169. package/dist/lib/types/streamTypes.js +1 -0
  170. package/dist/lib/types/taskClassificationTypes.js +1 -0
  171. package/dist/lib/types/tools.js +2 -0
  172. package/dist/lib/types/typeAliases.js +1 -0
  173. package/dist/lib/types/universalProviderOptions.js +1 -0
  174. package/dist/lib/utils/analyticsUtils.js +1 -0
  175. package/dist/lib/utils/conversationMemory.js +1 -0
  176. package/dist/lib/utils/conversationMemoryUtils.js +1 -0
  177. package/dist/lib/utils/csvProcessor.js +1 -0
  178. package/dist/lib/utils/errorHandling.js +1 -0
  179. package/dist/lib/utils/evaluationUtils.js +1 -0
  180. package/dist/lib/utils/factoryProcessing.js +1 -0
  181. package/dist/lib/utils/fileDetector.js +7 -3
  182. package/dist/lib/utils/imageProcessor.js +1 -0
  183. package/dist/lib/utils/logger.js +1 -0
  184. package/dist/lib/utils/loopUtils.js +1 -0
  185. package/dist/lib/utils/mcpDefaults.js +1 -0
  186. package/dist/lib/utils/messageBuilder.js +96 -9
  187. package/dist/lib/utils/modelRouter.js +1 -0
  188. package/dist/lib/utils/multimodalOptionsBuilder.d.ts +67 -0
  189. package/dist/lib/utils/multimodalOptionsBuilder.js +65 -0
  190. package/dist/lib/utils/optionsConversion.js +1 -0
  191. package/dist/lib/utils/optionsUtils.js +1 -0
  192. package/dist/lib/utils/parameterValidation.js +1 -0
  193. package/dist/lib/utils/pdfProcessor.d.ts +10 -0
  194. package/dist/lib/utils/pdfProcessor.js +199 -0
  195. package/dist/lib/utils/performance.js +1 -0
  196. package/dist/lib/utils/promptRedaction.js +1 -0
  197. package/dist/lib/utils/providerConfig.js +1 -0
  198. package/dist/lib/utils/providerHealth.js +1 -0
  199. package/dist/lib/utils/providerSetupMessages.js +1 -0
  200. package/dist/lib/utils/providerUtils.js +1 -0
  201. package/dist/lib/utils/redis.js +1 -0
  202. package/dist/lib/utils/retryHandler.js +1 -0
  203. package/dist/lib/utils/schemaConversion.js +1 -0
  204. package/dist/lib/utils/taskClassificationUtils.js +1 -0
  205. package/dist/lib/utils/taskClassifier.js +1 -0
  206. package/dist/lib/utils/timeout.js +1 -0
  207. package/dist/lib/utils/tokenLimits.js +1 -0
  208. package/dist/lib/utils/toolUtils.js +1 -0
  209. package/dist/lib/utils/transformationUtils.js +1 -0
  210. package/dist/lib/utils/typeUtils.js +1 -0
  211. package/dist/mcp/mcpClientFactory.js +1 -1
  212. package/dist/mcp/servers/agent/directToolsServer.js +1 -0
  213. package/dist/models/modelResolver.js +1 -0
  214. package/dist/neurolink.d.ts +6 -0
  215. package/dist/neurolink.js +134 -5
  216. package/dist/providers/amazonBedrock.d.ts +1 -0
  217. package/dist/providers/amazonBedrock.js +165 -14
  218. package/dist/providers/anthropic.js +6 -21
  219. package/dist/providers/azureOpenai.js +4 -21
  220. package/dist/providers/googleAiStudio.js +4 -21
  221. package/dist/providers/googleVertex.js +7 -1
  222. package/dist/providers/huggingFace.js +33 -3
  223. package/dist/providers/litellm.js +33 -3
  224. package/dist/providers/mistral.js +31 -2
  225. package/dist/providers/ollama.d.ts +37 -1
  226. package/dist/providers/ollama.js +543 -58
  227. package/dist/providers/openAI.js +4 -21
  228. package/dist/providers/openaiCompatible.js +40 -4
  229. package/dist/sdk/toolRegistration.js +1 -0
  230. package/dist/types/content.d.ts +14 -1
  231. package/dist/types/fileTypes.d.ts +44 -0
  232. package/dist/types/generateTypes.d.ts +1 -0
  233. package/dist/types/providers.d.ts +44 -0
  234. package/dist/types/streamTypes.d.ts +1 -0
  235. package/dist/types/tools.js +1 -0
  236. package/dist/utils/fileDetector.js +6 -3
  237. package/dist/utils/messageBuilder.js +95 -9
  238. package/dist/utils/multimodalOptionsBuilder.d.ts +67 -0
  239. package/dist/utils/multimodalOptionsBuilder.js +64 -0
  240. package/dist/utils/pdfProcessor.d.ts +10 -0
  241. package/dist/utils/pdfProcessor.js +198 -0
  242. package/package.json +11 -20
@@ -8,6 +8,7 @@ import { AuthenticationError, NetworkError, ProviderError, RateLimitError, } fro
8
8
  import { DEFAULT_MAX_STEPS } from "../core/constants.js";
9
9
  import { streamAnalyticsCollector } from "../core/streamAnalytics.js";
10
10
  import { buildMessagesArray, buildMultimodalMessagesArray, convertToCoreMessages, } from "../utils/messageBuilder.js";
11
+ import { buildMultimodalOptions } from "../utils/multimodalOptionsBuilder.js";
11
12
  // Google AI Live API types now imported from ../types/providerSpecific.js
12
13
  // Import proper types for multimodal message handling
13
14
  // Create Google GenAI client
@@ -95,7 +96,8 @@ export class GoogleAIStudioProvider extends BaseProvider {
95
96
  const hasMultimodalInput = !!(options.input?.images?.length ||
96
97
  options.input?.content?.length ||
97
98
  options.input?.files?.length ||
98
- options.input?.csvFiles?.length);
99
+ options.input?.csvFiles?.length ||
100
+ options.input?.pdfFiles?.length);
99
101
  let messages;
100
102
  if (hasMultimodalInput) {
101
103
  logger.debug(`Google AI Studio: Detected multimodal input, using multimodal message builder`, {
@@ -104,26 +106,7 @@ export class GoogleAIStudioProvider extends BaseProvider {
104
106
  hasContent: !!options.input?.content?.length,
105
107
  contentCount: options.input?.content?.length || 0,
106
108
  });
107
- // Create multimodal options for buildMultimodalMessagesArray
108
- const multimodalOptions = {
109
- input: {
110
- text: options.input?.text || "",
111
- images: options.input?.images,
112
- content: options.input?.content,
113
- files: options.input?.files,
114
- csvFiles: options.input?.csvFiles,
115
- },
116
- csvOptions: options.csvOptions,
117
- systemPrompt: options.systemPrompt,
118
- conversationHistory: options.conversationMessages,
119
- provider: this.providerName,
120
- model: this.modelName,
121
- temperature: options.temperature,
122
- maxTokens: options.maxTokens,
123
- enableAnalytics: options.enableAnalytics,
124
- enableEvaluation: options.enableEvaluation,
125
- context: options.context,
126
- };
109
+ const multimodalOptions = buildMultimodalOptions(options, this.providerName, this.modelName);
127
110
  const mm = await buildMultimodalMessagesArray(multimodalOptions, this.providerName, this.modelName);
128
111
  // Convert multimodal messages to Vercel AI SDK format (CoreMessage[])
129
112
  messages = convertToCoreMessages(mm);
@@ -599,7 +599,8 @@ export class GoogleVertexProvider extends BaseProvider {
599
599
  const hasMultimodalInput = !!(options.input?.images?.length ||
600
600
  options.input?.content?.length ||
601
601
  options.input?.files?.length ||
602
- options.input?.csvFiles?.length);
602
+ options.input?.csvFiles?.length ||
603
+ options.input?.pdfFiles?.length);
603
604
  let messages;
604
605
  if (hasMultimodalInput) {
605
606
  logger.debug(`${functionTag}: Detected multimodal input, using multimodal message builder`, {
@@ -607,6 +608,8 @@ export class GoogleVertexProvider extends BaseProvider {
607
608
  imageCount: options.input?.images?.length || 0,
608
609
  hasContent: !!options.input?.content?.length,
609
610
  contentCount: options.input?.content?.length || 0,
611
+ hasPDFs: !!options.input?.pdfFiles?.length,
612
+ pdfCount: options.input?.pdfFiles?.length || 0,
610
613
  });
611
614
  // Create multimodal options for buildMultimodalMessagesArray
612
615
  const multimodalOptions = {
@@ -616,6 +619,7 @@ export class GoogleVertexProvider extends BaseProvider {
616
619
  content: options.input?.content,
617
620
  files: options.input?.files,
618
621
  csvFiles: options.input?.csvFiles,
622
+ pdfFiles: options.input?.pdfFiles,
619
623
  },
620
624
  csvOptions: options.csvOptions,
621
625
  systemPrompt: options.systemPrompt,
@@ -1179,6 +1183,8 @@ export class GoogleVertexProvider extends BaseProvider {
1179
1183
  /^claude-sonnet-4@\d{8}$/,
1180
1184
  /^claude-sonnet-4-5@\d{8}$/,
1181
1185
  /^claude-opus-4@\d{8}$/,
1186
+ /^claude-opus-4-1@\d{8}$/,
1187
+ /^claude-3-7-sonnet@\d{8}$/,
1182
1188
  /^claude-3-5-sonnet-\d{8}$/,
1183
1189
  /^claude-3-5-haiku-\d{8}$/,
1184
1190
  /^claude-3-sonnet-\d{8}$/,
@@ -3,8 +3,10 @@ import { streamText, } from "ai";
3
3
  import { BaseProvider } from "../core/baseProvider.js";
4
4
  import { logger } from "../utils/logger.js";
5
5
  import { createTimeoutController, TimeoutError } from "../utils/timeout.js";
6
+ import { DEFAULT_MAX_STEPS } from "../core/constants.js";
6
7
  import { validateApiKey, createHuggingFaceConfig, getProviderModel, } from "../utils/providerConfig.js";
7
- import { buildMessagesArray } from "../utils/messageBuilder.js";
8
+ import { buildMessagesArray, buildMultimodalMessagesArray, convertToCoreMessages, } from "../utils/messageBuilder.js";
9
+ import { buildMultimodalOptions } from "../utils/multimodalOptionsBuilder.js";
8
10
  import { createProxyFetch } from "../proxy/proxyFetch.js";
9
11
  // Configuration helpers - now using consolidated utility
10
12
  const getHuggingFaceApiKey = () => {
@@ -113,13 +115,41 @@ export class HuggingFaceProvider extends BaseProvider {
113
115
  try {
114
116
  // Enhanced tool handling for HuggingFace models
115
117
  const streamOptions = this.prepareStreamOptions(options, analysisSchema);
116
- // Build message array from options
117
- const messages = await buildMessagesArray(options);
118
+ // Check for multimodal input (images, PDFs, CSVs, files)
119
+ const hasMultimodalInput = !!(options.input?.images?.length ||
120
+ options.input?.content?.length ||
121
+ options.input?.files?.length ||
122
+ options.input?.csvFiles?.length ||
123
+ options.input?.pdfFiles?.length);
124
+ let messages;
125
+ if (hasMultimodalInput) {
126
+ logger.debug(`HuggingFace: Detected multimodal input, using multimodal message builder`, {
127
+ hasImages: !!options.input?.images?.length,
128
+ imageCount: options.input?.images?.length || 0,
129
+ hasContent: !!options.input?.content?.length,
130
+ contentCount: options.input?.content?.length || 0,
131
+ hasFiles: !!options.input?.files?.length,
132
+ fileCount: options.input?.files?.length || 0,
133
+ hasCSVFiles: !!options.input?.csvFiles?.length,
134
+ csvFileCount: options.input?.csvFiles?.length || 0,
135
+ hasPDFFiles: !!options.input?.pdfFiles?.length,
136
+ pdfFileCount: options.input?.pdfFiles?.length || 0,
137
+ });
138
+ const multimodalOptions = buildMultimodalOptions(options, this.providerName, this.modelName);
139
+ const mm = await buildMultimodalMessagesArray(multimodalOptions, this.providerName, this.modelName);
140
+ // Convert multimodal messages to Vercel AI SDK format (CoreMessage[])
141
+ messages = convertToCoreMessages(mm);
142
+ }
143
+ else {
144
+ logger.debug(`HuggingFace: Text-only input, using standard message builder`);
145
+ messages = await buildMessagesArray(options);
146
+ }
118
147
  const result = await streamText({
119
148
  model: this.model,
120
149
  messages: messages,
121
150
  temperature: options.temperature,
122
151
  maxTokens: options.maxTokens, // No default limit - unlimited unless specified
152
+ maxSteps: options.maxSteps || DEFAULT_MAX_STEPS,
123
153
  tools: streamOptions.tools, // Tools format conversion handled by prepareStreamOptions
124
154
  toolChoice: streamOptions.toolChoice, // Tool choice handled by prepareStreamOptions
125
155
  abortSignal: timeoutController?.controller.signal,
@@ -5,7 +5,9 @@ import { logger } from "../utils/logger.js";
5
5
  import { createTimeoutController, TimeoutError } from "../utils/timeout.js";
6
6
  import { getProviderModel } from "../utils/providerConfig.js";
7
7
  import { streamAnalyticsCollector } from "../core/streamAnalytics.js";
8
- import { buildMessagesArray } from "../utils/messageBuilder.js";
8
+ import { DEFAULT_MAX_STEPS } from "../core/constants.js";
9
+ import { buildMessagesArray, buildMultimodalMessagesArray, convertToCoreMessages, } from "../utils/messageBuilder.js";
10
+ import { buildMultimodalOptions } from "../utils/multimodalOptionsBuilder.js";
9
11
  import { createProxyFetch } from "../proxy/proxyFetch.js";
10
12
  // Configuration helpers
11
13
  const getLiteLLMConfig = () => {
@@ -120,14 +122,42 @@ export class LiteLLMProvider extends BaseProvider {
120
122
  const timeout = this.getTimeout(options);
121
123
  const timeoutController = createTimeoutController(timeout, this.providerName, "stream");
122
124
  try {
123
- // Build message array from options
124
- const messages = await buildMessagesArray(options);
125
+ // Check for multimodal input (images, PDFs, CSVs, files)
126
+ const hasMultimodalInput = !!(options.input?.images?.length ||
127
+ options.input?.content?.length ||
128
+ options.input?.files?.length ||
129
+ options.input?.csvFiles?.length ||
130
+ options.input?.pdfFiles?.length);
131
+ let messages;
132
+ if (hasMultimodalInput) {
133
+ logger.debug(`LiteLLM: Detected multimodal input, using multimodal message builder`, {
134
+ hasImages: !!options.input?.images?.length,
135
+ imageCount: options.input?.images?.length || 0,
136
+ hasContent: !!options.input?.content?.length,
137
+ contentCount: options.input?.content?.length || 0,
138
+ hasFiles: !!options.input?.files?.length,
139
+ fileCount: options.input?.files?.length || 0,
140
+ hasCSVFiles: !!options.input?.csvFiles?.length,
141
+ csvFileCount: options.input?.csvFiles?.length || 0,
142
+ hasPDFFiles: !!options.input?.pdfFiles?.length,
143
+ pdfFileCount: options.input?.pdfFiles?.length || 0,
144
+ });
145
+ const multimodalOptions = buildMultimodalOptions(options, this.providerName, this.modelName);
146
+ const mm = await buildMultimodalMessagesArray(multimodalOptions, this.providerName, this.modelName);
147
+ // Convert multimodal messages to Vercel AI SDK format (CoreMessage[])
148
+ messages = convertToCoreMessages(mm);
149
+ }
150
+ else {
151
+ logger.debug(`LiteLLM: Text-only input, using standard message builder`);
152
+ messages = await buildMessagesArray(options);
153
+ }
125
154
  const model = await this.getAISDKModelWithMiddleware(options); // This is where network connection happens!
126
155
  const result = streamText({
127
156
  model: model,
128
157
  messages: messages,
129
158
  temperature: options.temperature,
130
159
  maxTokens: options.maxTokens, // No default limit - unlimited unless specified
160
+ maxSteps: options.maxSteps || DEFAULT_MAX_STEPS,
131
161
  tools: options.tools,
132
162
  toolChoice: "auto",
133
163
  abortSignal: timeoutController?.controller.signal,
@@ -6,7 +6,8 @@ import { createTimeoutController, TimeoutError } from "../utils/timeout.js";
6
6
  import { DEFAULT_MAX_STEPS } from "../core/constants.js";
7
7
  import { validateApiKey, createMistralConfig, getProviderModel, } from "../utils/providerConfig.js";
8
8
  import { streamAnalyticsCollector } from "../core/streamAnalytics.js";
9
- import { buildMessagesArray } from "../utils/messageBuilder.js";
9
+ import { buildMessagesArray, buildMultimodalMessagesArray, convertToCoreMessages, } from "../utils/messageBuilder.js";
10
+ import { buildMultimodalOptions } from "../utils/multimodalOptionsBuilder.js";
10
11
  import { createProxyFetch } from "../proxy/proxyFetch.js";
11
12
  // Configuration helpers - now using consolidated utility
12
13
  const getMistralApiKey = () => {
@@ -49,7 +50,35 @@ export class MistralProvider extends BaseProvider {
49
50
  // Get tools consistently with generate method
50
51
  const shouldUseTools = !options.disableTools && this.supportsTools();
51
52
  const tools = shouldUseTools ? await this.getAllTools() : {};
52
- const messages = await buildMessagesArray(options);
53
+ // Check for multimodal input (images, PDFs, CSVs, files)
54
+ const hasMultimodalInput = !!(options.input?.images?.length ||
55
+ options.input?.content?.length ||
56
+ options.input?.files?.length ||
57
+ options.input?.csvFiles?.length ||
58
+ options.input?.pdfFiles?.length);
59
+ let messages;
60
+ if (hasMultimodalInput) {
61
+ logger.debug(`Mistral: Detected multimodal input, using multimodal message builder`, {
62
+ hasImages: !!options.input?.images?.length,
63
+ imageCount: options.input?.images?.length || 0,
64
+ hasContent: !!options.input?.content?.length,
65
+ contentCount: options.input?.content?.length || 0,
66
+ hasFiles: !!options.input?.files?.length,
67
+ fileCount: options.input?.files?.length || 0,
68
+ hasCSVFiles: !!options.input?.csvFiles?.length,
69
+ csvFileCount: options.input?.csvFiles?.length || 0,
70
+ hasPDFFiles: !!options.input?.pdfFiles?.length,
71
+ pdfFileCount: options.input?.pdfFiles?.length || 0,
72
+ });
73
+ const multimodalOptions = buildMultimodalOptions(options, this.providerName, this.modelName);
74
+ const mm = await buildMultimodalMessagesArray(multimodalOptions, this.providerName, this.modelName);
75
+ // Convert multimodal messages to Vercel AI SDK format (CoreMessage[])
76
+ messages = convertToCoreMessages(mm);
77
+ }
78
+ else {
79
+ logger.debug(`Mistral: Text-only input, using standard message builder`);
80
+ messages = await buildMessagesArray(options);
81
+ }
53
82
  const model = await this.getAISDKModelWithMiddleware(options); // This is where network connection happens!
54
83
  const result = await streamText({
55
84
  model,
@@ -47,10 +47,20 @@ export declare class OllamaProvider extends BaseProvider {
47
47
  * @returns true for supported models, false for unsupported models
48
48
  */
49
49
  supportsTools(): boolean;
50
+ /**
51
+ * Extract images from multimodal messages for Ollama API
52
+ * Returns array of base64-encoded images
53
+ */
54
+ private extractImagesFromMessages;
55
+ /**
56
+ * Convert multimodal messages to Ollama chat format
57
+ * Extracts text content and handles images separately
58
+ */
59
+ private convertToOllamaMessages;
50
60
  protected executeStream(options: StreamOptions, analysisSchema?: ZodUnknownSchema | Schema<unknown>): Promise<StreamResult>;
51
61
  /**
52
62
  * Execute streaming with Ollama's function calling support
53
- * Uses the /v1/chat/completions endpoint with tools parameter
63
+ * Uses conversation loop to handle multi-step tool execution
54
64
  */
55
65
  private executeStreamWithTools;
56
66
  /**
@@ -62,6 +72,15 @@ export declare class OllamaProvider extends BaseProvider {
62
72
  * Convert AI SDK tools format to Ollama's function calling format
63
73
  */
64
74
  private convertToolsToOllamaFormat;
75
+ /**
76
+ * Parse tool calls from Ollama API response
77
+ */
78
+ private parseToolCalls;
79
+ /**
80
+ * Process Ollama streaming response and stream content to controller
81
+ * Returns aggregated content, tool calls, and finish reason
82
+ */
83
+ private processOllamaResponse;
65
84
  /**
66
85
  * Process individual stream data chunk from Ollama
67
86
  */
@@ -74,6 +93,23 @@ export declare class OllamaProvider extends BaseProvider {
74
93
  * Format tool calls for display when tools aren't executed directly
75
94
  */
76
95
  private formatToolCallForDisplay;
96
+ /**
97
+ * Convert AI SDK tools to ToolDefinition format
98
+ */
99
+ private convertAISDKToolsToToolDefinitions;
100
+ /**
101
+ * Execute a single tool and return the result
102
+ */
103
+ private executeSingleTool;
104
+ /**
105
+ * Execute tools and format results for Ollama API
106
+ * Similar to Bedrock's executeStreamTools but for Ollama format
107
+ */
108
+ private executeOllamaTools;
109
+ /**
110
+ * Convert ReadableStream to AsyncIterable for compatibility with StreamResult interface
111
+ */
112
+ private convertToAsyncIterable;
77
113
  /**
78
114
  * Create stream generator for Ollama generate API (non-tool mode)
79
115
  */