Agent Skills 通过由指令、脚本和资源组成的有组织的文件夹来扩展 Claude 的能力。本指南向您展示如何在 Claude API 中使用预构建和自定义的 Skills。
有关完整的 API 参考,包括请求/响应模式和所有参数,请参阅:
关于 "zero data retention"(零数据保留),即 ZDR 如何适用于此功能,请参阅 API 与数据保留。
创建您的第一个 Skill
编写 Skills 的最佳实践
要详细了解 Agent Skills 的架构和实际应用,请阅读工程博客文章:Equipping agents for the real world with Agent Skills。
Skills 通过代码执行工具与 Messages API 集成。无论是使用由 Anthropic 管理的预构建 Skills,还是您上传的自定义 Skills,集成方式都是相同的:两者都需要代码执行,并使用相同的 container 结构。
无论来源如何,Skills 在 Messages API 中的集成方式都是相同的。您在 container 参数中通过 skill_id、type 和可选的 version 指定 Skills,它们会在代码执行环境中执行。
您可以使用来自两种来源的 Skills:
| 方面 | Anthropic Skills | 自定义 Skills |
|---|---|---|
| Type 值 | anthropic | custom |
| Skill ID | 短名称:pptx、xlsx、docx、pdf | 生成的:skill_01AbCdEfGhIjKlMnOpQrStUv |
| 版本格式 | 基于日期:20251013 或 latest | 纪元时间戳:1759178010641129 或 latest |
| 管理 | 由 Anthropic 预构建和维护 | 通过 Skills API 上传和管理 |
| 可用性 | 对所有用户可用 | 仅限您的工作区私有 |
两种 Skill 来源都由 List Skills 端点返回(使用 source 参数进行筛选)。集成方式和执行环境是相同的。唯一的区别在于 Skills 的来源以及它们的管理方式。
要使用 Skills,您需要:
code-execution-2025-08-25 - 启用代码执行(Skills 所必需)skills-2025-10-02 - 启用 Skills APIfiles-api-2025-04-14 - 用于向容器上传/从容器下载文件Skills 通过 Messages API 中的 container 参数指定。每个请求最多可以包含 8 个 Skills。
Anthropic Skills 和自定义 Skills 的结构是相同的。指定必需的 type 和 skill_id,并可选地包含 version 以固定到特定版本:
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-opus-5",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [{"type": "anthropic", "skill_id": "pptx", "version": "latest"}]
},
messages=[
{"role": "user", "content": "Create a presentation about renewable energy"}
],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)当 Skills 创建文档(Excel、PowerPoint、PDF、Word)时,它们会在响应中返回 file_id 属性。您必须使用 Files API 来下载这些文件。
工作原理:
file_id。示例:创建并下载 Excel 文件
client = anthropic.Anthropic()
# 步骤 1:使用 Skill 创建文件
response = client.beta.messages.create(
model="claude-opus-5",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [{"type": "anthropic", "skill_id": "xlsx", "version": "latest"}]
},
messages=[
{
"role": "user",
"content": "Create an Excel file with a simple budget spreadsheet",
}
],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
# 步骤 2:从响应中提取文件 ID
def extract_file_ids(response):
file_ids = []
for item in response.content:
if item.type == "bash_code_execution_tool_result":
content_item = item.content
if content_item.type == "bash_code_execution_result":
# 每个内容项都是一个携带 file_id 的 bash_code_execution_output 块
for file in content_item.content:
file_ids.append(file.file_id)
return file_ids
# 步骤 3:使用 Files API 下载文件
for file_id in extract_file_ids(response):
file_metadata = client.beta.files.retrieve_metadata(file_id=file_id)
file_content = client.beta.files.download(file_id=file_id)
# 步骤 4:保存到磁盘
file_content.write_to_file(file_metadata.filename)
print(f"Downloaded: {file_metadata.filename}")其他 Files API 操作:
client = anthropic.Anthropic()
file_id = "file_011CNha8iCJcU1wXNR6q4V8w"
# 获取文件元数据
file_info = client.beta.files.retrieve_metadata(file_id=file_id)
print(f"Filename: {file_info.filename}, Size: {file_info.size_bytes} bytes")
# 列出所有文件
for file in client.beta.files.list():
print(f"{file.filename} - {file.created_at}")
# 删除文件
client.beta.files.delete(file_id=file_id)有关 Files API 的完整详细信息,请参阅 Files API 文档。
通过指定容器 ID,在多条消息之间重用同一个容器:
client = anthropic.Anthropic()
# 第一个请求创建容器
response1 = client.beta.messages.create(
model="claude-opus-5",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [{"type": "anthropic", "skill_id": "xlsx", "version": "latest"}]
},
messages=[
{"role": "user", "content": "Create a sample sales dataset and analyze it"}
],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
# 使用同一容器继续对话
messages = [
{"role": "user", "content": "Create a sample sales dataset and analyze it"},
{
# 将助手的文本传递下去;container.id 承载执行状态
"role": "assistant",
"content": "\n".join(
block.text for block in response1.content if block.type == "text"
),
},
{"role": "user", "content": "What was the total revenue?"},
]
response2 = client.beta.messages.create(
model="claude-opus-5",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"id": response1.container.id, # Reuse container
"skills": [{"type": "anthropic", "skill_id": "xlsx", "version": "latest"}],
},
messages=messages,
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)Skills 可能会执行需要多轮的操作。请处理 pause_turn 停止原因:
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Generate and process a large sample dataset"}]
max_retries = 10
response = client.beta.messages.create(
model="claude-opus-5",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest",
}
]
},
messages=messages,
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
# 处理长时间操作的 pause_turn
for _ in range(max_retries):
if response.stop_reason != "pause_turn":
break
messages.append({"role": "assistant", "content": response.content})
response = client.beta.messages.create(
model="claude-opus-5",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"id": response.container.id,
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest",
}
],
},
messages=messages,
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)响应可能包含 pause_turn 停止原因,这表示 API 暂停了一个长时间运行的 Skill 操作。您可以在后续请求中按原样提供该响应,让 Claude 继续其回合;或者如果您想中断对话并提供额外的指导,也可以修改内容。
在单个请求中组合多个 Skills 以处理复杂的工作流:
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-opus-5",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{"type": "anthropic", "skill_id": "xlsx", "version": "latest"},
{"type": "anthropic", "skill_id": "pptx", "version": "latest"},
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest",
},
]
},
messages=[
{"role": "user", "content": "Analyze sales data and create a presentation"}
],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)Skill 包是一个目录,其顶层包含一个带有 name 和 description YAML frontmatter 的 SKILL.md 文件,以及任何支持脚本或资源。请参阅在 API 中开始使用 Agent Skills来编写一个 Skill,并参阅示例后面的要求列表以了解完整的约束条件。
上传您的自定义 Skill 以使其在您的工作区中可用。您可以上传 zip 归档文件或单个文件对象;Python SDK 还额外提供了一个接受目录路径的 files_from_dir 辅助函数。
文件通过您附加的文件名来标识。逐个文件上传时,其路径必须保持一个共同的顶层目录(cURL 示例中的 ;filename= 后缀以及 SDK 示例中的文件名参数),而 zip 归档文件必须将 skill 目录作为其唯一的顶层条目。
ant beta:skills create \
--file example_skill.zip \
--beta skills-2025-10-02
# 逐文件上传需要带路径限定的文件名,而 CLI
# 目前无法设置。请改为上传 zip 压缩包。要求:
name 匹配(不区分大小写和下划线:Financial_Skill 与 financial-skill 匹配)display_title 是可选的:省略时,它会从 SKILL.md 的 name 派生;显式指定的值在您工作区的自定义 skills 中必须是唯一的name:最多 64 个字符,仅限小写字母/数字/连字符,不含 XML 标签,不含保留字("anthropic"、"claude")description:最多 1024 个字符,非空,不含 XML 标签有关完整的请求/响应模式,请参阅 Create Skill API 参考。
检索您工作区可用的所有 Skills,包括 Anthropic 预构建的 Skills 和您的自定义 Skills。使用 source 参数按 skill 类型进行筛选:
# 列出所有技能
ant beta:skills list
# 仅列出自定义技能
ant beta:skills list --source custom有关分页和筛选选项,请参阅 List Skills API 参考。
获取特定 Skill 的详细信息:
ant beta:skills retrieve \
--skill-id skill_01AbCdEfGhIjKlMnOpQrStUv要删除一个 Skill,您必须先删除其所有版本:
# 步骤 1:列出所有版本,然后逐个删除
ant beta:skills:versions list \
--skill-id skill_01AbCdEfGhIjKlMnOpQrStUv \
--transform version --raw-output
# 对列表返回的每个版本 id 重复此操作
ant beta:skills:versions delete \
--skill-id skill_01AbCdEfGhIjKlMnOpQrStUv \
--version 1759178010641129 >/dev/null
# 步骤 2:删除该 Skill
ant beta:skills delete \
--skill-id skill_01AbCdEfGhIjKlMnOpQrStUv >/dev/null尝试删除仍存在版本的 Skill 会返回 400 错误。
Skills 支持版本控制,以便安全地管理更新:
Anthropic Skills:
20251013自定义 Skills:
1759178010641129"latest" 始终获取最新版本# 创建新版本
VERSION_NUMBER=$(ant beta:skills:versions create \
--skill-id skill_01AbCdEfGhIjKlMnOpQrStUv \
--file updated_skill.zip \
--transform version --raw-output)
# 使用特定版本
ant beta:messages create \
--beta code-execution-2025-08-25,skills-2025-10-02 <<YAML
model: claude-opus-5
max_tokens: 4096
container:
skills:
- type: custom
skill_id: skill_01AbCdEfGhIjKlMnOpQrStUv
version: $VERSION_NUMBER
messages:
- role: user
content: Use updated Skill
tools:
- type: code_execution_20250825
name: code_execution
YAML
# 使用最新版本
ant beta:messages create \
--beta code-execution-2025-08-25,skills-2025-10-02 <<'YAML'
model: claude-opus-5
max_tokens: 4096
container:
skills:
- type: custom
skill_id: skill_01AbCdEfGhIjKlMnOpQrStUv
version: latest
messages:
- role: user
content: Use latest Skill version
tools:
- type: code_execution_20250825
name: code_execution
YAML有关完整详细信息,请参阅 Create Skill Version API 参考。
当您在容器中指定 Skills 时:
/skills/{directory}/。渐进式披露架构确保了高效的上下文使用:Claude 仅在需要时才加载完整的 Skill 指令。
品牌与传播
项目管理
业务运营
内容创作
数据分析
开发与自动化
组合 Excel 和自定义 DCF 分析 Skills:
from anthropic.lib import files_from_dir
client = anthropic.Anthropic()
# 创建自定义 DCF 分析 Skill
dcf_skill = client.beta.skills.create(
files=files_from_dir("/path/to/dcf_skill"),
)
# 与 Excel 配合使用以创建财务模型
response = client.beta.messages.create(
model="claude-opus-5",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{"type": "anthropic", "skill_id": "xlsx", "version": "latest"},
{"type": "custom", "skill_id": dcf_skill.id, "version": "latest"},
]
},
messages=[
{
"role": "user",
"content": "Build a DCF valuation model for a SaaS company",
}
],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
print(response)name:最多 64 个字符,仅限小写字母/数字/连字符,不含 XML 标签,不含保留字("anthropic"、"claude")description:最多 1024 个字符,非空,不含 XML 标签Skills 在代码执行容器中运行,存在以下限制:
有关可用的包,请参阅代码执行工具。
当任务涉及多种文档类型或领域时,组合使用 Skills:
适合的使用场景:
避免:
用于生产环境:
# 固定到特定版本以保证稳定性
container = {
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "1759178010641129", # Specific version
}
]
}用于开发环境:
# 在积极开发中使用 latest
container = {
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest", # Always get newest
}
]
}使用提示缓存时,请注意更改容器中的 Skills 列表会使缓存失效:
client = anthropic.Anthropic()
# 第一个请求创建缓存
response1 = client.beta.messages.create(
model="claude-opus-5",
max_tokens=4096,
betas=[
"code-execution-2025-08-25",
"skills-2025-10-02",
],
container={
"skills": [{"type": "anthropic", "skill_id": "xlsx", "version": "latest"}]
},
messages=[{"role": "user", "content": "Analyze sales data"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
# 添加/移除 Skills 会使缓存失效
response2 = client.beta.messages.create(
model="claude-opus-5",
max_tokens=4096,
betas=[
"code-execution-2025-08-25",
"skills-2025-10-02",
],
container={
"skills": [
{"type": "anthropic", "skill_id": "xlsx", "version": "latest"},
{
"type": "anthropic",
"skill_id": "pptx",
"version": "latest",
}, # Cache miss
]
},
messages=[{"role": "user", "content": "Create a presentation"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)为了获得最佳缓存性能,请在各个请求之间保持 Skills 列表一致。
妥善处理与 Skill 相关的错误:
client = anthropic.Anthropic()
try:
response = client.beta.messages.create(
model="claude-opus-5",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest",
}
]
},
messages=[{"role": "user", "content": "Process data"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
except anthropic.BadRequestError as e:
if "skill" in str(e):
print(f"Skill error: {e}")
# 处理技能特定的错误
else:
raiseAgent Skills 不在 ZDR 协议的覆盖范围内。Skill 定义和执行数据将根据 Anthropic 的标准数据保留政策进行保留。
有关所有功能的 ZDR 适用性,请参阅 API 和数据保留。
包含所有端点的完整 API 参考
了解如何编写 Claude 能够成功发现和使用的高效 Skills
在沙盒容器中运行 Python 和 bash 代码,以分析数据、生成文件并迭代解决方案
Was this page helpful?