From fe4098cfb8fa82c08e8f2654c8cf3c05fb2b3659 Mon Sep 17 00:00:00 2001 From: wang-qisen Date: Tue, 1 Sep 2026 11:32:35 +0800 Subject: [PATCH] refactor: clarify auto resource routing structure --- docs/en/reme_scene.md | 2 +- reme/steps/evolve/auto_image_resource.py | 5 ++--- reme/steps/evolve/auto_resource.py | 2 +- reme/steps/evolve/auto_text_resource.py | 4 +++- .../evolve/{_auto_resource.py => base_auto_resource.py} | 0 reme/steps/file_io/__init__.py | 3 +-- reme/steps/file_io/_path.py | 5 ----- tests/integration/test_auto_resource.py | 2 +- tests/unit/test_auto_image_steps.py | 4 ++-- tests/unit/test_background_steps.py | 2 +- 10 files changed, 12 insertions(+), 17 deletions(-) rename reme/steps/evolve/{_auto_resource.py => base_auto_resource.py} (100%) diff --git a/docs/en/reme_scene.md b/docs/en/reme_scene.md index d95bf2c2..15b22953 100644 --- a/docs/en/reme_scene.md +++ b/docs/en/reme_scene.md @@ -67,7 +67,7 @@ The corresponding flow is: important facts to a topic-named `daily//.md`. The note keeps `session_id` and `source_conversation` in frontmatter for stable lookup and provenance. - `resource_watch_loop` watches supported text and image changes under `resource/` and triggers `auto_resource_step` to - write a daily note with `source_resource`. Text resources use an agent, while images use a vision model. The generated + write a daily note with `source_resource`. Text resources use the agent, while images use a vision model. The generated content-based filename is sanitized and de-duplicated; it is not guaranteed to match the resource filename. - Auto Memory, Auto Resource, and Auto Dream refresh `daily/.md` after writing. diff --git a/reme/steps/evolve/auto_image_resource.py b/reme/steps/evolve/auto_image_resource.py index 65935d06..5f15fe1b 100644 --- a/reme/steps/evolve/auto_image_resource.py +++ b/reme/steps/evolve/auto_image_resource.py @@ -11,9 +11,8 @@ from agentscope.message import Base64Source, DataBlock, TextBlock, UserMsg from agentscope.model import ChatModelBase from pydantic import BaseModel, Field -from ..file_io import is_image_file from ..file_io._path import IMAGE_MIME_BY_EXT, IMAGE_SUFFIXES -from ._auto_resource import _SOURCE_RESOURCE_KEY, _sanitize_note_name, BaseAutoResourceStep +from .base_auto_resource import _SOURCE_RESOURCE_KEY, _sanitize_note_name, BaseAutoResourceStep from ...components import R from ...enumeration import ComponentEnum @@ -294,7 +293,7 @@ class AutoImageResourceStep(BaseAutoResourceStep): async def _handle_change(self, file_path: str, raw_change) -> dict: """Skip non-image changes; isolate per-change failures so the batch continues.""" - if file_path and not is_image_file(file_path): + if file_path and not self.matches_change({"path": file_path}): file_path = self.to_workspace_relative(file_path) if Path(file_path).is_absolute() else file_path self.context.response.metadata = {} answer = f"Skipped non-image resource file: {file_path}" diff --git a/reme/steps/evolve/auto_resource.py b/reme/steps/evolve/auto_resource.py index 6db314b6..b3dc1b9b 100644 --- a/reme/steps/evolve/auto_resource.py +++ b/reme/steps/evolve/auto_resource.py @@ -6,7 +6,7 @@ import inspect from ...components import R from ...enumeration import ComponentEnum from ..base_step import BaseStep -from ._auto_resource import BaseAutoResourceStep, _results_answer +from .base_auto_resource import BaseAutoResourceStep, _results_answer _ProcessorSpec = str | dict _IndexedChange = tuple[int, dict] diff --git a/reme/steps/evolve/auto_text_resource.py b/reme/steps/evolve/auto_text_resource.py index 1dcee228..2d97e1c5 100644 --- a/reme/steps/evolve/auto_text_resource.py +++ b/reme/steps/evolve/auto_text_resource.py @@ -6,7 +6,7 @@ import aiofiles from ...components import R from ._evolve import agent_reply_result_text -from ._auto_resource import BaseAutoResourceStep +from .base_auto_resource import BaseAutoResourceStep def _compute_agent_session_id(path: str) -> str: @@ -18,6 +18,8 @@ def _compute_agent_session_id(path: str) -> str: class AutoTextResourceStep(BaseAutoResourceStep): """Interpret text resource files into daily notes via an Agent.""" + # Preserve the pre-router AutoResourceStep behavior for direct calls and + # custom watcher suffixes; the default watcher still limits normal inputs. resource_fallback = True router_inherit_keys = BaseAutoResourceStep.router_inherit_keys | frozenset( {"agent_wrapper", "max_file_bytes", "prompt_dict"}, diff --git a/reme/steps/evolve/_auto_resource.py b/reme/steps/evolve/base_auto_resource.py similarity index 100% rename from reme/steps/evolve/_auto_resource.py rename to reme/steps/evolve/base_auto_resource.py diff --git a/reme/steps/file_io/__init__.py b/reme/steps/file_io/__init__.py index 2aca0e3e..7417e9ed 100644 --- a/reme/steps/file_io/__init__.py +++ b/reme/steps/file_io/__init__.py @@ -2,7 +2,7 @@ from ._daily_index import extract_daily_date, parse_daily_date, refresh_day_index, validate_session_id from ._file_io import get_path_lock, write_file_safe -from ._path import is_image_file, validate_filename_component +from ._path import validate_filename_component from .daily_list import DailyListStep from .daily_reindex import DailyReindexStep from .daily_write import DailyWriteStep @@ -26,7 +26,6 @@ __all__ = [ "parse_daily_date", "validate_session_id", "validate_filename_component", - "is_image_file", "get_path_lock", "write_file_safe", "DailyListStep", diff --git a/reme/steps/file_io/_path.py b/reme/steps/file_io/_path.py index ee5e042c..d8cad027 100644 --- a/reme/steps/file_io/_path.py +++ b/reme/steps/file_io/_path.py @@ -31,11 +31,6 @@ IMAGE_MIME_BY_EXT: dict[str, str] = { IMAGE_SUFFIXES = frozenset(IMAGE_MIME_BY_EXT) -def is_image_file(path: str | Path) -> bool: - """Return True when ``path`` carries a known image file suffix.""" - return Path(path).suffix.lower() in IMAGE_SUFFIXES - - _INVALID_CHARS = re.compile(r'[<>:"/\\|?*\x00-\x1f]') _RESERVED_NAMES = { "CON", diff --git a/tests/integration/test_auto_resource.py b/tests/integration/test_auto_resource.py index 40448dd6..dd4c3536 100644 --- a/tests/integration/test_auto_resource.py +++ b/tests/integration/test_auto_resource.py @@ -25,7 +25,7 @@ sys.path.insert(0, str(INTEGRATION_DIR)) # pylint: disable=wrong-import-position from _workspace_fixture import workspace_env # noqa: E402 -from reme.steps.evolve._auto_resource import _compute_note_stem # noqa: E402 +from reme.steps.evolve.base_auto_resource import _compute_note_stem # noqa: E402 from reme.steps.evolve.auto_text_resource import _compute_agent_session_id # noqa: E402 RESOURCE_FILENAME = "project-roadmap.md" diff --git a/tests/unit/test_auto_image_steps.py b/tests/unit/test_auto_image_steps.py index 011b59a9..45ec1270 100644 --- a/tests/unit/test_auto_image_steps.py +++ b/tests/unit/test_auto_image_steps.py @@ -33,7 +33,7 @@ from reme.components.file_store import LocalFileStore from reme.components.job import BaseJob from reme.components.runtime_context import RuntimeContext from reme.enumeration import ComponentEnum -from reme.steps.evolve._auto_resource import BaseAutoResourceStep +from reme.steps.evolve.base_auto_resource import BaseAutoResourceStep from reme.steps.evolve.auto_image_resource import ( AutoImageResourceStep, _build_image_request_payload, @@ -956,7 +956,7 @@ def test_auto_image_reports_modified_when_index_refresh_fails_after_write(): async def fail_refresh(*_args, **_kwargs): raise RuntimeError("index refresh failed") - with patch("reme.steps.evolve._auto_resource.refresh_day_index", new=fail_refresh): + with patch("reme.steps.evolve.base_auto_resource.refresh_day_index", new=fail_refresh): resp = await _run_step(step, [{"change": "added", "path": str(source)}]) result = resp.metadata["results"][0] diff --git a/tests/unit/test_background_steps.py b/tests/unit/test_background_steps.py index 4f53ff8b..33a3f93e 100644 --- a/tests/unit/test_background_steps.py +++ b/tests/unit/test_background_steps.py @@ -31,7 +31,7 @@ from reme.components.file_store import LocalFileStore from reme.components.runtime_context import RuntimeContext from reme.enumeration import ComponentEnum from reme.steps.evolve.auto_memory import AutoMemoryStep -from reme.steps.evolve._auto_resource import _compute_note_stem +from reme.steps.evolve.base_auto_resource import _compute_note_stem from reme.steps.evolve.auto_resource import AutoResourceStep from reme.steps.evolve.auto_text_resource import AutoTextResourceStep from reme.steps.file_io.daily_list import DailyListStep