@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.
- package/CHANGELOG.md +9 -0
- package/README.md +12 -9
- package/dist/adapters/providerImageAdapter.js +82 -10
- package/dist/agent/directTools.d.ts +10 -10
- package/dist/agent/directTools.js +5 -3
- package/dist/cli/commands/config.js +1 -0
- package/dist/cli/commands/mcp.js +1 -0
- package/dist/cli/commands/models.js +1 -0
- package/dist/cli/commands/ollama.js +1 -0
- package/dist/cli/commands/setup-anthropic.js +1 -0
- package/dist/cli/commands/setup-azure.js +1 -0
- package/dist/cli/commands/setup-bedrock.js +1 -0
- package/dist/cli/commands/setup-gcp.js +1 -0
- package/dist/cli/commands/setup-google-ai.js +1 -0
- package/dist/cli/commands/setup-huggingface.js +1 -0
- package/dist/cli/commands/setup-mistral.js +1 -0
- package/dist/cli/commands/setup-openai.js +1 -0
- package/dist/cli/commands/setup.js +1 -0
- package/dist/cli/errorHandler.js +1 -0
- package/dist/cli/factories/commandFactory.d.ts +1 -0
- package/dist/cli/factories/commandFactory.js +23 -6
- package/dist/cli/factories/ollamaCommandFactory.js +1 -0
- package/dist/cli/factories/sagemakerCommandFactory.js +1 -0
- package/dist/cli/factories/setupCommandFactory.js +1 -0
- package/dist/cli/index.js +1 -0
- package/dist/cli/loop/conversationSelector.js +1 -0
- package/dist/cli/loop/optionsSchema.js +1 -0
- package/dist/cli/loop/session.js +1 -0
- package/dist/cli/parser.js +1 -0
- package/dist/cli/utils/completeSetup.js +1 -0
- package/dist/cli/utils/envManager.js +1 -0
- package/dist/cli/utils/interactiveSetup.js +1 -0
- package/dist/cli/utils/ollamaUtils.js +1 -0
- package/dist/constants/index.js +1 -1
- package/dist/core/baseProvider.d.ts +5 -0
- package/dist/core/baseProvider.js +70 -20
- package/dist/index.d.ts +3 -3
- package/dist/lib/adapters/providerImageAdapter.js +83 -10
- package/dist/lib/agent/directTools.d.ts +10 -10
- package/dist/lib/agent/directTools.js +6 -3
- package/dist/lib/config/configManager.js +1 -0
- package/dist/lib/config/conversationMemory.js +1 -0
- package/dist/lib/config/taskClassificationConfig.js +1 -0
- package/dist/lib/constants/index.js +2 -1
- package/dist/lib/constants/performance.js +1 -0
- package/dist/lib/constants/retry.js +1 -0
- package/dist/lib/constants/timeouts.js +1 -0
- package/dist/lib/constants/tokens.js +1 -0
- package/dist/lib/core/analytics.js +1 -0
- package/dist/lib/core/baseProvider.d.ts +5 -0
- package/dist/lib/core/baseProvider.js +71 -20
- package/dist/lib/core/constants.js +1 -0
- package/dist/lib/core/conversationMemoryFactory.js +1 -0
- package/dist/lib/core/conversationMemoryInitializer.js +1 -0
- package/dist/lib/core/conversationMemoryManager.js +1 -0
- package/dist/lib/core/dynamicModels.js +1 -0
- package/dist/lib/core/evaluation.js +1 -0
- package/dist/lib/core/evaluationProviders.js +1 -0
- package/dist/lib/core/factory.js +1 -0
- package/dist/lib/core/modelConfiguration.js +1 -0
- package/dist/lib/core/redisConversationMemoryManager.js +1 -0
- package/dist/lib/core/serviceRegistry.js +1 -0
- package/dist/lib/core/streamAnalytics.js +1 -0
- package/dist/lib/evaluation/contextBuilder.js +1 -0
- package/dist/lib/evaluation/index.js +1 -0
- package/dist/lib/evaluation/prompts.js +1 -0
- package/dist/lib/evaluation/ragasEvaluator.js +1 -0
- package/dist/lib/evaluation/retryManager.js +1 -0
- package/dist/lib/evaluation/scoring.js +1 -0
- package/dist/lib/factories/providerFactory.js +1 -0
- package/dist/lib/factories/providerRegistry.js +1 -0
- package/dist/lib/hitl/hitlErrors.js +1 -0
- package/dist/lib/hitl/hitlManager.js +1 -0
- package/dist/lib/hitl/index.js +1 -0
- package/dist/lib/hitl/types.js +1 -0
- package/dist/lib/index.d.ts +3 -3
- package/dist/lib/index.js +1 -0
- package/dist/lib/mcp/externalServerManager.js +1 -0
- package/dist/lib/mcp/factory.js +1 -0
- package/dist/lib/mcp/flexibleToolValidator.js +1 -0
- package/dist/lib/mcp/index.js +1 -0
- package/dist/lib/mcp/mcpCircuitBreaker.js +1 -0
- package/dist/lib/mcp/mcpClientFactory.js +2 -1
- package/dist/lib/mcp/registry.js +1 -0
- package/dist/lib/mcp/servers/agent/directToolsServer.js +2 -0
- package/dist/lib/mcp/servers/aiProviders/aiAnalysisTools.js +1 -0
- package/dist/lib/mcp/servers/aiProviders/aiCoreServer.js +1 -0
- package/dist/lib/mcp/servers/aiProviders/aiWorkflowTools.js +1 -0
- package/dist/lib/mcp/servers/utilities/utilityServer.js +1 -0
- package/dist/lib/mcp/toolDiscoveryService.js +1 -0
- package/dist/lib/mcp/toolRegistry.js +1 -0
- package/dist/lib/memory/mem0Initializer.js +1 -0
- package/dist/lib/middleware/builtin/analytics.js +1 -0
- package/dist/lib/middleware/builtin/autoEvaluation.js +1 -0
- package/dist/lib/middleware/builtin/guardrails.js +1 -0
- package/dist/lib/middleware/factory.js +1 -0
- package/dist/lib/middleware/index.js +1 -0
- package/dist/lib/middleware/registry.js +1 -0
- package/dist/lib/middleware/utils/guardrailsUtils.js +1 -0
- package/dist/lib/models/modelRegistry.js +1 -0
- package/dist/lib/models/modelResolver.js +2 -0
- package/dist/lib/neurolink.d.ts +6 -0
- package/dist/lib/neurolink.js +135 -5
- package/dist/lib/providers/amazonBedrock.d.ts +1 -0
- package/dist/lib/providers/amazonBedrock.js +166 -14
- package/dist/lib/providers/amazonSagemaker.js +1 -0
- package/dist/lib/providers/anthropic.js +7 -21
- package/dist/lib/providers/anthropicBaseProvider.js +1 -0
- package/dist/lib/providers/azureOpenai.js +5 -21
- package/dist/lib/providers/googleAiStudio.js +5 -21
- package/dist/lib/providers/googleVertex.js +8 -1
- package/dist/lib/providers/huggingFace.js +34 -3
- package/dist/lib/providers/index.js +1 -0
- package/dist/lib/providers/litellm.js +34 -3
- package/dist/lib/providers/mistral.js +32 -2
- package/dist/lib/providers/ollama.d.ts +37 -1
- package/dist/lib/providers/ollama.js +544 -58
- package/dist/lib/providers/openAI.js +5 -21
- package/dist/lib/providers/openaiCompatible.js +41 -4
- package/dist/lib/providers/sagemaker/adaptive-semaphore.js +1 -0
- package/dist/lib/providers/sagemaker/client.js +1 -0
- package/dist/lib/providers/sagemaker/config.js +1 -0
- package/dist/lib/providers/sagemaker/detection.js +1 -0
- package/dist/lib/providers/sagemaker/diagnostics.js +1 -0
- package/dist/lib/providers/sagemaker/error-constants.js +1 -0
- package/dist/lib/providers/sagemaker/errors.js +1 -0
- package/dist/lib/providers/sagemaker/index.js +1 -0
- package/dist/lib/providers/sagemaker/language-model.js +1 -0
- package/dist/lib/providers/sagemaker/parsers.js +1 -0
- package/dist/lib/providers/sagemaker/streaming.js +1 -0
- package/dist/lib/providers/sagemaker/structured-parser.js +1 -0
- package/dist/lib/proxy/awsProxyIntegration.js +1 -0
- package/dist/lib/proxy/proxyFetch.js +1 -0
- package/dist/lib/proxy/utils/noProxyUtils.js +1 -0
- package/dist/lib/sdk/toolRegistration.js +2 -0
- package/dist/lib/services/server/ai/observability/instrumentation.js +1 -0
- package/dist/lib/session/globalSessionState.js +1 -0
- package/dist/lib/telemetry/index.js +1 -0
- package/dist/lib/telemetry/telemetryService.js +1 -0
- package/dist/lib/types/analytics.js +1 -0
- package/dist/lib/types/cli.js +1 -0
- package/dist/lib/types/common.js +1 -0
- package/dist/lib/types/configTypes.js +1 -0
- package/dist/lib/types/content.d.ts +14 -1
- package/dist/lib/types/content.js +1 -0
- package/dist/lib/types/contextTypes.js +1 -0
- package/dist/lib/types/conversation.js +1 -0
- package/dist/lib/types/domainTypes.js +1 -0
- package/dist/lib/types/errors.js +1 -0
- package/dist/lib/types/evaluation.js +1 -0
- package/dist/lib/types/evaluationProviders.js +1 -0
- package/dist/lib/types/evaluationTypes.js +1 -0
- package/dist/lib/types/externalMcp.js +1 -0
- package/dist/lib/types/fileTypes.d.ts +44 -0
- package/dist/lib/types/fileTypes.js +1 -0
- package/dist/lib/types/generateTypes.d.ts +1 -0
- package/dist/lib/types/generateTypes.js +1 -0
- package/dist/lib/types/guardrails.js +1 -0
- package/dist/lib/types/index.js +1 -0
- package/dist/lib/types/mcpTypes.js +1 -0
- package/dist/lib/types/middlewareTypes.js +1 -0
- package/dist/lib/types/modelTypes.js +1 -0
- package/dist/lib/types/observability.js +1 -0
- package/dist/lib/types/providers.d.ts +44 -0
- package/dist/lib/types/providers.js +1 -0
- package/dist/lib/types/sdkTypes.js +1 -0
- package/dist/lib/types/serviceTypes.js +1 -0
- package/dist/lib/types/streamTypes.d.ts +1 -0
- package/dist/lib/types/streamTypes.js +1 -0
- package/dist/lib/types/taskClassificationTypes.js +1 -0
- package/dist/lib/types/tools.js +2 -0
- package/dist/lib/types/typeAliases.js +1 -0
- package/dist/lib/types/universalProviderOptions.js +1 -0
- package/dist/lib/utils/analyticsUtils.js +1 -0
- package/dist/lib/utils/conversationMemory.js +1 -0
- package/dist/lib/utils/conversationMemoryUtils.js +1 -0
- package/dist/lib/utils/csvProcessor.js +1 -0
- package/dist/lib/utils/errorHandling.js +1 -0
- package/dist/lib/utils/evaluationUtils.js +1 -0
- package/dist/lib/utils/factoryProcessing.js +1 -0
- package/dist/lib/utils/fileDetector.js +7 -3
- package/dist/lib/utils/imageProcessor.js +1 -0
- package/dist/lib/utils/logger.js +1 -0
- package/dist/lib/utils/loopUtils.js +1 -0
- package/dist/lib/utils/mcpDefaults.js +1 -0
- package/dist/lib/utils/messageBuilder.js +96 -9
- package/dist/lib/utils/modelRouter.js +1 -0
- package/dist/lib/utils/multimodalOptionsBuilder.d.ts +67 -0
- package/dist/lib/utils/multimodalOptionsBuilder.js +65 -0
- package/dist/lib/utils/optionsConversion.js +1 -0
- package/dist/lib/utils/optionsUtils.js +1 -0
- package/dist/lib/utils/parameterValidation.js +1 -0
- package/dist/lib/utils/pdfProcessor.d.ts +10 -0
- package/dist/lib/utils/pdfProcessor.js +199 -0
- package/dist/lib/utils/performance.js +1 -0
- package/dist/lib/utils/promptRedaction.js +1 -0
- package/dist/lib/utils/providerConfig.js +1 -0
- package/dist/lib/utils/providerHealth.js +1 -0
- package/dist/lib/utils/providerSetupMessages.js +1 -0
- package/dist/lib/utils/providerUtils.js +1 -0
- package/dist/lib/utils/redis.js +1 -0
- package/dist/lib/utils/retryHandler.js +1 -0
- package/dist/lib/utils/schemaConversion.js +1 -0
- package/dist/lib/utils/taskClassificationUtils.js +1 -0
- package/dist/lib/utils/taskClassifier.js +1 -0
- package/dist/lib/utils/timeout.js +1 -0
- package/dist/lib/utils/tokenLimits.js +1 -0
- package/dist/lib/utils/toolUtils.js +1 -0
- package/dist/lib/utils/transformationUtils.js +1 -0
- package/dist/lib/utils/typeUtils.js +1 -0
- package/dist/mcp/mcpClientFactory.js +1 -1
- package/dist/mcp/servers/agent/directToolsServer.js +1 -0
- package/dist/models/modelResolver.js +1 -0
- package/dist/neurolink.d.ts +6 -0
- package/dist/neurolink.js +134 -5
- package/dist/providers/amazonBedrock.d.ts +1 -0
- package/dist/providers/amazonBedrock.js +165 -14
- package/dist/providers/anthropic.js +6 -21
- package/dist/providers/azureOpenai.js +4 -21
- package/dist/providers/googleAiStudio.js +4 -21
- package/dist/providers/googleVertex.js +7 -1
- package/dist/providers/huggingFace.js +33 -3
- package/dist/providers/litellm.js +33 -3
- package/dist/providers/mistral.js +31 -2
- package/dist/providers/ollama.d.ts +37 -1
- package/dist/providers/ollama.js +543 -58
- package/dist/providers/openAI.js +4 -21
- package/dist/providers/openaiCompatible.js +40 -4
- package/dist/sdk/toolRegistration.js +1 -0
- package/dist/types/content.d.ts +14 -1
- package/dist/types/fileTypes.d.ts +44 -0
- package/dist/types/generateTypes.d.ts +1 -0
- package/dist/types/providers.d.ts +44 -0
- package/dist/types/streamTypes.d.ts +1 -0
- package/dist/types/tools.js +1 -0
- package/dist/utils/fileDetector.js +6 -3
- package/dist/utils/messageBuilder.js +95 -9
- package/dist/utils/multimodalOptionsBuilder.d.ts +67 -0
- package/dist/utils/multimodalOptionsBuilder.js +64 -0
- package/dist/utils/pdfProcessor.d.ts +10 -0
- package/dist/utils/pdfProcessor.js +198 -0
- package/package.json +11 -20
package/dist/providers/openAI.js
CHANGED
|
@@ -9,6 +9,7 @@ import { DEFAULT_MAX_STEPS } from "../core/constants.js";
|
|
|
9
9
|
import { validateApiKey, createOpenAIConfig, getProviderModel, } from "../utils/providerConfig.js";
|
|
10
10
|
import { streamAnalyticsCollector } from "../core/streamAnalytics.js";
|
|
11
11
|
import { buildMessagesArray, buildMultimodalMessagesArray, convertToCoreMessages, } from "../utils/messageBuilder.js";
|
|
12
|
+
import { buildMultimodalOptions } from "../utils/multimodalOptionsBuilder.js";
|
|
12
13
|
import { createProxyFetch } from "../proxy/proxyFetch.js";
|
|
13
14
|
import { isZodSchema } from "../utils/schemaConversion.js";
|
|
14
15
|
// Configuration helpers - now using consolidated utility
|
|
@@ -248,7 +249,8 @@ export class OpenAIProvider extends BaseProvider {
|
|
|
248
249
|
const hasMultimodalInput = !!(options.input?.images?.length ||
|
|
249
250
|
options.input?.content?.length ||
|
|
250
251
|
options.input?.files?.length ||
|
|
251
|
-
options.input?.csvFiles?.length
|
|
252
|
+
options.input?.csvFiles?.length ||
|
|
253
|
+
options.input?.pdfFiles?.length);
|
|
252
254
|
let messages;
|
|
253
255
|
if (hasMultimodalInput) {
|
|
254
256
|
logger.debug(`OpenAI: Detected multimodal input, using multimodal message builder`, {
|
|
@@ -261,26 +263,7 @@ export class OpenAIProvider extends BaseProvider {
|
|
|
261
263
|
hasCSVFiles: !!options.input?.csvFiles?.length,
|
|
262
264
|
csvFileCount: options.input?.csvFiles?.length || 0,
|
|
263
265
|
});
|
|
264
|
-
|
|
265
|
-
const multimodalOptions = {
|
|
266
|
-
input: {
|
|
267
|
-
text: options.input?.text || "",
|
|
268
|
-
images: options.input?.images,
|
|
269
|
-
content: options.input?.content,
|
|
270
|
-
files: options.input?.files,
|
|
271
|
-
csvFiles: options.input?.csvFiles,
|
|
272
|
-
},
|
|
273
|
-
csvOptions: options.csvOptions,
|
|
274
|
-
systemPrompt: options.systemPrompt,
|
|
275
|
-
conversationHistory: options.conversationMessages,
|
|
276
|
-
provider: this.providerName,
|
|
277
|
-
model: this.modelName,
|
|
278
|
-
temperature: options.temperature,
|
|
279
|
-
maxTokens: options.maxTokens,
|
|
280
|
-
enableAnalytics: options.enableAnalytics,
|
|
281
|
-
enableEvaluation: options.enableEvaluation,
|
|
282
|
-
context: options.context,
|
|
283
|
-
};
|
|
266
|
+
const multimodalOptions = buildMultimodalOptions(options, this.providerName, this.modelName);
|
|
284
267
|
const mm = await buildMultimodalMessagesArray(multimodalOptions, this.providerName, this.modelName);
|
|
285
268
|
// Convert multimodal messages to Vercel AI SDK format (CoreMessage[])
|
|
286
269
|
messages = convertToCoreMessages(mm);
|
|
@@ -5,6 +5,9 @@ import { logger } from "../utils/logger.js";
|
|
|
5
5
|
import { createTimeoutController, TimeoutError } from "../utils/timeout.js";
|
|
6
6
|
import { streamAnalyticsCollector } from "../core/streamAnalytics.js";
|
|
7
7
|
import { createProxyFetch } from "../proxy/proxyFetch.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";
|
|
8
11
|
// Constants
|
|
9
12
|
const FALLBACK_OPENAI_COMPATIBLE_MODEL = "gpt-3.5-turbo";
|
|
10
13
|
// Configuration helpers
|
|
@@ -157,13 +160,46 @@ export class OpenAICompatibleProvider extends BaseProvider {
|
|
|
157
160
|
const timeout = this.getTimeout(options);
|
|
158
161
|
const timeoutController = createTimeoutController(timeout, this.providerName, "stream");
|
|
159
162
|
try {
|
|
163
|
+
// Check for multimodal input (images, PDFs, CSVs, files)
|
|
164
|
+
const hasMultimodalInput = !!(options.input?.images?.length ||
|
|
165
|
+
options.input?.content?.length ||
|
|
166
|
+
options.input?.files?.length ||
|
|
167
|
+
options.input?.csvFiles?.length ||
|
|
168
|
+
options.input?.pdfFiles?.length);
|
|
169
|
+
let messages;
|
|
170
|
+
if (hasMultimodalInput) {
|
|
171
|
+
logger.debug(`OpenAI Compatible: Detected multimodal input, using multimodal message builder`, {
|
|
172
|
+
hasImages: !!options.input?.images?.length,
|
|
173
|
+
imageCount: options.input?.images?.length || 0,
|
|
174
|
+
hasContent: !!options.input?.content?.length,
|
|
175
|
+
contentCount: options.input?.content?.length || 0,
|
|
176
|
+
hasFiles: !!options.input?.files?.length,
|
|
177
|
+
fileCount: options.input?.files?.length || 0,
|
|
178
|
+
hasCSVFiles: !!options.input?.csvFiles?.length,
|
|
179
|
+
csvFileCount: options.input?.csvFiles?.length || 0,
|
|
180
|
+
hasPDFFiles: !!options.input?.pdfFiles?.length,
|
|
181
|
+
pdfFileCount: options.input?.pdfFiles?.length || 0,
|
|
182
|
+
});
|
|
183
|
+
const multimodalOptions = buildMultimodalOptions(options, this.providerName, this.modelName);
|
|
184
|
+
const mm = await buildMultimodalMessagesArray(multimodalOptions, this.providerName, this.modelName);
|
|
185
|
+
// Convert multimodal messages to Vercel AI SDK format (CoreMessage[])
|
|
186
|
+
messages = convertToCoreMessages(mm);
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
logger.debug(`OpenAI Compatible: Text-only input, using standard message builder`);
|
|
190
|
+
messages = await buildMessagesArray(options);
|
|
191
|
+
}
|
|
160
192
|
const model = await this.getAISDKModelWithMiddleware(options); // This is where network connection happens!
|
|
161
193
|
const result = streamText({
|
|
162
194
|
model,
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
195
|
+
messages: messages,
|
|
196
|
+
...(options.maxTokens !== null && options.maxTokens !== undefined
|
|
197
|
+
? { maxTokens: options.maxTokens }
|
|
198
|
+
: {}),
|
|
199
|
+
...(options.temperature !== null && options.temperature !== undefined
|
|
200
|
+
? { temperature: options.temperature }
|
|
201
|
+
: {}),
|
|
202
|
+
maxSteps: options.maxSteps || DEFAULT_MAX_STEPS,
|
|
167
203
|
tools: options.tools,
|
|
168
204
|
toolChoice: "auto",
|
|
169
205
|
abortSignal: timeoutController?.controller.signal,
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* NeuroLink SDK Tool Registration API
|
|
3
3
|
* Simple interface for developers to register custom tools
|
|
4
4
|
*/
|
|
5
|
+
import { z } from "zod";
|
|
5
6
|
import { logger } from "../utils/logger.js";
|
|
6
7
|
import { createMCPServerInfo } from "../utils/mcpDefaults.js";
|
|
7
8
|
import { validateToolName, validateToolDescription, } from "../utils/parameterValidation.js";
|
package/dist/types/content.d.ts
CHANGED
|
@@ -39,10 +39,23 @@ export type CSVContent = {
|
|
|
39
39
|
description?: string;
|
|
40
40
|
};
|
|
41
41
|
};
|
|
42
|
+
/**
|
|
43
|
+
* PDF document content type for multimodal messages
|
|
44
|
+
*/
|
|
45
|
+
export type PDFContent = {
|
|
46
|
+
type: "pdf";
|
|
47
|
+
data: Buffer | string;
|
|
48
|
+
metadata?: {
|
|
49
|
+
filename?: string;
|
|
50
|
+
pages?: number;
|
|
51
|
+
version?: string;
|
|
52
|
+
description?: string;
|
|
53
|
+
};
|
|
54
|
+
};
|
|
42
55
|
/**
|
|
43
56
|
* Union type for all content types
|
|
44
57
|
*/
|
|
45
|
-
export type Content = TextContent | ImageContent | CSVContent;
|
|
58
|
+
export type Content = TextContent | ImageContent | CSVContent | PDFContent;
|
|
46
59
|
/**
|
|
47
60
|
* Vision capability information for providers
|
|
48
61
|
*/
|
|
@@ -43,6 +43,10 @@ export type FileProcessingResult = {
|
|
|
43
43
|
columnNames?: string[];
|
|
44
44
|
sampleData?: string;
|
|
45
45
|
hasEmptyColumns?: boolean;
|
|
46
|
+
version?: string;
|
|
47
|
+
estimatedPages?: number | null;
|
|
48
|
+
provider?: string;
|
|
49
|
+
apiType?: PDFAPIType;
|
|
46
50
|
};
|
|
47
51
|
};
|
|
48
52
|
/**
|
|
@@ -53,6 +57,29 @@ export type CSVProcessorOptions = {
|
|
|
53
57
|
formatStyle?: "raw" | "markdown" | "json";
|
|
54
58
|
includeHeaders?: boolean;
|
|
55
59
|
};
|
|
60
|
+
/**
|
|
61
|
+
* PDF API types for different providers
|
|
62
|
+
*/
|
|
63
|
+
export type PDFAPIType = "document" | "files-api" | "unsupported";
|
|
64
|
+
/**
|
|
65
|
+
* PDF provider configuration
|
|
66
|
+
*/
|
|
67
|
+
export interface PDFProviderConfig {
|
|
68
|
+
maxSizeMB: number;
|
|
69
|
+
maxPages: number;
|
|
70
|
+
supportsNative: boolean;
|
|
71
|
+
requiresCitations: boolean | "auto";
|
|
72
|
+
apiType: PDFAPIType;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* PDF processor options
|
|
76
|
+
*/
|
|
77
|
+
export type PDFProcessorOptions = {
|
|
78
|
+
provider?: string;
|
|
79
|
+
model?: string;
|
|
80
|
+
maxSizeMB?: number;
|
|
81
|
+
bedrockApiMode?: "converse" | "invokeModel";
|
|
82
|
+
};
|
|
56
83
|
/**
|
|
57
84
|
* File detector options
|
|
58
85
|
*/
|
|
@@ -62,4 +89,21 @@ export type FileDetectorOptions = {
|
|
|
62
89
|
allowedTypes?: FileType[];
|
|
63
90
|
csvOptions?: CSVProcessorOptions;
|
|
64
91
|
confidenceThreshold?: number;
|
|
92
|
+
provider?: string;
|
|
65
93
|
};
|
|
94
|
+
/**
|
|
95
|
+
* Google AI Studio Files API types
|
|
96
|
+
*/
|
|
97
|
+
export interface GoogleFilesAPIUploadResult {
|
|
98
|
+
file: {
|
|
99
|
+
name: string;
|
|
100
|
+
displayName: string;
|
|
101
|
+
mimeType: string;
|
|
102
|
+
sizeBytes: string;
|
|
103
|
+
createTime: string;
|
|
104
|
+
updateTime: string;
|
|
105
|
+
expirationTime: string;
|
|
106
|
+
sha256Hash: string;
|
|
107
|
+
uri: string;
|
|
108
|
+
};
|
|
109
|
+
}
|
|
@@ -441,6 +441,19 @@ export type BedrockToolResult = {
|
|
|
441
441
|
*/
|
|
442
442
|
export type BedrockContentBlock = {
|
|
443
443
|
text?: string;
|
|
444
|
+
image?: {
|
|
445
|
+
format: "png" | "jpeg" | "gif" | "webp";
|
|
446
|
+
source: {
|
|
447
|
+
bytes?: Uint8Array | Buffer;
|
|
448
|
+
};
|
|
449
|
+
};
|
|
450
|
+
document?: {
|
|
451
|
+
format: "pdf" | "csv" | "doc" | "docx" | "xls" | "xlsx" | "html" | "txt" | "md";
|
|
452
|
+
name: string;
|
|
453
|
+
source: {
|
|
454
|
+
bytes?: Uint8Array | Buffer;
|
|
455
|
+
};
|
|
456
|
+
};
|
|
444
457
|
toolUse?: BedrockToolUse;
|
|
445
458
|
toolResult?: BedrockToolResult;
|
|
446
459
|
};
|
|
@@ -555,6 +568,37 @@ export type ModelsResponse = {
|
|
|
555
568
|
owned_by?: string;
|
|
556
569
|
}>;
|
|
557
570
|
};
|
|
571
|
+
/**
|
|
572
|
+
* Ollama tool call structure
|
|
573
|
+
*/
|
|
574
|
+
export type OllamaToolCall = {
|
|
575
|
+
id: string;
|
|
576
|
+
type: "function";
|
|
577
|
+
function: {
|
|
578
|
+
name: string;
|
|
579
|
+
arguments: string;
|
|
580
|
+
};
|
|
581
|
+
};
|
|
582
|
+
/**
|
|
583
|
+
* Ollama tool result structure
|
|
584
|
+
*/
|
|
585
|
+
export type OllamaToolResult = {
|
|
586
|
+
tool_call_id: string;
|
|
587
|
+
content: string;
|
|
588
|
+
};
|
|
589
|
+
/**
|
|
590
|
+
* Ollama message structure for conversation and tool execution
|
|
591
|
+
*/
|
|
592
|
+
export type OllamaMessage = {
|
|
593
|
+
role: "system" | "user" | "assistant" | "tool";
|
|
594
|
+
content: string | Array<{
|
|
595
|
+
type: string;
|
|
596
|
+
text?: string;
|
|
597
|
+
[key: string]: unknown;
|
|
598
|
+
}>;
|
|
599
|
+
tool_calls?: OllamaToolCall[];
|
|
600
|
+
images?: string[];
|
|
601
|
+
};
|
|
558
602
|
/**
|
|
559
603
|
* Default model aliases for easy reference
|
|
560
604
|
*/
|
|
@@ -126,6 +126,7 @@ export interface StreamOptions {
|
|
|
126
126
|
audio?: AudioInputSpec;
|
|
127
127
|
images?: Array<Buffer | string>;
|
|
128
128
|
csvFiles?: Array<Buffer | string>;
|
|
129
|
+
pdfFiles?: Array<Buffer | string>;
|
|
129
130
|
files?: Array<Buffer | string>;
|
|
130
131
|
content?: Array<TextContent | ImageContent>;
|
|
131
132
|
};
|
package/dist/types/tools.js
CHANGED
|
@@ -8,6 +8,7 @@ import { readFile, stat } from "fs/promises";
|
|
|
8
8
|
import { logger } from "./logger.js";
|
|
9
9
|
import { CSVProcessor } from "./csvProcessor.js";
|
|
10
10
|
import { ImageProcessor } from "./imageProcessor.js";
|
|
11
|
+
import { PDFProcessor } from "./pdfProcessor.js";
|
|
11
12
|
/**
|
|
12
13
|
* Format file size in human-readable units
|
|
13
14
|
*/
|
|
@@ -56,7 +57,7 @@ export class FileDetector {
|
|
|
56
57
|
const content = await this.loadContent(input, detection, options);
|
|
57
58
|
// Extract CSV-specific options from FileDetectorOptions
|
|
58
59
|
const csvOptions = options?.csvOptions;
|
|
59
|
-
return await this.processFile(content, detection, csvOptions);
|
|
60
|
+
return await this.processFile(content, detection, csvOptions, options?.provider);
|
|
60
61
|
}
|
|
61
62
|
/**
|
|
62
63
|
* Detect file type using multi-strategy approach
|
|
@@ -119,12 +120,14 @@ export class FileDetector {
|
|
|
119
120
|
/**
|
|
120
121
|
* Route to appropriate processor
|
|
121
122
|
*/
|
|
122
|
-
static async processFile(content, detection, options) {
|
|
123
|
+
static async processFile(content, detection, options, provider) {
|
|
123
124
|
switch (detection.type) {
|
|
124
125
|
case "csv":
|
|
125
126
|
return await CSVProcessor.process(content, options);
|
|
126
127
|
case "image":
|
|
127
128
|
return await ImageProcessor.process(content);
|
|
129
|
+
case "pdf":
|
|
130
|
+
return await PDFProcessor.process(content, { provider });
|
|
128
131
|
case "text":
|
|
129
132
|
return {
|
|
130
133
|
type: "text",
|
|
@@ -354,7 +357,7 @@ class ExtensionStrategy {
|
|
|
354
357
|
mimeType: this.getMimeType(ext),
|
|
355
358
|
extension: ext,
|
|
356
359
|
source: this.detectSource(input),
|
|
357
|
-
metadata: { confidence: type ?
|
|
360
|
+
metadata: { confidence: type ? 85 : 0 },
|
|
358
361
|
};
|
|
359
362
|
}
|
|
360
363
|
getExtension(input) {
|
|
@@ -7,6 +7,7 @@ import { CONVERSATION_INSTRUCTIONS } from "../config/conversationMemory.js";
|
|
|
7
7
|
import { ProviderImageAdapter, MultimodalLogger, } from "../adapters/providerImageAdapter.js";
|
|
8
8
|
import { logger } from "./logger.js";
|
|
9
9
|
import { FileDetector } from "./fileDetector.js";
|
|
10
|
+
import { PDFProcessor } from "./pdfProcessor.js";
|
|
10
11
|
import { request } from "undici";
|
|
11
12
|
import { readFileSync, existsSync } from "fs";
|
|
12
13
|
/**
|
|
@@ -32,6 +33,10 @@ function isValidContentItem(item) {
|
|
|
32
33
|
(contentItem.mimeType === undefined ||
|
|
33
34
|
typeof contentItem.mimeType === "string"));
|
|
34
35
|
}
|
|
36
|
+
if (contentItem.type === "file") {
|
|
37
|
+
return (Buffer.isBuffer(contentItem.data) &&
|
|
38
|
+
typeof contentItem.mimeType === "string");
|
|
39
|
+
}
|
|
35
40
|
return false;
|
|
36
41
|
}
|
|
37
42
|
/**
|
|
@@ -52,6 +57,15 @@ function convertContentItem(item) {
|
|
|
52
57
|
...(contentItem.mimeType && { mimeType: contentItem.mimeType }),
|
|
53
58
|
};
|
|
54
59
|
}
|
|
60
|
+
if (contentItem.type === "file" &&
|
|
61
|
+
Buffer.isBuffer(contentItem.data) &&
|
|
62
|
+
contentItem.mimeType) {
|
|
63
|
+
return {
|
|
64
|
+
type: "file",
|
|
65
|
+
data: contentItem.data,
|
|
66
|
+
mimeType: contentItem.mimeType,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
55
69
|
return null;
|
|
56
70
|
}
|
|
57
71
|
/**
|
|
@@ -268,7 +282,7 @@ export async function buildMessagesArray(options) {
|
|
|
268
282
|
const filename = extractFilename(file);
|
|
269
283
|
try {
|
|
270
284
|
const result = await FileDetector.detectAndProcess(file, {
|
|
271
|
-
maxSize:
|
|
285
|
+
maxSize: 50 * 1024 * 1024,
|
|
272
286
|
allowedTypes: ["csv"],
|
|
273
287
|
csvOptions: csvOptions,
|
|
274
288
|
});
|
|
@@ -310,6 +324,11 @@ export async function buildMessagesArray(options) {
|
|
|
310
324
|
* Detects when images are present and routes through provider adapter
|
|
311
325
|
*/
|
|
312
326
|
export async function buildMultimodalMessagesArray(options, provider, model) {
|
|
327
|
+
// Compute provider-specific max PDF size once for consistent validation
|
|
328
|
+
const pdfConfig = PDFProcessor.getProviderConfig(provider);
|
|
329
|
+
const maxSize = pdfConfig
|
|
330
|
+
? pdfConfig.maxSizeMB * 1024 * 1024
|
|
331
|
+
: 10 * 1024 * 1024;
|
|
313
332
|
// Process unified files array (auto-detect)
|
|
314
333
|
if (options.input.files && options.input.files.length > 0) {
|
|
315
334
|
logger.info(`[FileDetector] Processing ${options.input.files.length} file(s) with auto-detection`);
|
|
@@ -317,9 +336,10 @@ export async function buildMultimodalMessagesArray(options, provider, model) {
|
|
|
317
336
|
for (const file of options.input.files) {
|
|
318
337
|
try {
|
|
319
338
|
const result = await FileDetector.detectAndProcess(file, {
|
|
320
|
-
maxSize
|
|
321
|
-
allowedTypes: ["csv", "image"],
|
|
339
|
+
maxSize,
|
|
340
|
+
allowedTypes: ["csv", "image", "pdf"],
|
|
322
341
|
csvOptions: options.csvOptions,
|
|
342
|
+
provider: provider,
|
|
323
343
|
});
|
|
324
344
|
if (result.type === "csv") {
|
|
325
345
|
const filename = extractFilename(file);
|
|
@@ -344,6 +364,13 @@ export async function buildMultimodalMessagesArray(options, provider, model) {
|
|
|
344
364
|
];
|
|
345
365
|
logger.info(`[FileDetector] ✅ Image: ${result.mimeType}`);
|
|
346
366
|
}
|
|
367
|
+
else if (result.type === "pdf") {
|
|
368
|
+
options.input.pdfFiles = [
|
|
369
|
+
...(options.input.pdfFiles || []),
|
|
370
|
+
result.content,
|
|
371
|
+
];
|
|
372
|
+
logger.info(`[FileDetector] ✅ PDF: ${extractFilename(file)}`);
|
|
373
|
+
}
|
|
347
374
|
}
|
|
348
375
|
catch (error) {
|
|
349
376
|
logger.error(`[FileDetector] ❌ Failed to process file:`, error);
|
|
@@ -384,17 +411,46 @@ export async function buildMultimodalMessagesArray(options, provider, model) {
|
|
|
384
411
|
}
|
|
385
412
|
}
|
|
386
413
|
}
|
|
414
|
+
// Track PDF files for multimodal processing (NOT text conversion)
|
|
415
|
+
const pdfFiles = [];
|
|
416
|
+
// Process explicit PDF files array
|
|
417
|
+
if (options.input.pdfFiles && options.input.pdfFiles.length > 0) {
|
|
418
|
+
logger.info(`[PDF] Processing ${options.input.pdfFiles.length} explicit PDF file(s) for ${provider}`);
|
|
419
|
+
for (let i = 0; i < options.input.pdfFiles.length; i++) {
|
|
420
|
+
const pdfFile = options.input.pdfFiles[i];
|
|
421
|
+
const filename = extractFilename(pdfFile, i);
|
|
422
|
+
try {
|
|
423
|
+
const result = await FileDetector.detectAndProcess(pdfFile, {
|
|
424
|
+
maxSize,
|
|
425
|
+
allowedTypes: ["pdf"],
|
|
426
|
+
provider: provider,
|
|
427
|
+
});
|
|
428
|
+
if (Buffer.isBuffer(result.content)) {
|
|
429
|
+
pdfFiles.push({ buffer: result.content, filename });
|
|
430
|
+
logger.info(`[PDF] ✅ Queued for multimodal: ${filename}`);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
catch (error) {
|
|
434
|
+
logger.error(`[PDF] ❌ Failed to process ${filename}:`, error);
|
|
435
|
+
throw error;
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
}
|
|
387
439
|
// Check if this is a multimodal request
|
|
388
440
|
const hasImages = (options.input.images && options.input.images.length > 0) ||
|
|
389
441
|
(options.input.content &&
|
|
390
442
|
options.input.content.some((c) => c.type === "image"));
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
443
|
+
const hasPDFs = pdfFiles.length > 0;
|
|
444
|
+
// If no images or PDFs, use standard message building and convert to MultimodalChatMessage[]
|
|
445
|
+
if (!hasImages && !hasPDFs) {
|
|
446
|
+
// Clear csvFiles, pdfFiles, and files arrays to prevent duplication
|
|
394
447
|
// (already processed and added to options.input.text above)
|
|
395
448
|
if (options.input.csvFiles) {
|
|
396
449
|
options.input.csvFiles = [];
|
|
397
450
|
}
|
|
451
|
+
if (options.input.pdfFiles) {
|
|
452
|
+
options.input.pdfFiles = [];
|
|
453
|
+
}
|
|
398
454
|
if (options.input.files) {
|
|
399
455
|
options.input.files = [];
|
|
400
456
|
}
|
|
@@ -441,9 +497,10 @@ export async function buildMultimodalMessagesArray(options, provider, model) {
|
|
|
441
497
|
// Advanced content format - convert to provider-specific format
|
|
442
498
|
userContent = await convertContentToProviderFormat(options.input.content, provider, model);
|
|
443
499
|
}
|
|
444
|
-
else if (options.input.images && options.input.images.length > 0)
|
|
445
|
-
|
|
446
|
-
|
|
500
|
+
else if ((options.input.images && options.input.images.length > 0) ||
|
|
501
|
+
pdfFiles.length > 0) {
|
|
502
|
+
// Simple images/PDFs format - convert to provider-specific format
|
|
503
|
+
userContent = await convertMultimodalToProviderFormat(options.input.text, options.input.images || [], pdfFiles, provider, model);
|
|
447
504
|
}
|
|
448
505
|
else {
|
|
449
506
|
// Text-only fallback
|
|
@@ -664,6 +721,35 @@ async function convertSimpleImagesToProviderFormat(text, images, provider, _mode
|
|
|
664
721
|
});
|
|
665
722
|
return content;
|
|
666
723
|
}
|
|
724
|
+
/**
|
|
725
|
+
* Convert multimodal content (images + PDFs) to provider format
|
|
726
|
+
*/
|
|
727
|
+
async function convertMultimodalToProviderFormat(text, images, pdfFiles, provider, model) {
|
|
728
|
+
const content = [
|
|
729
|
+
{ type: "text", text },
|
|
730
|
+
];
|
|
731
|
+
// Add images if present
|
|
732
|
+
if (images.length > 0) {
|
|
733
|
+
const imageContent = await convertSimpleImagesToProviderFormat("", images, provider, model);
|
|
734
|
+
if (Array.isArray(imageContent)) {
|
|
735
|
+
imageContent.forEach((item) => {
|
|
736
|
+
if (item.type !== "text") {
|
|
737
|
+
content.push(item);
|
|
738
|
+
}
|
|
739
|
+
});
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
// Add PDFs using Vercel AI SDK standard format (works for all providers)
|
|
743
|
+
content.push(...pdfFiles.map((pdf) => {
|
|
744
|
+
logger.info(`[PDF] ✅ Added to content (Vercel AI SDK format): ${pdf.filename}`);
|
|
745
|
+
return {
|
|
746
|
+
type: "file",
|
|
747
|
+
data: pdf.buffer,
|
|
748
|
+
mimeType: "application/pdf",
|
|
749
|
+
};
|
|
750
|
+
}));
|
|
751
|
+
return content;
|
|
752
|
+
}
|
|
667
753
|
/**
|
|
668
754
|
* Extract filename from file input
|
|
669
755
|
*/
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { StreamOptions } from "../types/streamTypes.js";
|
|
2
|
+
/**
|
|
3
|
+
* Builds a normalized multimodal options payload for streaming providers.
|
|
4
|
+
*
|
|
5
|
+
* This utility extracts and normalizes multimodal input fields from StreamOptions
|
|
6
|
+
* into a consistent format that can be consumed by buildMultimodalMessagesArray.
|
|
7
|
+
*
|
|
8
|
+
* @param {StreamOptions} options - Stream options containing:
|
|
9
|
+
* - input.text: Main text prompt
|
|
10
|
+
* - input.images: Image files (Buffer | string paths/URLs)
|
|
11
|
+
* - input.content: Advanced multimodal content array
|
|
12
|
+
* - input.files: Auto-detected file types
|
|
13
|
+
* - input.csvFiles: CSV files for tabular data
|
|
14
|
+
* - input.pdfFiles: PDF documents (Buffer | string paths)
|
|
15
|
+
* - csvOptions: CSV parsing options
|
|
16
|
+
* - systemPrompt: System-level instructions
|
|
17
|
+
* - conversationMessages: Chat history
|
|
18
|
+
* - temperature: Model temperature (0-1)
|
|
19
|
+
* - maxTokens: Maximum output tokens
|
|
20
|
+
* - enableAnalytics: Enable analytics tracking
|
|
21
|
+
* - enableEvaluation: Enable response evaluation
|
|
22
|
+
* - context: Additional context data
|
|
23
|
+
* @param {string} providerName - Provider identifier (e.g., "vertex", "openai", "anthropic")
|
|
24
|
+
* @param {string} modelName - Model identifier (e.g., "gemini-2.5-flash", "gpt-4o")
|
|
25
|
+
* @returns {object} Normalized options object with:
|
|
26
|
+
* - input: { text, images, content, files, csvFiles, pdfFiles }
|
|
27
|
+
* - csvOptions: CSV processing options
|
|
28
|
+
* - systemPrompt: System prompt string
|
|
29
|
+
* - conversationHistory: Message history array
|
|
30
|
+
* - provider: Provider name
|
|
31
|
+
* - model: Model name
|
|
32
|
+
* - temperature: Temperature value
|
|
33
|
+
* - maxTokens: Token limit
|
|
34
|
+
* - enableAnalytics: Analytics flag
|
|
35
|
+
* - enableEvaluation: Evaluation flag
|
|
36
|
+
* - context: Context data
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* const opts = buildMultimodalOptions(streamOptions, "vertex", "gemini-2.5-flash");
|
|
41
|
+
* const messages = await buildMultimodalMessagesArray(opts, "vertex", "gemini-2.5-flash");
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildMultimodalOptions(options: StreamOptions, providerName: string, modelName: string): {
|
|
45
|
+
input: {
|
|
46
|
+
text: string;
|
|
47
|
+
images: (string | Buffer<ArrayBufferLike>)[] | undefined;
|
|
48
|
+
content: (import("../types/content.js").TextContent | import("../types/content.js").ImageContent)[] | undefined;
|
|
49
|
+
files: (string | Buffer<ArrayBufferLike>)[] | undefined;
|
|
50
|
+
csvFiles: (string | Buffer<ArrayBufferLike>)[] | undefined;
|
|
51
|
+
pdfFiles: (string | Buffer<ArrayBufferLike>)[] | undefined;
|
|
52
|
+
};
|
|
53
|
+
csvOptions: {
|
|
54
|
+
maxRows?: number;
|
|
55
|
+
formatStyle?: "raw" | "markdown" | "json";
|
|
56
|
+
includeHeaders?: boolean;
|
|
57
|
+
} | undefined;
|
|
58
|
+
systemPrompt: string | undefined;
|
|
59
|
+
conversationHistory: import("../types/conversation.js").ChatMessage[] | undefined;
|
|
60
|
+
provider: string;
|
|
61
|
+
model: string;
|
|
62
|
+
temperature: number | undefined;
|
|
63
|
+
maxTokens: number | undefined;
|
|
64
|
+
enableAnalytics: boolean | undefined;
|
|
65
|
+
enableEvaluation: boolean | undefined;
|
|
66
|
+
context: import("../types/common.js").UnknownRecord | undefined;
|
|
67
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds a normalized multimodal options payload for streaming providers.
|
|
3
|
+
*
|
|
4
|
+
* This utility extracts and normalizes multimodal input fields from StreamOptions
|
|
5
|
+
* into a consistent format that can be consumed by buildMultimodalMessagesArray.
|
|
6
|
+
*
|
|
7
|
+
* @param {StreamOptions} options - Stream options containing:
|
|
8
|
+
* - input.text: Main text prompt
|
|
9
|
+
* - input.images: Image files (Buffer | string paths/URLs)
|
|
10
|
+
* - input.content: Advanced multimodal content array
|
|
11
|
+
* - input.files: Auto-detected file types
|
|
12
|
+
* - input.csvFiles: CSV files for tabular data
|
|
13
|
+
* - input.pdfFiles: PDF documents (Buffer | string paths)
|
|
14
|
+
* - csvOptions: CSV parsing options
|
|
15
|
+
* - systemPrompt: System-level instructions
|
|
16
|
+
* - conversationMessages: Chat history
|
|
17
|
+
* - temperature: Model temperature (0-1)
|
|
18
|
+
* - maxTokens: Maximum output tokens
|
|
19
|
+
* - enableAnalytics: Enable analytics tracking
|
|
20
|
+
* - enableEvaluation: Enable response evaluation
|
|
21
|
+
* - context: Additional context data
|
|
22
|
+
* @param {string} providerName - Provider identifier (e.g., "vertex", "openai", "anthropic")
|
|
23
|
+
* @param {string} modelName - Model identifier (e.g., "gemini-2.5-flash", "gpt-4o")
|
|
24
|
+
* @returns {object} Normalized options object with:
|
|
25
|
+
* - input: { text, images, content, files, csvFiles, pdfFiles }
|
|
26
|
+
* - csvOptions: CSV processing options
|
|
27
|
+
* - systemPrompt: System prompt string
|
|
28
|
+
* - conversationHistory: Message history array
|
|
29
|
+
* - provider: Provider name
|
|
30
|
+
* - model: Model name
|
|
31
|
+
* - temperature: Temperature value
|
|
32
|
+
* - maxTokens: Token limit
|
|
33
|
+
* - enableAnalytics: Analytics flag
|
|
34
|
+
* - enableEvaluation: Evaluation flag
|
|
35
|
+
* - context: Context data
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const opts = buildMultimodalOptions(streamOptions, "vertex", "gemini-2.5-flash");
|
|
40
|
+
* const messages = await buildMultimodalMessagesArray(opts, "vertex", "gemini-2.5-flash");
|
|
41
|
+
* ```
|
|
42
|
+
*/
|
|
43
|
+
export function buildMultimodalOptions(options, providerName, modelName) {
|
|
44
|
+
return {
|
|
45
|
+
input: {
|
|
46
|
+
text: options.input?.text || "",
|
|
47
|
+
images: options.input?.images,
|
|
48
|
+
content: options.input?.content,
|
|
49
|
+
files: options.input?.files,
|
|
50
|
+
csvFiles: options.input?.csvFiles,
|
|
51
|
+
pdfFiles: options.input?.pdfFiles,
|
|
52
|
+
},
|
|
53
|
+
csvOptions: options.csvOptions,
|
|
54
|
+
systemPrompt: options.systemPrompt,
|
|
55
|
+
conversationHistory: options.conversationMessages,
|
|
56
|
+
provider: providerName,
|
|
57
|
+
model: modelName,
|
|
58
|
+
temperature: options.temperature,
|
|
59
|
+
maxTokens: options.maxTokens,
|
|
60
|
+
enableAnalytics: options.enableAnalytics,
|
|
61
|
+
enableEvaluation: options.enableEvaluation,
|
|
62
|
+
context: options.context,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FileProcessingResult, PDFProviderConfig, PDFProcessorOptions } from "../types/fileTypes.js";
|
|
2
|
+
export declare class PDFProcessor {
|
|
3
|
+
private static readonly PDF_SIGNATURE;
|
|
4
|
+
static process(content: Buffer, options?: PDFProcessorOptions): Promise<FileProcessingResult>;
|
|
5
|
+
static supportsNativePDF(provider: string): boolean;
|
|
6
|
+
static getProviderConfig(provider: string): PDFProviderConfig | null;
|
|
7
|
+
private static isValidPDF;
|
|
8
|
+
private static extractBasicMetadata;
|
|
9
|
+
static estimateTokens(pageCount: number, mode?: "text-only" | "visual"): number;
|
|
10
|
+
}
|