bytedance/deer-flow · error · ValueError

change_set.summaries.user must be an object

Error message

change_set.summaries.user must be an object

What it means

Error "change_set.summaries.user must be an object" thrown in bytedance/deer-flow.

Source

Thrown at backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py:781

                raise ValueError(f"Fact {fact_id!r} cannot be upserted and deleted together")
            if agent_name is None:  # guarded above
                raise ValueError("agent_name is required for fact repository changes")
            existing, fact_path = self._read_fact(path, fact_id, user_id=user_id, agent_name=agent_name)
            if existing is None:
                continue
            if delete_revisions and fact_id in delete_revisions and delete_revisions[fact_id] != existing.get("revision"):
                raise MemoryFactRevisionConflict(f"Expected fact {fact_id!r} revision {delete_revisions[fact_id]}, found {existing.get('revision')}")
            removals[fact_id] = (existing, fact_path)

        base = current_memory or create_empty_memory()
        user_section = copy.deepcopy(base.get("user", {}))
        history_section = copy.deepcopy(base.get("history", {}))
        if summaries is not None:
            if not isinstance(summaries, dict):
                raise ValueError("change_set.summaries must be an object")
            if "user" in summaries:
                if not isinstance(summaries["user"], dict):
                    raise ValueError("change_set.summaries.user must be an object")
                user_section.update(copy.deepcopy(summaries["user"]))
            if "history" in summaries:
                if not isinstance(summaries["history"], dict):
                    raise ValueError("change_set.summaries.history must be an object")
                history_section.update(copy.deepcopy(summaries["history"]))
        summaries_changed = user_section != base.get("user", {}) or history_section != base.get("history", {})
        needs_manifest_cleanup = current_memory is None or current_memory.get("version") != DOCUMENT_VERSION or "facts" in current_memory
        if not prepared and not removals and not summaries_changed and not needs_manifest_cleanup:
            memory_file = current_memory or {
                "version": DOCUMENT_VERSION,
                "revision": 0,
                "lastUpdated": base.get("lastUpdated", utc_now_iso_z()),
                "user": user_section,
                "history": history_section,
            }
            return memory_file, []

        next_revision = current_revision + 1

View on GitHub (pinned to 1dd6ba1acb)

Solutions

  1. Pass summaries.user as an object with the expected summary fields.
  2. Omit the user summary key if no user summary update is intended.

When it happens

Trigger: Thrown at backend/packages/harness/deerflow/agents/memory/backends/deermem/deermem/core/storage.py:781 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of bytedance/deer-flow@1dd6ba1acb (2026-08-14). Data as JSON: /api/errors/db2cd87038d4693a. Report an issue: GitHub.