"""skill 渐进式加载:目录追加到系统提示,正文和附件由模型用 read_file 按需读取 加载、解析和校验都由 Deep Agents 的 SkillsMiddleware 完成,这里只有配置 """ from pathlib import Path from deepagents.backends.filesystem import FilesystemBackend from deepagents.middleware.filesystem import FilesystemMiddleware from deepagents.middleware.skills import SkillsMiddleware from langchain.agents.middleware import AgentMiddleware SKILLS_ROOT = Path(__file__).resolve().parents[2] / "skills" # 必须保留三个占位符;目录每一行的格式由库固定 SKILLS_PROMPT = """ 以下 skill 提供特定任务的做法。{skills_locations}{skills_load_warnings} {skills_list} 使用方式: 1. 任务符合某个 skill 的描述时,先用 read_file 读取它的 SKILL.md 再动手,传 limit=1000(默认只读 100 行) 2. 正文中引用的文件写的是相对路径,拼在该 skill 的目录后再读取,例如 chart-replace 正文里的 references/a.md 要读 /chart-replace/references/a.md 3. 一个请求可以用到多个 skill """ def skill_middleware(root: Path = SKILLS_ROOT) -> list[AgentMiddleware]: # virtual_mode:路径以 skills/ 为根,拦截 ..、~ 和根目录以外的路径 backend = FilesystemBackend(root_dir=root, virtual_mode=True) return [ FilesystemMiddleware( backend=backend, # 只开放读取,不提供写入、搜索和执行 tools=["read_file"], # 关闭大结果写盘,否则会往 skills/ 里写文件 tool_token_limit_before_evict=None, human_message_token_limit_before_evict=None, ), # 用元组写明来源标签,裸路径 "/" 的标签会变成 Unnamed SkillsMiddleware( backend=backend, sources=[("/", "大屏")], system_prompt=SKILLS_PROMPT ), ]