diff --git a/.gitignore b/.gitignore index 42ae86f..308219c 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,9 @@ flux1-kontext-dev-Q3_K_S.gguf gemma-3-4b-it.Q8_0.gguf .webui_secret_key chroma-unlocked-v29-Q3_K_L.gguf +Qwen-Image-Edit-2509-Q4_K_S.gguf +Qwen2.5-VL-7B-Instruct.mmproj-Q8_0.gguf +Qwen2.5-VL-7B-Instruct.Q4_K_S.gguf +qwen_image_vae.safetensors +flux1-kontext-dev-Q4_K_S.gguf +chroma-unlocked-v45-Q4_0.gguf diff --git a/package.json b/package.json index 7e90654..ec95702 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "gerbil", "productName": "Gerbil", - "version": "1.8.2", + "version": "1.8.3", "description": "Run Large Language Models locally", "main": "out/main/index.js", "homepage": "./", @@ -39,7 +39,7 @@ "license": "AGPL-3.0-or-later", "devDependencies": { "@eslint/js": "^9.39.0", - "@types/node": "^24.9.2", + "@types/node": "^24.10.0", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@types/yauzl": "^2.10.3", diff --git a/src/components/settings/SystemTab.tsx b/src/components/settings/SystemTab.tsx index 2346059..c5356a1 100644 --- a/src/components/settings/SystemTab.tsx +++ b/src/components/settings/SystemTab.tsx @@ -14,6 +14,7 @@ export const SystemTab = () => { null ); const [hardwareInfo, setHardwareInfo] = useState(null); + const [koboldVersion, setKoboldVersion] = useState(null); useEffect(() => { const loadVersionInfo = async () => { @@ -23,6 +24,14 @@ export const SystemTab = () => { } }; + const loadKoboldVersion = async () => { + const currentVersion = + await window.electronAPI.kobold.getCurrentVersion(); + if (currentVersion) { + setKoboldVersion(currentVersion.version); + } + }; + const loadHardwareInfo = async () => { try { const [cpu, gpu, gpuCapabilities, gpuMemory, systemMemory] = @@ -50,6 +59,7 @@ export const SystemTab = () => { }; loadVersionInfo(); + loadKoboldVersion(); loadHardwareInfo(); }, []); @@ -61,7 +71,7 @@ export const SystemTab = () => { ); } - const softwareItems = createSoftwareItems(versionInfo); + const softwareItems = createSoftwareItems(versionInfo, koboldVersion); const driverItems = hardwareInfo ? createDriverItems(hardwareInfo) : []; const hardwareItems = hardwareInfo ? createHardwareItems(hardwareInfo) : []; diff --git a/src/constants/imageModelPresets.ts b/src/constants/imageModelPresets.ts index 66f2845..53c5417 100644 --- a/src/constants/imageModelPresets.ts +++ b/src/constants/imageModelPresets.ts @@ -14,28 +14,42 @@ export const IMAGE_MODEL_PRESETS = [ name: 'FLUX.1', description: 'FLUX.1 development model with default encoders', sdmodel: - 'https://huggingface.co/bullerwins/FLUX.1-Kontext-dev-GGUF/resolve/main/flux1-kontext-dev-Q3_K_S.gguf?download=true', + 'https://huggingface.co/bullerwins/FLUX.1-Kontext-dev-GGUF/resolve/main/flux1-kontext-dev-Q4_K_S.gguf', sdt5xxl: - 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/t5xxl_fp8_e4m3fn.safetensors?download=true', + 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/t5xxl_fp8_e4m3fn.safetensors', sdclipl: - 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/clip_l.safetensors?download=true', + 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/clip_l.safetensors', sdclipg: '', sdphotomaker: '', sdvae: - 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/ae.safetensors?download=true', + 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/ae.safetensors', }, { name: 'Chroma', description: 'Chroma with optimized VAE and shared encoders', sdmodel: - 'https://huggingface.co/silveroxides/Chroma-GGUF/resolve/main/chroma-unlocked-v29/chroma-unlocked-v29-Q3_K_L.gguf?download=true', + 'https://huggingface.co/silveroxides/Chroma-GGUF/resolve/main/chroma-unlocked-v45/chroma-unlocked-v45-Q4_0.gguf', sdt5xxl: - 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/t5xxl_fp8_e4m3fn.safetensors?download=true', + 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/t5xxl_fp8_e4m3fn.safetensors', sdclipl: - 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/clip_l.safetensors?download=true', + 'https://huggingface.co/camenduru/FLUX.1-dev/resolve/main/clip_l.safetensors', sdclipg: '', sdphotomaker: '', sdvae: - 'https://huggingface.co/lodestones/Chroma/resolve/main/ae.safetensors?download=true', + 'https://huggingface.co/lodestones/Chroma/resolve/main/ae.safetensors', + }, + { + name: 'Qwen Image Edit 2509', + description: 'Qwen Image Edit model with vision encoder and VAE', + sdmodel: + 'https://huggingface.co/QuantStack/Qwen-Image-Edit-2509-GGUF/resolve/main/Qwen-Image-Edit-2509-Q4_K_S.gguf', + sdt5xxl: '', + sdclipl: + 'https://huggingface.co/mradermacher/Qwen2.5-VL-7B-Instruct-GGUF/resolve/main/Qwen2.5-VL-7B-Instruct.Q4_K_S.gguf', + sdclipg: + 'https://huggingface.co/mradermacher/Qwen2.5-VL-7B-Instruct-GGUF/resolve/main/Qwen2.5-VL-7B-Instruct.mmproj-Q8_0.gguf', + sdphotomaker: '', + sdvae: + 'https://huggingface.co/Comfy-Org/Qwen-Image_ComfyUI/resolve/main/split_files/vae/qwen_image_vae.safetensors', }, ] as const; diff --git a/src/main/modules/koboldcpp/launcher.ts b/src/main/modules/koboldcpp/launcher.ts index e9cb795..6c3fb53 100644 --- a/src/main/modules/koboldcpp/launcher.ts +++ b/src/main/modules/koboldcpp/launcher.ts @@ -88,7 +88,8 @@ const patchKcppSduiEmbd = (unpackedDir: string) => export async function launchKoboldCpp( args: string[] = [], - frontendPreference: FrontendPreference = 'koboldcpp' + frontendPreference: FrontendPreference = 'koboldcpp', + imageGenerationFrontendPreference?: ImageGenerationFrontendPreference ) { try { if (koboldProcess) { @@ -114,14 +115,17 @@ export async function launchKoboldCpp( const binaryDir = currentVersion.path.split(/[/\\]/).slice(0, -1).join('/'); - const { isImageMode } = parseKoboldConfig(args); + const { isImageMode, isTextMode } = parseKoboldConfig(args); if (frontendPreference === 'koboldcpp') { if (isImageMode) { await patchKcppSduiEmbd(binaryDir); - } else { + } + if (isTextMode) { await patchKliteEmbd(binaryDir); } + } else if (isImageMode && imageGenerationFrontendPreference === 'builtin') { + await patchKcppSduiEmbd(binaryDir); } const finalArgs = [...args]; @@ -223,7 +227,11 @@ export const launchKoboldCppWithCustomFrontends = async (args: string[] = []) => 'imageGenerationFrontendPreference' )) as ImageGenerationFrontendPreference | undefined; - const result = await launchKoboldCpp(args, frontendPreference); + const result = await launchKoboldCpp( + args, + frontendPreference, + imageGenerationFrontendPreference + ); const { isImageMode, isTextMode } = parseKoboldConfig(args); diff --git a/src/utils/systemInfo.ts b/src/utils/systemInfo.ts index 7172f70..0708f18 100644 --- a/src/utils/systemInfo.ts +++ b/src/utils/systemInfo.ts @@ -3,7 +3,10 @@ import { PRODUCT_NAME } from '@/constants'; import type { InfoItem } from '@/components/InfoCard'; import type { HardwareInfo } from '@/types/hardware'; -export const createSoftwareItems = (versionInfo: SystemVersionInfo) => [ +export const createSoftwareItems = ( + versionInfo: SystemVersionInfo, + koboldVersion?: string | null +) => [ { label: PRODUCT_NAME, value: versionInfo.aurPackageVersion @@ -15,6 +18,11 @@ export const createSoftwareItems = (versionInfo: SystemVersionInfo) => [ })() : versionInfo.appVersion, }, + ...(koboldVersion ? [{ label: 'KoboldCpp', value: koboldVersion }] : []), + { + label: 'OS', + value: `${versionInfo.platform} ${versionInfo.arch} (${versionInfo.osVersion})`, + }, { label: 'Electron', value: versionInfo.electronVersion }, { label: 'Node.js', @@ -26,10 +34,6 @@ export const createSoftwareItems = (versionInfo: SystemVersionInfo) => [ }, { label: 'Chromium', value: versionInfo.chromeVersion }, { label: 'V8', value: versionInfo.v8Version }, - { - label: 'OS', - value: `${versionInfo.platform} ${versionInfo.arch} (${versionInfo.osVersion})`, - }, ...(versionInfo.uvVersion ? [{ label: 'uv', value: versionInfo.uvVersion }] : []), diff --git a/yarn.lock b/yarn.lock index 9806b9c..c400f7d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1394,12 +1394,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^24.9.2": - version: 24.9.2 - resolution: "@types/node@npm:24.9.2" +"@types/node@npm:*, @types/node@npm:^24.10.0": + version: 24.10.0 + resolution: "@types/node@npm:24.10.0" dependencies: undici-types: "npm:~7.16.0" - checksum: 10c0/7905d43f65cee72ef475fe76316e10bbf6ac5d08a7f0f6c38f2b6285d7ca3009e8fcafc8f8a1d2bf3f55889c9c278dbb203a9081fd0cf2d6d62161703924c6fa + checksum: 10c0/f82ed7194e16f5590ef7afdc20c6d09068c76d50278b485ede8f0c5749683536e3064ffa8def8db76915196afb3724b854aa5723c64d6571b890b14492943b46 languageName: node linkType: hard @@ -3771,7 +3771,7 @@ __metadata: "@huggingface/gguf": "npm:^0.3.2" "@mantine/core": "npm:^8.3.6" "@mantine/hooks": "npm:^8.3.6" - "@types/node": "npm:^24.9.2" + "@types/node": "npm:^24.10.0" "@types/react": "npm:^19.2.2" "@types/react-dom": "npm:^19.2.2" "@types/yauzl": "npm:^2.10.3"