技能是可重用的代理能力,提供专门的工作流程和领域知识。
您可以使用 Agent Skills 为您的 Deep Agent 提供新能力和专业知识。有关可提高代理在 LangChain 生态系统任务上表现的即用型技能,请参阅 LangChain Skills 仓库。
Deep Agent 技能遵循 Agent Skills 规范。
什么是技能
技能是一个文件夹目录,其中每个文件夹包含一个或多个代理可以使用的上下文文件:
- 一个包含技能说明和元数据的
SKILL.md 文件
- 附加脚本(可选)
- 附加参考信息,如文档(可选)
- 附加资源,如模板和其他资源(可选)
任何附加资源(脚本、文档、模板或其他资源)必须在 SKILL.md 文件中引用,并提供文件内容和用法说明,以便代理决定何时使用它们。
技能如何工作
创建 Deep Agent 时,您可以传入包含技能的目录列表。当代理启动时,它会读取每个 SKILL.md 文件的 frontmatter。
当代理收到提示时,它会检查在完成提示时是否可以使用任何技能。如果找到匹配的提示,它会查看其余的技能文件。这种只在需要时才查看技能信息的模式称为渐进式披露。
您的技能文件夹可能包含一个技能,用于以特定方式使用文档网站,以及另一个技能来搜索 arXiv 预印本存储库中的研究论文:
skills/
├── langgraph-docs
│ └── SKILL.md
└── arxiv_search
├── SKILL.md
└── arxiv_search.py # 搜索 arXiv 的代码
SKILL.md 文件始终遵循相同的模式,以 frontmatter 中的元数据开头,后跟技能的说明。
以下示例展示了一个技能,说明在收到相关提示时如何提供相关的 langgraph 文档:
---
name: langgraph-docs
description: 对于与 LangGraph 相关的请求使用此技能,以获取相关文档来提供准确、最新的指导。
---
# langgraph-docs
## 概述
本技能说明如何访问 LangGraph Python 文档以帮助回答问题和指导实施。
## 说明
### 1. 获取文档索引
使用 fetch_url 工具读取以下 URL:
https://docs.langchain.com/llms.txt
这提供了所有可用文档的结构化列表及其描述。
### 2. 选择相关文档
根据问题,从索引中确定 2-4 个最相关的文档 URL。优先选择:
- 实施问题的具体操作指南
- 理解问题的核心概念页面
- 端到端示例的教程
- API 详细信息的参考文档
### 3. 获取选定的文档
使用 fetch_url 工具读取选定的文档 URL。
### 4. 提供准确的指导
阅读文档后,完成用户的请求。
更多示例技能,请参阅 Deep Agent 示例技能。
重要有关创作技能文件时的约束和最佳实践,请参阅完整的 Agent Skills 规范。特别注意:
description 字段如果超过 1024 个字符将被截断。
- 在 Deep Agents 中,
SKILL.md 文件必须小于 10 MB。超过此限制的文件将在技能加载时被跳过。
完整示例
以下示例展示了一个使用所有可用 frontmatter 字段的 SKILL.md 文件:
---
name: langgraph-docs
description: 对于与 LangGraph 相关的请求使用此技能,以获取相关文档来提供准确、最新的指导。
license: MIT
compatibility: 需要互联网访问以获取文档 URL
metadata:
author: langchain
version: "1.0"
allowed-tools: fetch_url
---
# langgraph-docs
## 概述
本技能说明如何访问 LangGraph Python 文档以帮助回答问题和指导实施。
## 说明
### 1. 获取文档索引
使用 fetch_url 工具读取以下 URL:
https://docs.langchain.com/llms.txt
这提供了所有可用文档的结构化列表及其描述。
### 2. 选择相关文档
根据问题,从索引中确定 2-4 个最相关的文档 URL。优先选择:
- 实施问题的具体操作指南
- 理解问题的核心概念页面
- 端到端示例的教程
- API 详细信息的参考文档
### 3. 获取选定的文档
使用 fetch_url 工具读取选定的文档 URL。
### 4. 提供准确的指导
阅读文档后,完成用户的请求。
使用方法
创建 Deep Agent 时传入技能目录:
StateBackend
StoreBackend
FilesystemBackend
from urllib.request import urlopen
from deepagents import create_deep_agent
from deepagents.backends.utils import create_file_data
from langgraph.checkpoint.memory import MemorySaver
checkpointer = MemorySaver()
skill_url = "https://raw.githubusercontent.com/langchain-ai/deepagents/refs/heads/main/libs/cli/examples/skills/langgraph-docs/SKILL.md"
with urlopen(skill_url) as response:
skill_content = response.read().decode('utf-8')
skills_files = {
"/skills/langgraph-docs/SKILL.md": create_file_data(skill_content)
}
agent = create_deep_agent(
skills=["/skills/"],
checkpointer=checkpointer,
)
result = agent.invoke(
{
"messages": [
{
"role": "user",
"content": "What is langgraph?",
}
],
# Seed the default StateBackend's in-state filesystem (virtual paths must start with "/").
"files": skills_files
},
config={"configurable": {"thread_id": "12345"}},
)
from urllib.request import urlopen
from deepagents import create_deep_agent
from deepagents.backends import StoreBackend
from deepagents.backends.utils import create_file_data
from langgraph.store.memory import InMemoryStore
store = InMemoryStore()
skill_url = "https://raw.githubusercontent.com/langchain-ai/deepagents/refs/heads/main/libs/cli/examples/skills/langgraph-docs/SKILL.md"
with urlopen(skill_url) as response:
skill_content = response.read().decode('utf-8')
store.put(
namespace=("filesystem",),
key="/skills/langgraph-docs/SKILL.md",
value=create_file_data(skill_content)
)
agent = create_deep_agent(
backend=StoreBackend(),
store=store,
skills=["/skills/"]
)
result = agent.invoke(
{
"messages": [
{
"role": "user",
"content": "What is langgraph?",
}
]
},
config={"configurable": {"thread_id": "12345"}},
)
from deepagents import create_deep_agent
from langgraph.checkpoint.memory import MemorySaver
from deepagents.backends.filesystem import FilesystemBackend
# Checkpointer is REQUIRED for human-in-the-loop
checkpointer = MemorySaver()
agent = create_deep_agent(
backend=FilesystemBackend(root_dir="/Users/user/{project}"),
skills=["/Users/user/{project}/skills/"],
interrupt_on={
"write_file": True, # Default: approve, edit, reject
"read_file": False, # No interrupts needed
"edit_file": True # Default: approve, edit, reject
},
checkpointer=checkpointer, # Required!
)
result = agent.invoke(
{
"messages": [
{
"role": "user",
"content": "What is langgraph?",
}
]
},
config={"configurable": {"thread_id": "12345"}},
)
技能源路径列表。路径必须使用正斜杠指定,相对于后端的根目录。
- 如果省略,则不加载任何技能。
- 使用
StateBackend(默认)时,使用 invoke(files={...}) 提供技能文件。使用 deepagents.backends.utils 中的 create_file_data() 格式化文件内容;不支持原始字符串。
- 使用
FilesystemBackend 时,技能从后端的 root_dir 相对路径加载。
具有相同名称的技能,后面的源覆盖前面的源(后者胜出)。
SDK 只加载您在 skills 中传入的源。它不会自动扫描 CLI 目录,如 ~/.deepagents/... 或 ~/.agents/...。有关 CLI 存储约定的信息,请参阅应用数据。
如果您想在 SDK 代码中获得 CLI 风格的层级,请按从低到高的优先级顺序显式传入所有所需的源:[
"<user-home>/.deepagents/{agent}/skills/",
"<user-home>/.agents/skills/",
"<project-root>/.deepagents/skills/",
"<project-root>/.agents/skills/",
]
然后在创建代理时将该有序列表作为 skills 传入。
源优先级
当多个技能源包含同名技能时,来自 skills 数组中后面列出的源的技能优先(后者胜出)。这允许您从不同来源分层技能。
# 如果两个源都包含名为 "web-search" 的技能,
# 则 "/skills/project/" 中的那个获胜(最后加载)。
agent = create_deep_agent(
skills=["/skills/user/", "/skills/project/"],
...
)
子代理的技能
当您使用子代理时,可以配置每种类型可以访问哪些技能:
- 通用子代理:当您将
skills 传递给 create_deep_agent 时,自动从主代理继承技能。无需额外配置。
- 自定义子代理:不从主代理继承技能。为每个子代理定义添加
skills 参数,包含该子代理的技能源路径。
技能状态完全隔离:主代理的技能对子代理不可见,子代理的技能对主代理也不可见。
from deepagents import create_deep_agent
research_subagent = {
"name": "researcher",
"description": "具有专门技能的研究助手",
"system_prompt": "您是一位研究员。",
"tools": [web_search],
"skills": ["/skills/research/", "/skills/web-search/"], # 子代理特定的技能
}
agent = create_deep_agent(
model="claude-sonnet-4-6",
skills=["/skills/main/"], # 主代理和通用子代理获得这些
subagents=[research_subagent], # 研究员只获得自己的技能
)
有关子代理配置和技能继承的更多信息,请参阅子代理。
代理看到的内容
配置技能后,“技能系统”部分会被注入到代理的系统提示中。代理使用此信息遵循三步流程:
- 匹配——当用户提示到来时,代理检查是否有任何技能的描述与任务匹配。
- 读取——如果技能适用,代理使用其技能列表中显示的路径读取完整的
SKILL.md 文件。
- 执行——代理按照技能的说明进行操作,并根据需要访问任何支持文件(脚本、模板、参考文档)。
在您的 SKILL.md frontmatter 中编写清晰、具体的描述。代理仅根据描述决定是否使用技能——详细的描述会带来更好的技能匹配。
技能与记忆
技能和记忆(AGENTS.md 文件)有不同的用途:
| 技能 | 记忆 |
|---|
| 用途 | 通过渐进式披露按需发现的能力 | 启动时始终加载的持久化上下文 |
| 加载 | 仅在代理确定相关性时读取 | 始终注入系统提示 |
| 格式 | 命名目录中的 SKILL.md | AGENTS.md 文件 |
| 分层 | 用户 → 项目(后者胜出) | 用户 → 项目(合并) |
| 使用时机 | 指令是特定于任务的,可能很大 | 上下文始终相关(项目约定、偏好) |
何时使用技能和工具
以下是使用工具和技能的一些通用准则:
- 当有大量上下文要减少系统提示中的令牌数量时使用技能。
- 使用技能将能力捆绑到更大的操作中,并提供超出单个工具描述的附加上下文。
- 如果代理没有访问文件系统的权限,则使用工具。