AnythingLLM 为什么不能上传整个文件夹?有哪些替代方案

👁 103 次阅读

AnythingLLM 为什么不能上传整个文件夹?有哪些替代方案

来源:https://github.com/Mintplex-Labs/anything-llm/issues/2235

现象描述

Issue #2235 由 Mintplex-Labs/anything-llm 项目于 2024-09-06 提交,标签为 possible bug。用户在 AnythingLLM 桌面版尝试将一个包含多层子目录的文件夹整体上传到工作区,发现文件选择器只允许逐文件添加,无法在 UI 上以目录为单位进行批处理。用户在描述中同时给出两点:
  • 文件选择器不暴露文件夹入口,只能”file by file”逐个添加,工作量大且难以保证目录结构完整;
  • 拖拽上传虽然支持,但 .rtf 这类小文件会”holds forever without success”,且官方文档给出的扩展名说明”supports text files, csv’s, spreadsheets, audio files, and more!”没有给出完整清单。
Issue 于 2026-07-29 关闭,关闭原因字段为 completed。截至关闭前最后一条实质评论(voxvargr,2026-07-13)仍在追问”Has this feature ever been added?”,维护者 timothycarambat 于 2026-03-16 仅回复”Linking #3561 #5000″并将讨论关联到其他 issue,未给出复现确认、修复 PR 或版本号。按关闭原因判定流程,issue 已关闭归档,但官方未提交修复,关闭原因与维护者判定无关。

背景原因

维护者 timothycarambat 在 2025-01-06 的评论中明确指出限制来源: > “This issue has been open for so long simply because it isn’t exactly trivial but it’s by no means an impossible feat or splitting the atom. It’s just something that has the opportunity to really cause a mess in the file picker since it only supports 1 level deep folders right now.” 即 AnythingLLM 当前的文件选择器只支持 1 层深度的文件夹,若直接放开任意深度,会在选择器、上传队列、切片向量化等环节引入级联问题。 社区讨论中给出了两条具体的技术障碍:
  • redkit75 指出,MVC 分层项目中控制器、模型、路由的路径信息会丢失,模型在回答问题时无法根据相对路径定位函数;同时同目录下的同名文件在入库后会互相覆盖语义。
  • Yuki001 建议参考已有的 GitHub Repo Data Connector 实现”Local folder”Data Connector,递归采集目录并把相对路径写进文档文件名;该连接器已能”create new folder for all documents and has relative path in the collected document file name”,可以作为功能设计的直接参照。

排查或量化方法

在提出需求前建议先确认三项事实:
  • 运行形态:AnythingLLM 桌面版、Docker、还是 Web 版。用户 chadananda 与 bogart99j 分别提到 Docker 下”can see all subfolders and files”但”web UI does not display subfolders”,说明后端能读到子目录,问题在前端选择器。
  • 格式范围模糊:AnythingLLM 上传提示写的是”supports text files, csv’s, spreadsheets, audio files, and more!”,没有完整清单;and more!不等同于任意文本格式,.rtf 未被显式列出是卡住的常见原因。
  • 目标目录深度:单层目录通过拖拽逐文件添加即可完成,多层目录才必须走 API、Data Connector 或 MCP 路径。

完整解决方案

由于官方未提交修复,社区讨论给出的可用替代方案如下,均标注其适用范围与局限。 方案 A:借助 MCP filesystem server thiromi 于 2025-06-16 建议在 AnythingLLM 的 MCP 兼容模式下挂载 filesystem server,让检索时按需读取子目录:
# AnythingLLM MCP 兼容性总览
https://docs.anythingllm.com/mcp-compatibility/overview

# filesystem server 用法示例
https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem#usage-with-claude-desktop
局限:thiromi 在评论末尾写”The only stubborn thing is having to use @agent when prompting”,即提问时必须显式 @agent,交互体验不如原生工作区;且该方式把文件系统当工具调用,而非一次性向量化入库,长时检索延迟高于本地嵌入。 方案 B:使用 GitHub Repo Data Connector Yuki001 在讨论中观察到 GitHub Repo 连接器已支持”recursive in the folder”并生成”relative path in the collected document file name”。将目标目录同步到私有仓库后再通过该连接器导入,可以绕过文件选择器的一层深度限制。 局限:适合源代码与 Markdown 类文档,对大型二进制素材、私有目录场景不实用;对非代码类工作区需要额外一次 Git 推送动作。 方案 C:脚本调用本地 API 批量入库 Y-Sari 于 2025-05-08 在评论中询问”Does AnythingLLM (Desktop) have an API that we could use to upload documents? Than we could create our own scripts that use that API until this feature becomes part of the product”,希望以脚本形式替代 UI 交互。该建议未在 issue 中获得维护者明确答复,该功能的具体实现尚未公开,读者需在项目文档或源码中自行核对当前版本的 HTTP 接口是否已开放。 局限:脚本方案受当前版本 API 稳定性影响;版本升级可能改动字段与路径,需要用户自行做回归。 方案 D:等待功能落地 维护者 timothycarambat 于 2026-03-16 回复”Linking #3561 #5000″,将讨论与两个后续 issue 关联。这两个条目在当前信息范围内属于后续追踪,未在 #2235 讨论中给出可核查的合入记录或版本号。若需要跟踪,可通过 GitHub API 分别查询 #3561、#5000 的状态与 PR 归属。

参数或对比表格

方案支持递归目录保留相对路径适用场景主要局限
UI 拖拽(默认)否,仅 1 层否少量扁平文件无法批量、扩展名过滤不确定
GitHub Repo Data Connector是是(据 issue 讨论)源代码、Markdown需要先推送到仓库
MCP filesystem server是是(按文件系统路径)需要即时读取而非全量嵌入提问必须 @agent
本地 API 脚本视 API 支持而定视实现而定自动化流水线接口稳定性未确认
官方 Local folder Connector计划中计划中通用尚未发布

常见错误排查

  • 拖拽 .rtf 一直转圈:.rtf 不在提示给出的格式表述范围内。改用文档明确点名的文本类或 csv 类文件再试。
  • Docker 挂载后 UI 看不到子目录:bogart99j 反馈”Docker can see all subfolders and files. However, the AnythingLLM web UI does not display subfolders when I click the arrow or double-click on the mounted folder”,属于 UI 层限制而非容器挂载问题;换用桌面版或脚本方式仍可访问。
  • 同名文件在库内互相覆盖语义:redkit75 明确指出存在同名文件会导致控制器/模型无法区分。入库前手动加前缀,或使用支持相对路径的 Data Connector。
  • 想一次性拖入整个工作区文件夹:文件选择器限制,需切换至方案 A/B/C 之一,或等待后续版本。
  • 误以为关闭 issue 就等于已修复:#2235 关闭原因虽为 completed,但社区最后一条实质评论仍在使用时态询问是否已添加,维护者仅做关联,未确认修复。

实践建议

  • 代码类工作区优先选 GitHub Repo Data Connector,让相对路径进入文档名。
  • 非代码类文档建议按文件类型统一转成提示中明确点名的纯文本类文件再入库,规避格式范围不明的风险。
  • 深度目录的长期方案应关注维护者关联的 #3561 与 #5000,通过 GitHub API 查询其 PR 合入状态而非以 #2235 的关闭状态推断功能可用性。
  • 需要在演示与真实数据之间兼得时(chadananda 在讨论中批评”You only need a few flat files for a demo but real data lives in nested folders”),演示环境可以继续用扁平文件,生产工作区走方案 A 或 B。
  • 使用 MCP 方案前先测延迟:filesystem 工具调用走的是 LLM 工具协议而非本地向量检索,文档规模较大时响应会明显变慢。

FAQ

Q1:#2235 显示 closed / completed,是否代表文件夹上传已修复? 按 GitHub API 关闭原因字段判断,issue 关闭原因与维护者判定无关。社区末条实质评论(voxvargr,2026-07-13)仍在使用时态追问”Has this feature ever been added?”,维护者仅回复”Linking #3561 #5000″未给出修复 PR 或版本号。issue 已关闭归档,但官方未提交修复。 Q2:AnythingLLM 支持哪些扩展名? 据 issue 讨论,官方文档给出的表述为”supports text files, csv’s, spreadsheets, audio files, and more!”,没有完整清单。.rtf 上传卡住是社区已知现象,建议改用提示中明确点名的文本类或 csv 类格式再试。 Q3:能否通过 API 脚本批量上传目录? Y-Sari 于 2025-05-08 在评论中提出该思路,希望”use that API”写脚本;issue 中未获得维护者明确答复,该功能的具体实现尚未公开,读者需查阅当前版本的 API 文档自行核对。 Q4:Local folder Data Connector 何时发布? 社区未获得官方发布节奏信息。维护者仅将讨论关联到 #3561 与 #5000,两个条目的合入状态建议通过 GitHub API 查询,不要以 #2235 的关闭状态推断。 Q5:MCP filesystem 方案能完全替代原生文件夹上传吗? 据 thiromi 讨论,MCP 方案可以按需读取任意层级文件系统,但提问时必须使用 @agent 前缀,且每次检索是工具调用而非本地向量召回,长时检索延迟高于一次性嵌入。适合作为过渡方案,不适合作为完全替代。

订阅 AI 百事知

每周精选 AI 工具评测、行业资讯与使用教程,第一时间送达。

🔗 相关阅读(你可能还想看)

📄 Outlook 节点创建草稿添加附件为何报 UnableToDeserializePostBody?
📄 Flowise 点击市场或聊天页为何整页白屏?
📄 如何解决 Azure AI Search 向量存储的 $filter 递归深度超限错误?
📄 如何解决 shadcn/ui Sidebar 与 Header 重叠的问题?
📄 Next.js 开发服务器为何会 JavaScript heap out of memory?
📄 Nuxt 偶发 Cannot read properties of undefined 报错是怎么回事
📄 如何解决「Visual Studio Code for ipad」相关的问题?
📄 如何在AutoGen中实现企业级代理治理的加密行动收据(AAR)?
📄 记忆内容未清洗直接注入系统提示词,如何防范间接提示注入?
crewAI LiteAgent 将记忆内容直接拼接到系统提示词,存在间接提示注入风险。社区提出分层防御方案,但 iss
🤖 想直接和 AI 对话?
免费体验 DeepSeek V4 等顶级模型,无需注册,随问随答
🎯 立即体验 AI 工具

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

🤖 嘟嘟客服
滚动至顶部
🤖 嘟嘟客服
🤖 嘟嘟客服
';i.value='';m.innerHTML+='
...
';fetch('/dify-chat',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({query:q,user:'w'+Date.now()})}).then(function(r){return r.json()}).then(function(d){var a=d.answer||'暂时无法回复';m.removeChild(m.lastChild);m.innerHTML+='
'+a+'
'}).catch(function(){m.removeChild(m.lastChild);m.innerHTML+='
网络异常
'})">发送