mirror of
https://github.com/ollama/ollama.git
synced 2025-11-11 21:57:56 +01:00
Merge pull request #12973 from macarronesc/main
feat: add support for WebP images in Ollama's app
This commit is contained in:
@@ -282,7 +282,7 @@ func (w *Webview) Run(path string) unsafe.Pointer {
|
|||||||
"go", "rs", "swift", "kt", "scala", "sh", "bat", "yaml", "yml", "toml", "ini",
|
"go", "rs", "swift", "kt", "scala", "sh", "bat", "yaml", "yml", "toml", "ini",
|
||||||
"cfg", "conf", "log", "rtf",
|
"cfg", "conf", "log", "rtf",
|
||||||
}
|
}
|
||||||
imageExts := []string{"png", "jpg", "jpeg"}
|
imageExts := []string{"png", "jpg", "jpeg", "webp"}
|
||||||
allowedExts := append(textExts, imageExts...)
|
allowedExts := append(textExts, imageExts...)
|
||||||
|
|
||||||
// Use native multiple file selection with extension filtering
|
// Use native multiple file selection with extension filtering
|
||||||
|
|||||||
97
app/ui/app/src/utils/fileValidation.test.ts
Normal file
97
app/ui/app/src/utils/fileValidation.test.ts
Normal file
@@ -0,0 +1,97 @@
|
|||||||
|
import { describe, it, expect } from "vitest";
|
||||||
|
import { IMAGE_EXTENSIONS, validateFile } from "./fileValidation";
|
||||||
|
|
||||||
|
describe("fileValidation", () => {
|
||||||
|
describe("IMAGE_EXTENSIONS", () => {
|
||||||
|
it("should include all supported image formats including WebP", () => {
|
||||||
|
expect(IMAGE_EXTENSIONS).toContain("png");
|
||||||
|
expect(IMAGE_EXTENSIONS).toContain("jpg");
|
||||||
|
expect(IMAGE_EXTENSIONS).toContain("jpeg");
|
||||||
|
expect(IMAGE_EXTENSIONS).toContain("webp");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("validateFile", () => {
|
||||||
|
const createMockFile = (
|
||||||
|
name: string,
|
||||||
|
size: number,
|
||||||
|
type: string,
|
||||||
|
): File => {
|
||||||
|
const blob = new Blob(["test content"], { type });
|
||||||
|
return new File([blob], name, { type });
|
||||||
|
};
|
||||||
|
|
||||||
|
it("should accept WebP images when vision capability is enabled", () => {
|
||||||
|
const file = createMockFile("test.webp", 1024, "image/webp");
|
||||||
|
const result = validateFile(file, {
|
||||||
|
hasVisionCapability: true,
|
||||||
|
});
|
||||||
|
expect(result.valid).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should reject WebP images when vision capability is disabled", () => {
|
||||||
|
const file = createMockFile("test.webp", 1024, "image/webp");
|
||||||
|
const result = validateFile(file, {
|
||||||
|
hasVisionCapability: false,
|
||||||
|
});
|
||||||
|
expect(result.valid).toBe(false);
|
||||||
|
expect(result.error).toBe("This model does not support images");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should accept PNG images when vision capability is enabled", () => {
|
||||||
|
const file = createMockFile("test.png", 1024, "image/png");
|
||||||
|
const result = validateFile(file, {
|
||||||
|
hasVisionCapability: true,
|
||||||
|
});
|
||||||
|
expect(result.valid).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should accept JPEG images when vision capability is enabled", () => {
|
||||||
|
const file = createMockFile("test.jpg", 1024, "image/jpeg");
|
||||||
|
const result = validateFile(file, {
|
||||||
|
hasVisionCapability: true,
|
||||||
|
});
|
||||||
|
expect(result.valid).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should reject files that are too large", () => {
|
||||||
|
// Create a file with size property set correctly
|
||||||
|
const largeSize = 11 * 1024 * 1024; // 11MB
|
||||||
|
const content = new Uint8Array(largeSize);
|
||||||
|
const blob = new Blob([content], { type: "image/webp" });
|
||||||
|
const file = new File([blob], "large.webp", { type: "image/webp" });
|
||||||
|
|
||||||
|
const result = validateFile(file, {
|
||||||
|
hasVisionCapability: true,
|
||||||
|
maxFileSize: 10, // 10MB limit
|
||||||
|
});
|
||||||
|
expect(result.valid).toBe(false);
|
||||||
|
expect(result.error).toBe("File too large");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should reject unsupported file types", () => {
|
||||||
|
const file = createMockFile("test.xyz", 1024, "application/xyz");
|
||||||
|
const result = validateFile(file, {
|
||||||
|
hasVisionCapability: true,
|
||||||
|
});
|
||||||
|
expect(result.valid).toBe(false);
|
||||||
|
expect(result.error).toBe("File type not supported");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should respect custom validators", () => {
|
||||||
|
const file = createMockFile("test.webp", 1024, "image/webp");
|
||||||
|
const result = validateFile(file, {
|
||||||
|
hasVisionCapability: true,
|
||||||
|
customValidator: () => ({
|
||||||
|
valid: false,
|
||||||
|
error: "Custom error",
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
expect(result.valid).toBe(false);
|
||||||
|
expect(result.error).toBe("Custom error");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Note: processFiles tests are skipped because FileReader is not available in the Node.js test environment
|
||||||
|
// These functions are tested in browser environment via integration tests
|
||||||
|
});
|
||||||
@@ -41,7 +41,7 @@ export const TEXT_FILE_EXTENSIONS = [
|
|||||||
"rtf",
|
"rtf",
|
||||||
];
|
];
|
||||||
|
|
||||||
export const IMAGE_EXTENSIONS = ["png", "jpg", "jpeg"];
|
export const IMAGE_EXTENSIONS = ["png", "jpg", "jpeg", "webp"];
|
||||||
|
|
||||||
export interface FileValidationOptions {
|
export interface FileValidationOptions {
|
||||||
maxFileSize?: number; // in MB
|
maxFileSize?: number; // in MB
|
||||||
|
|||||||
@@ -1705,7 +1705,7 @@ func getStringFromMap(m map[string]any, key, defaultValue string) string {
|
|||||||
// isImageAttachment checks if a filename is an image file
|
// isImageAttachment checks if a filename is an image file
|
||||||
func isImageAttachment(filename string) bool {
|
func isImageAttachment(filename string) bool {
|
||||||
ext := strings.ToLower(filename)
|
ext := strings.ToLower(filename)
|
||||||
return strings.HasSuffix(ext, ".png") || strings.HasSuffix(ext, ".jpg") || strings.HasSuffix(ext, ".jpeg")
|
return strings.HasSuffix(ext, ".png") || strings.HasSuffix(ext, ".jpg") || strings.HasSuffix(ext, ".jpeg") || strings.HasSuffix(ext, ".webp")
|
||||||
}
|
}
|
||||||
|
|
||||||
// ptr is a convenience function for &literal
|
// ptr is a convenience function for &literal
|
||||||
|
|||||||
Reference in New Issue
Block a user