refactor: 优化文件系统后端结构

This commit is contained in:
Wenjie Zhang 2026-03-02 00:04:16 +08:00
parent 1a1f86209f
commit 69281f6fe1
4 changed files with 36 additions and 27 deletions

View File

@ -4,7 +4,6 @@ from fastapi import FastAPI
from src.services.task_service import tasker from src.services.task_service import tasker
from src.services.mcp_service import init_mcp_servers from src.services.mcp_service import init_mcp_servers
from src.services.skill_service import init_skills_cache
from src.services.run_queue_service import close_queue_clients, get_redis_client from src.services.run_queue_service import close_queue_clients, get_redis_client
from src.storage.postgres.manager import pg_manager from src.storage.postgres.manager import pg_manager
from src.knowledge import knowledge_base from src.knowledge import knowledge_base

View File

@ -1,6 +1,11 @@
from .skills_backend import SelectedSkillsReadonlyBackend, create_agent_composite_backend from deepagents.backends import CompositeBackend, StateBackend
from .composite import create_agent_composite_backend
from .skills_backend import SelectedSkillsReadonlyBackend
__all__ = [ __all__ = [
"CompositeBackend",
"StateBackend",
"SelectedSkillsReadonlyBackend", "SelectedSkillsReadonlyBackend",
"create_agent_composite_backend", "create_agent_composite_backend",
] ]

View File

@ -0,0 +1,29 @@
from deepagents.backends import CompositeBackend, StateBackend
from src.services.skill_resolver import normalize_selected_skills
from src.services.skill_service import is_valid_skill_slug
from .skills_backend import SelectedSkillsReadonlyBackend
def _get_visible_skills_from_runtime(runtime) -> list[str]:
context = getattr(runtime, "context", None)
snapshot = getattr(context, "skill_session_snapshot", None)
if isinstance(snapshot, dict):
visible = snapshot.get("visible_skills")
if isinstance(visible, list):
return [slug for slug in visible if isinstance(slug, str) and is_valid_skill_slug(slug)]
selected = getattr(context, "skills", None) or []
return normalize_selected_skills(selected)
def create_agent_composite_backend(runtime) -> CompositeBackend:
"""为 agent 构建 backend默认 StateBackend + /skills 路由只读 backend。"""
visible_skills = _get_visible_skills_from_runtime(runtime)
return CompositeBackend(
default=StateBackend(runtime),
routes={
"/skills/": SelectedSkillsReadonlyBackend(selected_slugs=visible_skills),
},
)

View File

@ -3,10 +3,9 @@ from __future__ import annotations
from pathlib import PurePosixPath from pathlib import PurePosixPath
from typing import Any from typing import Any
from deepagents.backends import CompositeBackend, FilesystemBackend, StateBackend from deepagents.backends import FilesystemBackend
from deepagents.backends.protocol import EditResult, FileDownloadResponse, FileUploadResponse, WriteResult from deepagents.backends.protocol import EditResult, FileDownloadResponse, FileUploadResponse, WriteResult
from src.services.skill_resolver import normalize_selected_skills
from src.services.skill_service import get_skills_root_dir, is_valid_skill_slug from src.services.skill_service import get_skills_root_dir, is_valid_skill_slug
@ -118,26 +117,3 @@ class SelectedSkillsReadonlyBackend(FilesystemBackend):
continue continue
responses.append(FileDownloadResponse(path=path, content=target.read_bytes(), error=None)) responses.append(FileDownloadResponse(path=path, content=target.read_bytes(), error=None))
return responses return responses
def create_agent_composite_backend(runtime) -> CompositeBackend:
"""为 agent 构建 backend默认 StateBackend + /skills 路由只读 backend。"""
visible_skills = _get_visible_skills_from_runtime(runtime)
return CompositeBackend(
default=StateBackend(runtime),
routes={
"/skills/": SelectedSkillsReadonlyBackend(selected_slugs=visible_skills),
},
)
def _get_visible_skills_from_runtime(runtime) -> list[str]:
context = getattr(runtime, "context", None)
snapshot = getattr(context, "skill_session_snapshot", None)
if isinstance(snapshot, dict):
visible = snapshot.get("visible_skills")
if isinstance(visible, list):
return [slug for slug in visible if isinstance(slug, str) and is_valid_skill_slug(slug)]
selected = getattr(context, "skills", None) or []
return normalize_selected_skills(selected)