mirror of
https://github.com/QwenLM/qwen-code.git
synced 2025-12-20 08:47:44 +00:00
feat: add audio and video support to read_file (#2556)
This commit is contained in:
@@ -94,19 +94,27 @@ export function isBinaryFile(filePath: string): boolean {
|
||||
/**
|
||||
* Detects the type of file based on extension and content.
|
||||
* @param filePath Path to the file.
|
||||
* @returns 'text', 'image', 'pdf', or 'binary'.
|
||||
* @returns 'text', 'image', 'pdf', 'audio', 'video', or 'binary'.
|
||||
*/
|
||||
export function detectFileType(
|
||||
filePath: string,
|
||||
): 'text' | 'image' | 'pdf' | 'binary' {
|
||||
): 'text' | 'image' | 'pdf' | 'audio' | 'video' | 'binary' {
|
||||
const ext = path.extname(filePath).toLowerCase();
|
||||
const lookedUpMimeType = mime.lookup(filePath); // Returns false if not found, or the mime type string
|
||||
|
||||
if (lookedUpMimeType && lookedUpMimeType.startsWith('image/')) {
|
||||
return 'image';
|
||||
}
|
||||
if (lookedUpMimeType && lookedUpMimeType === 'application/pdf') {
|
||||
return 'pdf';
|
||||
if (lookedUpMimeType) {
|
||||
if (lookedUpMimeType.startsWith('image/')) {
|
||||
return 'image';
|
||||
}
|
||||
if (lookedUpMimeType.startsWith('audio/')) {
|
||||
return 'audio';
|
||||
}
|
||||
if (lookedUpMimeType.startsWith('video/')) {
|
||||
return 'video';
|
||||
}
|
||||
if (lookedUpMimeType === 'application/pdf') {
|
||||
return 'pdf';
|
||||
}
|
||||
}
|
||||
|
||||
// Stricter binary check for common non-text extensions before content check
|
||||
@@ -187,7 +195,7 @@ export async function processSingleFileContent(
|
||||
error: `File not found: ${filePath}`,
|
||||
};
|
||||
}
|
||||
const stats = fs.statSync(filePath); // Sync check
|
||||
const stats = await fs.promises.stat(filePath);
|
||||
if (stats.isDirectory()) {
|
||||
return {
|
||||
llmContent: '',
|
||||
@@ -196,6 +204,19 @@ export async function processSingleFileContent(
|
||||
};
|
||||
}
|
||||
|
||||
const fileSizeInBytes = stats.size;
|
||||
// 20MB limit
|
||||
const maxFileSize = 20 * 1024 * 1024;
|
||||
|
||||
if (fileSizeInBytes > maxFileSize) {
|
||||
throw new Error(
|
||||
`File size exceeds the 20MB limit: ${filePath} (${(
|
||||
fileSizeInBytes /
|
||||
(1024 * 1024)
|
||||
).toFixed(2)}MB)`,
|
||||
);
|
||||
}
|
||||
|
||||
const fileType = detectFileType(filePath);
|
||||
const relativePathForDisplay = path
|
||||
.relative(rootDirectory, filePath)
|
||||
@@ -253,7 +274,9 @@ export async function processSingleFileContent(
|
||||
};
|
||||
}
|
||||
case 'image':
|
||||
case 'pdf': {
|
||||
case 'pdf':
|
||||
case 'audio':
|
||||
case 'video': {
|
||||
const contentBuffer = await fs.promises.readFile(filePath);
|
||||
const base64Data = contentBuffer.toString('base64');
|
||||
return {
|
||||
|
||||
Reference in New Issue
Block a user