mirror of
https://github.com/Mintplex-Labs/anything-llm.git
synced 2026-07-21 01:25:28 -04:00
[GH-ISSUE #4026] [BUG]: Fail to fetch using ARM NPU Embedder on Windows when user has non-ASCII characters in username. #2561
Open
opened 2026-02-22 18:30:15 -05:00 by yindo
·
4 comments
No Branch/Tag Specified
master
5846-bug-when-scrolling-up-scrolling-jumps
2235-translations
2235-bug-how-to-upload-a-folder-with-subfolders-with-files-to-anythingllm
refactor-remove-workspace-pfp
5969-bug-stopgenerationbutton-disappears-on-the-first-prompt-that-initiates-an-agent-session
5968-chore-update-default-system-prompt-for-better-tool-use
5990-workspace-update-fails-with-unknown-argument-router_id-v1130v1150-intel-mac
opencomputer-examples
pg
feat/image-generation-translations
feat/image-generation
5924-bug-meeting-summary-fails-with-sincludes-is-not-a-function-when-default-llm-is-anthropic-claude
render
feat/uniform-modal-component
5883-bug-unescaped-content-in-json-strings-being-passed-to-document-generator-tools
5901-bug-api-update-embeddings-fails-prisma-argument-filename-is-missing-on-workspace_documentscreate-desktop-windows-v1141
hybrid-search
1981-translations
5752-bug-prompts-to-local-jan-endpoint-unresponsive
feat-disable-native-tool-calling-env-var
5676-bug-non-ollama-agent-providers-do-not-parse-and-present-reasoning-content
feat/markdown-web-scraping
5717-bug-apiv1documentupload-silently-drops-metadata-field-in-desktop-1130-arg-count-mismatch-nested-payload-key
fix/aibitat-context-overflow
5711-bug-erratic-deepseek-v4-flash-the-agent-model-failed-to-respond-400-the-reasoning_content
5631-feat-custom-api-request-timeouts-for-ai-providers
feat-reasoning-control
feat-agent-clarifying-questions-translations
5583-bug-lm-studio-provider-does-not-present-reasoning-output
5313-normalize-translations
feat/memory-translations
5305-lemonade-embedding-engine-swallows-errors-falsely-reports-documents-as-embedded
5060-bug-agent-interactions-agent-are-not-persisted-to-thread-history-via-api
pptx-subagent
feat-render-images-from-mcp-tool-results
stt-provider-expansion-openai-api-compatible
feat-file-search-agent-tool
feat-native-embedder-job-queue
5189-normalize-translations
feat-file-search-agent-tool-translations
i18n-eslint
5140-auto-migration
5112-bug-openrouter-failed-message-bug
3506-feat-parameters-for-openrouter-models
4992-feat-preserve-scroll-position
4973-bug-markdown-numbered-list-display-in-reasoning-pane
desktop
4938-bug-pending-chat-rerendering-ui-bug
quickstart-env
node-llama-cpp-in-container-cuda
node-llama-cpp-in-container
ollama-in-container
4817-feat-set-cooldown-per-mcp-server
4845-keyboard-shortcuts-to-navigate-in-chat
4844-feat-reorder-threads-by-latest-interaction
standardize-username-constraints-normalize-translations
4792-feat-refactor-workspacepfp-image
1382-embed-ip-improvements
1382-bug-embed-api-improvements
refactor-eslint-frontend
4687-feat-refactor-vector-db-providers
4615-feat-disable-apidocs-with-environment-variable
4559-feat-agent-web-search-enable-ordering-of-results
4599-bug-ollama-race-condition-bug
4572-bug-lmstudio-provided-llm-stopped-working-with-anything-llm-after-upgrading-to-190
4508-agent-youtube-transcript-analysis
4497-feat-workspace-names
frontend-eslint
ollama-lmstudio-auto-context-window
4431-validate-vector-database-connectioN
2019-slash-command-keyboard-selection
microsoft-foundry-provider
4431-validate-vector-database-connection
4325-sys-prompt-var-improvements
3209-feat-apiv1workspacestream-chat-sources-citations
4210-bug-voice-to-text-overwrite
4136-feat-jan-as-a-backend-server-option
4172-feat-openai-o3-support
1.8.3-rerelease
web-push-notifications-service
tasks
3955-feat-jinaai-embedder-provider-support
3921-feat-agent-skills-uiux-improvements
3901-bug-validfunccall-checks-optional-arguments
keyboard-dev
1787-custom-roles-and-permissions
add-jira-slack-data-connector
office-extension-wip
lightmode-dropdown-color-update
3586-bug-agent-flow-function-description-provided-by-user-is-not-seen-in-the-llm-query
3463-bug-agent-continues-to-run-if-request-failed-even-after-exit
3439-feat-call-variables-within-the-flow-api-block-url-field
3282-manager-view-models-workspace
3280-token-counting-server-side-truncation-improvements
3147-bug-embedded-chat-widget---not-considering-query-mode-option-always-working-in-chat-mode
2995-feat-disable-temperature-setting-for-deepseek-r1-deepseek-reasoner-model
2827-feat-perplexity-citations
2866-feat-finally-a-gemini-models-endpoint
2647-feat-hpp-header-for-a-c++-code-file-mime-addition
lancedb-revert
1656-feat-implement-tooltip-ui-designs
2011-feat-bump-perplexity-models
1873-feat-auto-add-and-watch-folder-for-document-uploads
1297-feat-gemini-agent-support
1759-bug-ui-bug-fixes
1686-feat-implement-winston-for-logging
1536-bug-toggling-on-users-can-delete-workspaces-does-not-take-effect
agent-ui-mobile-styles
1522-feat-chromadb-support
1595-bug-unable-to-get-live-web-search-and-browsing-agent-working-using-google-custom-search-engine-error-getaddrinfo-enotfound-http-errno-3008
1582-bug-lm-studio-does-not-allow-for-different-model-selection
1312-bug-usernames-should-not-be-case-sensitive-when-logging-in
1029-feat-hf-serverless-inference-api
1086-feat-implement-normalized-input-fields
knowledge-graph-support
644-bug-uploaded-file-name-does-not-match-the-displayed-file-name-after-the-upload
v1.15.0
v1.14.2
v1.14.1
v1.14.0
v1.13.0
v1.12.1
v1.12.0
v1.11.2
v1.11.1
v1.11.0
v1.10.0
v1.9.1
v1.9.0
v1.8.5
v1.8.4
v1.8.3
v1.8.2
v1.8.1
v1.8.0
v1.7.8
v1.7.6
v1.7.5
v1.7.4
v1.4.0
v1.3.0
v1.2.4
v1.2.3
v1.2.2
v1.2.1
v1.2.0
v1.1.1
v1.1.0
v1.0.0
Labels
Clear labels
Desktop
Docker
Integration Request
Integration Request
OS: Linux
OS: Mobile
OS: Windows
UI/UX
blocked
bug
bug
core-team-only
documentation
duplicate
embed-widget
enhancement
feature request
github_actions
good first issue
investigating
needs info / can't replicate
possible bug
pull-request
question
stage: specifications
wontfix
Mirrored from GitHub Pull Request
Milestone
No items
No Milestone
Projects
Clear projects
No project
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: Mintplex-Labs/anything-llm#2561
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @zacken on GitHub (Jun 20, 2025).
Original GitHub issue: https://github.com/Mintplex-Labs/anything-llm/issues/4026
How are you running AnythingLLM?
AnythingLLM desktop app
What happened?
When trying to embed documents on a Windows ARM (Snapdragon) PC using the NPU Embedder it fails with a "Failed to fetch" error.
From log (username is anonymized):
[backend] info: [QnnNativeEmbedder] NPU is enabled, using QnnSDK backend at C:\Users\HxxxxxFørxx\AppData\Local\Programs\AnythingLLM\resources\QnnSDK\aarch64-windows-msvc\QnnHtp.dll
Runtime options:
backend_path: C:\Users\HxxxxxFørxx\AppData\Local\Programs\AnythingLLM\resources\QnnSDK\aarch64-windows-msvc\QnnHtp.dll
soc_model: 60
htp_arch: 73
htp_performance_mode: high_performance
enable_htp_fp16_precision: 1
Load model from C:\Users\HenrikFᅢᄌrli\AppData\Roaming\anythingllm-desktop\storage\models\qnn-embedder\all-minilm-l6-v2\model.onnx failed:Load model C:\Users\HxxxxxFᅢᄌrxx\AppData\Roaming\anythingllm-desktop\storage\models\qnn-embedder\all-minilm-l6-v2\model.onnx failed. File doesn't exist
In this case the character ø is replaced with ᅢᄌ in the path when loading model.onnx
When loading LLM models the correct path is created:
[backend] info: [TokenManager] Initialized new TokenManager instance for model: C:\Users\HxxxxxFørxx\AppData\Roaming\anythingllm-desktop\storage\models\QNN\phi_3_5_mini_instruct_4k
Are there known steps to reproduce?
Can be reproduced by using Windows account with international characters on a Windows ARM Snapdragon PC, install AnythingLLM, select NPU Embedder, embed document.
Work if no international characters in Windows username.
Workaround
Start a command prompt in administrator mode and create a symlink between the wrong folder and the correct one:
mklink /d C:\Users\HxxxxxFᅢᄌrxx C:\Users\HxxxxxFørxxVerified to work.
@timothycarambat commented on GitHub (Jun 24, 2025):
Interesting, thanks for writing this up but also providing a temporay workaround while we address that
[BUG]: Fail to fetch using ARM NPU Embedder on Windows when user has non-ASCII characters in username.to [GH-ISSUE #4026] [BUG]: Fail to fetch using ARM NPU Embedder on Windows when user has non-ASCII characters in username.@majiayu000 commented on GitHub (Mar 21, 2026):
Hi, I've been looking into this and traced the root cause.
Proposed approach: Find the NPU/QNN embedder path construction code (likely in server/utils/EmbeddingEngines/ or similar). Compare how the LLM model path is constructed (which works correctly with non-ASCII characters) vs. how the embedder model path is constructed. The fix likely involves ensuring proper UTF-8 encoding or using Buffer/path APIs that handle Unicode correctly when resolving the model.onnx path. The broken encoding 'ᅢᄌ' for 'ø' suggests a double-encoding or incorrect charset conversion — fix by using native path APIs (e.g., Node.js path.join) instead of string concatenation, or ensuring proper encoding when passing paths to the ONNX runtime.
I'll open a draft PR shortly. Happy to adjust based on your preference.
@majiayu000 commented on GitHub (Mar 21, 2026):
Hi, I've been looking into this and traced the root cause.
Proposed approach: 1. Clone/fork the repo, locate NPU/QNN embedder code (likely server/utils/EmbeddingEngines/ or similar QnnNativeEmbedder class). 2. Compare how LLM model path is constructed (works correctly with ø) vs embedder path (corrupts ø to ᅢᄌ — classic double UTF-8 encoding / mojibake). 3. Fix by ensuring proper UTF-8 handling — likely replace string concatenation with path.join() or fix charset conversion when passing paths to ONNX runtime. 4. Add unit test for non-ASCII path handling. 5. PR title: 'fix: handle non-ASCII characters in NPU embedder model path'.
I'll open a draft PR shortly. Happy to adjust based on your preference.
@leavedrop commented on GitHub (May 25, 2026):
Root cause looks like a classic Windows + native binding UTF-8 path bug. The character
ø(U+00F8, two UTF-8 bytes:0xC3 0xB8) is being interpreted by the QnnSDK / ONNX Runtime ARM64 native binding as a Latin-1 / OEM codepage string rather than UTF-8 — the bytes0xC3 0xB8are then re-encoded into the path, producing the garbageᅢᄌyou see in the failure log. The LLM model load path works because that path goes through a different code path (TokenManager uses a JS-only layer that doesn't cross the native ABI for path strings).The reason
Load model from <path>succeeds in the log message but actual file open fails is that the log string is still a JS UTF-8 string, but by the time the path is handed off to the QnnSDK native function it's been silently transcoded.Three fix layers, ordered by how invasive they are:
Userland workaround (zero-code, immediate): document that the QNN embedder storage directory must use a Windows short path. Operators can set the storage env var to e.g.
C:\AnythingLLM(no non-ASCII) and the bug disappears. This is what most native-binding-with-broken-utf8 projects ship as the interim fix.Resolve path to 8.3 short name before handing to native (small, robust): before calling into the QnnSDK / ONNX Runtime, resolve the storage-relative model path through Windows'
GetShortPathName(Node hasfs.realpath+win32short-path APIs vianode-shortpathor a directfficall). The resulting path is ASCII-only by construction. Doesn't require touching the native binding.Fix the native binding to take UTF-8 (right but invasive): patch the QnnSDK Node addon to accept
std::wstring/Path16and usefopen_swith the wide-char filename path instead offopen. This is the correct fix but requires a native build and coordination with the QnnSDK vendor.I'd suggest shipping (1) as an immediate doc note and (2) as the proper code fix — happy to PR (2) plus a regression test that asserts the resolved storage path is ASCII-only before the native call. Don't have an ARM NPU machine to verify end-to-end though, so someone with the hardware would need to confirm the embed actually completes after the path resolution change.
Same class of bug recurs across native bindings on Windows whenever a user has any non-ASCII char in their Windows username (Cyrillic, CJK, accented Latin like this one). Worth fixing once at the path-handoff layer.