From 01050f3103acb5bf15e41909628504993400b31f Mon Sep 17 00:00:00 2001 From: Akarshan Biswas Date: Thu, 9 Oct 2025 07:21:53 +0530 Subject: [PATCH 1/4] fix: Gracefully handle offline mode during backend check (#6767) The `listSupportedBackends` function now includes error handling for the `fetchRemoteSupportedBackends` call. This addresses an issue where an error thrown during the remote fetch (e.g., due to no network connection in offline mode) would prevent the subsequent loading of locally installed or manually provided llama.cpp backends. The remote backend versions array will now default to empty if the fetch fails, allowing the rest of the backend initialization process to proceed as expected. --- extensions/llamacpp-extension/src/backend.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/extensions/llamacpp-extension/src/backend.ts b/extensions/llamacpp-extension/src/backend.ts index a313e01c6..bd0543227 100644 --- a/extensions/llamacpp-extension/src/backend.ts +++ b/extensions/llamacpp-extension/src/backend.ts @@ -156,8 +156,13 @@ export async function listSupportedBackends(): Promise< supportedBackends.push('macos-arm64') } // get latest backends from Github - const remoteBackendVersions = + let remoteBackendVersions = [] + try { + remoteBackendVersions = await fetchRemoteSupportedBackends(supportedBackends) + } catch (e) { + console.debug(`Not able to get remote backends, Jan might be offline or network problem: ${String(e)}`) + } // Get locally installed versions const localBackendVersions = await getLocalInstalledBackends() From c096929d8bf707c8aaca1a02da66e6fb2317e838 Mon Sep 17 00:00:00 2001 From: Roushan Kumar Singh <158602016+github-roushan@users.noreply.github.com> Date: Thu, 9 Oct 2025 22:03:07 +0530 Subject: [PATCH 2/4] fix(amd/linux): show dedicated VRAM on device list (override Vulkan UMA) (#6533) --- extensions/llamacpp-extension/src/index.ts | 63 ++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/extensions/llamacpp-extension/src/index.ts b/extensions/llamacpp-extension/src/index.ts index f1a750138..d5d13804f 100644 --- a/extensions/llamacpp-extension/src/index.ts +++ b/extensions/llamacpp-extension/src/index.ts @@ -2012,6 +2012,69 @@ export default class llamacpp_extension extends AIEngine { libraryPath, envs, }) + // On Linux with AMD GPUs, llama.cpp via Vulkan may report UMA (shared) memory as device-local. + // For clearer UX, override with dedicated VRAM from the hardware plugin when available. + try { + const sysInfo = await getSystemInfo() + if (sysInfo?.os_type === 'linux' && Array.isArray(sysInfo.gpus)) { + const usage = await getSystemUsage() + if (usage && Array.isArray(usage.gpus)) { + const uuidToUsage: Record = {} + for (const u of usage.gpus as any[]) { + if (u && typeof u.uuid === 'string') { + uuidToUsage[u.uuid] = u + } + } + + const indexToAmdUuid = new Map() + for (const gpu of sysInfo.gpus as any[]) { + const vendorStr = + typeof gpu?.vendor === 'string' + ? gpu.vendor + : typeof gpu?.vendor === 'object' && gpu.vendor !== null + ? String(gpu.vendor) + : '' + if ( + vendorStr.toUpperCase().includes('AMD') && + gpu?.vulkan_info && + typeof gpu.vulkan_info.index === 'number' && + typeof gpu.uuid === 'string' + ) { + indexToAmdUuid.set(gpu.vulkan_info.index, gpu.uuid) + } + } + + if (indexToAmdUuid.size > 0) { + const adjusted = dList.map((dev) => { + if (dev.id?.startsWith('Vulkan')) { + const match = /^Vulkan(\d+)/.exec(dev.id) + if (match) { + const vIdx = Number(match[1]) + const uuid = indexToAmdUuid.get(vIdx) + if (uuid) { + const u = uuidToUsage[uuid] + if ( + u && + typeof u.total_memory === 'number' && + typeof u.used_memory === 'number' + ) { + const total = Math.max(0, Math.floor(u.total_memory)) + const free = Math.max(0, Math.floor(u.total_memory - u.used_memory)) + return { ...dev, mem: total, free } + } + } + } + } + return dev + }) + return adjusted + } + } + } + } catch (e) { + logger.warn('Device memory override (AMD/Linux) failed:', e) + } + return dList } catch (error) { logger.error('Failed to query devices:\n', error) From 584daa96829137c4f5003f657cb415c6556e5574 Mon Sep 17 00:00:00 2001 From: Faisal Amir Date: Sat, 11 Oct 2025 21:46:15 +0700 Subject: [PATCH 3/4] chore: revert track event posthog --- web-app/src/containers/ChatInput.tsx | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/web-app/src/containers/ChatInput.tsx b/web-app/src/containers/ChatInput.tsx index 3d70e93f0..1cf20fdd2 100644 --- a/web-app/src/containers/ChatInput.tsx +++ b/web-app/src/containers/ChatInput.tsx @@ -40,8 +40,6 @@ import { useShallow } from 'zustand/react/shallow' import { McpExtensionToolLoader } from './McpExtensionToolLoader' import { ExtensionTypeEnum, MCPExtension } from '@janhq/core' import { ExtensionManager } from '@/lib/extension' -import { useAnalytic } from '@/hooks/useAnalytic' -import posthog from 'posthog-js' type ChatInputProps = { className?: string @@ -90,7 +88,6 @@ const ChatInput = ({ const selectedModel = useModelProvider((state) => state.selectedModel) const selectedProvider = useModelProvider((state) => state.selectedProvider) const sendMessage = useChat() - const { productAnalytic } = useAnalytic() const [message, setMessage] = useState('') const [dropdownToolsAvailable, setDropdownToolsAvailable] = useState(false) const [tooltipToolsAvailable, setTooltipToolsAvailable] = useState(false) @@ -192,18 +189,6 @@ const ChatInput = ({ } setMessage('') - // Track message send event with PostHog (only if product analytics is enabled) - if (productAnalytic && selectedModel && selectedProvider) { - try { - posthog.capture('message_sent', { - model_provider: selectedProvider, - model_id: selectedModel.id, - }) - } catch (error) { - console.debug('Failed to track message send event:', error) - } - } - sendMessage( prompt, true, From 176ad07f1d279923b76044b3d6899dd76ae29eb2 Mon Sep 17 00:00:00 2001 From: Minh141120 Date: Tue, 14 Oct 2025 13:54:43 +0700 Subject: [PATCH 4/4] docs: update jan server url --- docs/src/pages/docs/desktop/index.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/pages/docs/desktop/index.mdx b/docs/src/pages/docs/desktop/index.mdx index 852f097a5..3c225abb3 100644 --- a/docs/src/pages/docs/desktop/index.mdx +++ b/docs/src/pages/docs/desktop/index.mdx @@ -41,7 +41,7 @@ Jan is an open-source replacement for ChatGPT: Jan is a full [product suite](https://en.wikipedia.org/wiki/Software_suite) that offers an alternative to Big AI: - [Jan Desktop](/docs/desktop/quickstart): macOS, Windows, and Linux apps with offline mode -- [Jan Web](https://chat.jan.ai): Jan on browser, a direct alternative to chatgpt.com +- [Jan Web](https://chat.menlo.ai): Jan on browser, a direct alternative to chatgpt.com - Jan Mobile: iOS and Android apps (Coming Soon) - [Jan Server](/docs/server): deploy locally, in your cloud, or on-prem - [Jan Models](/docs/models): Open-source models optimized for deep research, tool use, and reasoning