| import { Providers } from '@librechat/agents'; |
| import { isDocumentSupportedProvider } from 'librechat-data-provider'; |
| import type { IMongoFile } from '@librechat/data-schemas'; |
| import type { ServerRequest, StrategyFunctions, VideoResult } from '~/types'; |
| import { getFileStream, getConfiguredFileSizeLimit } from './utils'; |
| import { validateVideo } from '~/files/validation'; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export async function encodeAndFormatVideos( |
| req: ServerRequest, |
| files: IMongoFile[], |
| params: { provider: Providers; endpoint?: string }, |
| getStrategyFunctions: (source: string) => StrategyFunctions, |
| ): Promise<VideoResult> { |
| const { provider, endpoint } = params; |
| if (!files?.length) { |
| return { videos: [], files: [] }; |
| } |
|
|
| const encodingMethods: Record<string, StrategyFunctions> = {}; |
| const result: VideoResult = { videos: [], files: [] }; |
|
|
| const results = await Promise.allSettled( |
| files.map((file) => getFileStream(req, file, encodingMethods, getStrategyFunctions)), |
| ); |
|
|
| for (const settledResult of results) { |
| if (settledResult.status === 'rejected') { |
| console.error('Video processing failed:', settledResult.reason); |
| continue; |
| } |
|
|
| const processed = settledResult.value; |
| if (!processed) continue; |
|
|
| const { file, content, metadata } = processed; |
|
|
| if (!content || !file) { |
| if (metadata) result.files.push(metadata); |
| continue; |
| } |
|
|
| if (!file.type.startsWith('video/') || !isDocumentSupportedProvider(provider)) { |
| result.files.push(metadata); |
| continue; |
| } |
|
|
| const videoBuffer = Buffer.from(content, 'base64'); |
|
|
| |
| const configuredFileSizeLimit = getConfiguredFileSizeLimit(req, { |
| provider, |
| endpoint, |
| }); |
|
|
| const validation = await validateVideo( |
| videoBuffer, |
| videoBuffer.length, |
| provider, |
| configuredFileSizeLimit, |
| ); |
|
|
| if (!validation.isValid) { |
| throw new Error(`Video validation failed: ${validation.error}`); |
| } |
|
|
| if (provider === Providers.GOOGLE || provider === Providers.VERTEXAI) { |
| result.videos.push({ |
| type: 'media', |
| mimeType: file.type, |
| data: content, |
| }); |
| } |
|
|
| result.files.push(metadata); |
| } |
|
|
| return result; |
| } |
|
|