deerflow2/backend/tests
DanielWalnut 3b3f7d91e0 fix(memory): prevent file upload events from persisting in long-term memory (#971)
* fix(memory): prevent file upload events from persisting in long-term memory

Uploaded files are session-scoped and unavailable in future sessions.
Previously, upload interactions were recorded in memory, causing the
agent to search for non-existent files in subsequent conversations.

Changes:
- memory_middleware: skip human messages containing <uploaded_files>
  and their paired AI responses from the memory queue
- updater: post-process generated memory to strip upload mentions
  before saving to file
- prompt: instruct the memory LLM to ignore file upload events

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(memory): address Copilot review feedback on upload filtering

- memory_middleware: strip <uploaded_files> block from human messages
  instead of dropping the entire turn; only skip the turn (and paired
  AI response) when nothing remains after stripping
- updater: narrow the upload-scrubbing regex to explicit upload events
  (avoids false-positive removal of "User works with CSV files" etc.);
  also filter upload-event facts from the facts array
- prompt: move `import re` to module scope; skip upload-only human
  messages (empty after stripping) rather than appending "User: "

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix(memory): allow optional words between 'upload' and 'file' in scrub regex

The previous pattern required 'uploading file' with no intervening words,
so 'uploading a test file' was not matched and leaked into long-term memory.
Allow up to 3 modifier words between the verb and noun (e.g. 'uploading a
test file', 'uploaded the attachment').

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* test(memory): add unit tests for upload filtering in memory pipeline

Covers _filter_messages_for_memory and _strip_upload_mentions_from_memory
per Copilot review suggestion.  15 test cases verify:

- Upload-only turns (and paired AI responses) are excluded from memory queue
- User's real question is preserved when combined with an upload block
- Upload file paths are never present in filtered message content
- Intermediate tool messages are always excluded
- Multi-turn conversations: only the upload turn is dropped
- Multimodal (list-content) human messages are handled
- Upload-event sentences are removed from summaries and facts
- Legitimate file-related facts (CSV preferences, PDF exports) are preserved
- "uploading a test file" (words between verb and noun) is caught by regex

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Willem Jiang <willem.jiang@gmail.com>
2026-03-05 11:14:34 +08:00
..
conftest.py feat(subagents): make subagent timeout configurable via config.yaml (#897) 2026-02-25 08:39:29 +08:00
test_client.py feat: add reasoning_effort configuration support for Doubao/GPT-5 models (#947) 2026-03-02 20:49:41 +08:00
test_client_live.py feat(agent):Supports custom agent and chat experience with refactoring (#957) 2026-03-03 21:32:01 +08:00
test_custom_agent.py feat(agent):Supports custom agent and chat experience with refactoring (#957) 2026-03-03 21:32:01 +08:00
test_docker_sandbox_mode_detection.py feat(subagents): make subagent timeout configurable via config.yaml (#897) 2026-02-25 08:39:29 +08:00
test_lead_agent_model_resolution.py feat(agent):Supports custom agent and chat experience with refactoring (#957) 2026-03-03 21:32:01 +08:00
test_mcp_client_config.py test(backend): add core logic unit tests for task/title/mcp (#936) 2026-03-01 12:36:09 +08:00
test_mcp_oauth.py feat(mcp): add OAuth support for HTTP/SSE MCP servers (#908) 2026-03-01 22:38:58 +08:00
test_memory_upload_filtering.py fix(memory): prevent file upload events from persisting in long-term memory (#971) 2026-03-05 11:14:34 +08:00
test_provisioner_kubeconfig.py feat(subagents): make subagent timeout configurable via config.yaml (#897) 2026-02-25 08:39:29 +08:00
test_readability.py fix(backend): Fix readability extraction crash when Node parser fails (#937) 2026-03-01 22:24:02 +08:00
test_reflection_resolvers.py fix(models): handle google provider import errors and add dependency (#952) 2026-03-03 14:56:54 +08:00
test_skills_loader.py feat(skills): support recursive nested skill loading (#950) 2026-03-02 21:02:03 +08:00
test_subagent_timeout_config.py feat(subagents): make subagent timeout configurable via config.yaml (#897) 2026-02-25 08:39:29 +08:00
test_task_tool_core_logic.py test(backend): add core logic unit tests for task/title/mcp (#936) 2026-03-01 12:36:09 +08:00
test_title_generation.py feat: add AIO sandbox provider and auto title generation (#1) 2026-01-14 23:29:18 +08:00
test_title_middleware_core_logic.py test(backend): add core logic unit tests for task/title/mcp (#936) 2026-03-01 12:36:09 +08:00
test_uploads_router.py fix(uploads): persist thread uploads canonically and fail fast on upload errors (#943) 2026-03-01 15:35:30 +08:00