Pre-submission checklist | 提交前检查
Bug Description | 问题描述
在处理会进入多模态文件解析链路的 /product/add 请求时,MemOS 可能在文本切分阶段出现如下错误:
[FileContentParser] Error splitting text: 'SimpleTextSplitter' object has no attribute 'protect_urls'
问题发生在 fallback 文本切分器路径中:当正常的 CharacterTextChunker / MarkdownChunker 初始化失败时,代码会退回使用 SimpleTextSplitter。但是 SimpleTextSplitter 内部调用了 self.protect_urls(text) 和 self.restore_urls(...),而这两个方法实际定义在 BaseChunker 中,SimpleTextSplitter 既没有继承 BaseChunker,也没有自己实现这两个方法。
相关代码路径:
src/memos/mem_reader/read_multi_modal/base.py
_split_text() 调用 get_text_splitter(),随后执行 splitter.chunk(text)。
src/memos/mem_reader/read_multi_modal/utils.py
- 如果
CharacterTextChunker / MarkdownChunker 初始化失败,get_text_splitter() 会返回 SimpleTextSplitter。
src/memos/chunkers/simple_chunker.py
SimpleTextSplitter._simple_split_text() 调用了 self.protect_urls(text) 和 self.restore_urls(...)。
src/memos/chunkers/base.py
protect_urls() 和 restore_urls() 定义在 BaseChunker 中。
因此,一旦 fallback 路径被真正触发,当前实现就会因为缺少方法而无法正常工作。
How to Reproduce | 如何重现
是在运行环境中让 langchain_text_splitters 不可用,或者让 CharacterTextChunker / MarkdownChunker 初始化失败,从而触发文件解析链路中的 SimpleTextSplitter fallback。
最小复现代码:
from memos.chunkers.simple_chunker import SimpleTextSplitter
splitter = SimpleTextSplitter(chunk_size=512, chunk_overlap=128)
splitter.chunk("This is a test document with a URL: https://example.com/path/to/resource")
期望结果:
文本可以被正常切分,并且 URL 不会被错误切断。
实际结果:
AttributeError: 'SimpleTextSplitter' object has no attribute 'protect_urls'
Environment | 环境信息
该问题是在 MemOS 从 ECS 迁移到 ACK 后观察到的。
- 部署目标:ACK
- API 路径:
/product/add
- 解析链路:
memos.mem_reader.read_multi_modal
- ACK 日志中观察到的出现次数:约 5,813 次
- 观察时间范围:
2026-07-12 15:09:14 到 2026-07-14 15:14:50
- ECS 对比:ECS 日志中未观察到该错误
该错误分布在多个 ACK Pod IP 上,因此更像是镜像、依赖或运行时代码版本一致性问题,而不是单个请求或单台机器异常。
示例日志:
2026-07-14 14:06:27,820 | ... | path=/product/add | env=prod | user_type=normal | user_name=*** | memos.mem_reader.read_multi_modal.base - ERROR - base.py:275 - _split_text - [FileContentParser] Error splitting text: 'SimpleTextSplitter' object has no attribute 'protect_urls'
Additional Context | 其他信息
No response
Willingness to Implement | 实现意愿
Pre-submission checklist | 提交前检查
Bug Description | 问题描述
在处理会进入多模态文件解析链路的
/product/add请求时,MemOS 可能在文本切分阶段出现如下错误:问题发生在 fallback 文本切分器路径中:当正常的
CharacterTextChunker/MarkdownChunker初始化失败时,代码会退回使用SimpleTextSplitter。但是SimpleTextSplitter内部调用了self.protect_urls(text)和self.restore_urls(...),而这两个方法实际定义在BaseChunker中,SimpleTextSplitter既没有继承BaseChunker,也没有自己实现这两个方法。相关代码路径:
src/memos/mem_reader/read_multi_modal/base.py_split_text()调用get_text_splitter(),随后执行splitter.chunk(text)。src/memos/mem_reader/read_multi_modal/utils.pyCharacterTextChunker/MarkdownChunker初始化失败,get_text_splitter()会返回SimpleTextSplitter。src/memos/chunkers/simple_chunker.pySimpleTextSplitter._simple_split_text()调用了self.protect_urls(text)和self.restore_urls(...)。src/memos/chunkers/base.pyprotect_urls()和restore_urls()定义在BaseChunker中。因此,一旦 fallback 路径被真正触发,当前实现就会因为缺少方法而无法正常工作。
How to Reproduce | 如何重现
是在运行环境中让
langchain_text_splitters不可用,或者让CharacterTextChunker/MarkdownChunker初始化失败,从而触发文件解析链路中的SimpleTextSplitterfallback。最小复现代码:
期望结果:
文本可以被正常切分,并且 URL 不会被错误切断。
实际结果:
Environment | 环境信息
该问题是在 MemOS 从 ECS 迁移到 ACK 后观察到的。
/product/addmemos.mem_reader.read_multi_modal2026-07-12 15:09:14到2026-07-14 15:14:50该错误分布在多个 ACK Pod IP 上,因此更像是镜像、依赖或运行时代码版本一致性问题,而不是单个请求或单台机器异常。
示例日志:
Additional Context | 其他信息
No response
Willingness to Implement | 实现意愿