Claude Platform Docs
Messages技能

通过 API 使用 Agent Skills

了解如何通过 API 使用 Agent Skills 扩展 Claude 的能力。

Agent Skills 通过有组织的指令、脚本和资源文件夹来扩展 Claude 的能力。本指南向您展示如何在 Claude API 中使用预构建 Skills 和自定义 Skills。

了解如何在 10 分钟内使用 Agent Skills 通过 Claude API 创建文档。

了解如何编写 Claude 能够发现并成功使用的高效 Skills。

概述

Skills 通过 code execution tool(代码执行工具) 与 Messages API 集成。无论是使用由 Anthropic 管理的预构建 Skills,还是您上传的自定义 Skills,集成方式都完全相同:两者都需要代码执行,并使用相同的 container 结构。

使用 Skills

无论来源如何,Skills 在 Messages API 中的集成方式都相同。您在 container 参数中通过 skill_id、type 和可选的 version 指定 Skills,它们会在代码执行环境中运行。

您可以使用来自两种来源的 Skills:

方面Anthropic Skills自定义 Skills
Type 值anthropiccustom
Skill ID短名称:pptx、xlsx、docx、pdf自动生成:skill_01AbCdEfGhIjKlMnOpQrStUv
版本格式基于日期:20251013 或 latest版本 ID:skver_01AbCdEfGhIjKlMnOpQrStUv 或 latest
管理方式由 Anthropic 预构建并维护通过 Skills API 上传和管理
可用性对所有用户可用仅限您的工作区私有

两种来源的 Skills 都会由 List Skills 端点 返回(使用 source 参数进行筛选)。集成方式和执行环境完全相同。唯一的区别在于 Skills 的来源以及管理方式。

前提条件

要使用 Skills,您需要:

  1. 来自 Claude Console 的 Claude API 密钥
  2. 在请求中启用 代码执行工具

Skills 需要代码执行工具,因此请使用其模型兼容性列表中的模型。


在 Messages 中使用 Skills

Container 参数

Skills 通过 Messages API 中的 container 参数指定。每个请求最多可以包含 20 个 Skills。

Anthropic Skills 和自定义 Skills 的结构完全相同。指定必需的 type 和 skill_id,并可选择包含 version 以固定到特定版本:

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=4096,
    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 下载这些文件。

工作原理:

  1. Skills 在代码执行期间创建文件。
  2. 响应在代码执行工具结果块中为每个创建的文件包含一个 file_id(请参阅响应格式)。
  3. 使用 Files API 下载实际的文件内容。
  4. 保存到本地或按需处理。

要为 Skills 提供待处理的输入文件,请使用 Files API 上传它们,并在请求中通过 container upload 块引用它们。

示例:创建并下载 Excel 文件

client = anthropic.Anthropic()

# 步骤 1:使用 Skill 创建文件
response = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=4096,
    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.files.retrieve_metadata(file_id=file_id)
    file_content = client.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.files.retrieve_metadata(file_id=file_id)
print(f"Filename: {file_info.filename}, Size: {file_info.size_bytes} bytes")

# 列出所有文件
for file in client.files.list():
    print(f"{file.filename} - {file.created_at}")

# 删除文件
client.files.delete(file_id=file_id)

多轮对话

响应的 container 对象携带容器的 id 和 expires_at 时间戳(有关生命周期详情,请参阅容器复用)。通过指定容器 ID,可在多条消息之间复用同一容器:

client = anthropic.Anthropic()

# 首次请求创建容器
response1 = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=4096,
    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.messages.create(
    model="claude-opus-5-5",
    max_tokens=4096,
    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.messages.create(
    model="claude-opus-5-5",
    max_tokens=4096,
    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.messages.create(
        model="claude-opus-5-5",
        max_tokens=4096,
        container={
            "id": response.container.id,
            "skills": [
                {
                    "type": "custom",
                    "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
                    "version": "latest",
                }
            ],
        },
        messages=messages,
        tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
    )

使用多个 Skills

在单个请求中组合多个 Skills 以处理复杂的工作流:

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=4096,
    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"}],
)

管理自定义 Skills

创建 Skill

Skill 包是一个目录,其顶层包含一个带有 name 和 description YAML frontmatter 的 SKILL.md 文件,以及任何辅助脚本或资源。请参阅在 API 中开始使用 Agent Skills 了解如何编写一个 Skill,并参阅示例之后的要求列表了解完整约束。

上传您的自定义 Skill 以使其在您的工作区中可用。您可以上传 zip 存档或单个文件对象。Python SDK 还提供了一个接受目录路径的 files_from_dir 辅助函数,而 CLI 的 ant apply 会上传目录本身。

文件通过您附加的文件名来标识(cURL 示例中的 ;filename= 后缀以及 SDK 示例中的 filename 参数)。对于本演练中的 skill,请使用 zip -r financial_skill.zip financial_skill/ 创建一个 zip,并用它替换 zip 上传选项中的 example_skill.zip 占位符。

ant apply financial_skill
financial_skill/SKILL.md
---
name: financial-skill
description: Docs example skill.
---
financial_skill/analyze.py
print("financial analysis helper")

要求:

  • 必须在上传根目录(或单个外层文件夹的顶层)包含一个 SKILL.md 文件
  • display_name 是可选的:省略时,它从 SKILL.md 的 name 派生;显式指定的值最多可为 255 个字符,且在工作区内无需唯一
  • 上传总大小必须小于 30 MB(未压缩)
  • YAML frontmatter 要求:
    • name:最多 64 个字符,仅限小写字母/数字/连字符,不得包含 XML 标签,不得包含保留字("anthropic"、"claude")
    • description:最多 1024 个字符,非空,不得包含 XML 标签

有关完整的请求/响应模式,请参阅 Create Skill API 参考。

列出 Skills

检索您的工作区可用的所有 Skills,包括 Anthropic 预构建 Skills 和您的自定义 Skills。使用 source 参数按 skill 类型筛选:

client = anthropic.Anthropic()

# 列出所有 Skills
for skill in client.skills.list():
    print(f"{skill.id}: {skill.display_name} (source: {skill.source.type})")

# 仅列出自定义 Skills
custom_skills = client.skills.list(source="custom")

有关分页和筛选选项,请参阅 List Skills API 参考。

检索 Skill

获取特定 Skill 的详细信息:

client = anthropic.Anthropic()

skill = client.skills.retrieve(skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv")

print(f"Skill: {skill.display_name}")
print(f"Latest version: {skill.latest_version_id}")
print(f"Created: {skill.created_at}")

删除 Skill

删除 Skill 也会移除其所有版本。

client = anthropic.Anthropic()

client.skills.delete(skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv")

版本管理

Skills 支持版本管理,以便安全地管理更新:

Anthropic Skills:

  • 版本使用日期格式:20251013
  • 进行更新时发布新版本
  • 指定确切版本以保证稳定性

自定义 Skills:

  • 自动生成的版本 ID:skver_01AbCdEfGhIjKlMnOpQrStUv
  • 使用 "latest" 始终获取最新版本
  • 更新 Skill 文件时创建新版本

新版本是完整的快照,而不是增量:每次都要上传 Skill 的完整文件集。您省略的文件不会被沿用,并且新版本 SKILL.md 中的 name 必须与 Skill 的现有名称匹配。以下示例重新上传了创建 Skill 中完整的 financial_skill/ 包。

from anthropic.lib import files_from_dir

client = anthropic.Anthropic()

# 创建新版本

new_version = client.skills.versions.create(
    skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
    files=files_from_dir("financial_skill"),
)

# 使用特定版本
response = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=4096,
    container={
        "skills": [
            {
                "type": "custom",
                "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
                "version": new_version.id,
            }
        ]
    },
    messages=[{"role": "user", "content": "Use updated Skill"}],
    tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)

# 使用最新版本
response = client.messages.create(
    model="claude-opus-5-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"}],
)

有关完整详情,请参阅 Create Skill Version API 参考。


Skills 的加载方式

当您在容器中指定 Skills 时:

  1. 元数据发现: Claude 在系统提示中看到每个 Skill 的元数据(名称、描述)。
  2. 文件加载: Skill 文件被复制到容器中的 /skills/{skill-name}/。该目录是 Skill 的名称(Anthropic Skill 为 pptx,自定义 Skill 为 SKILL.md 的 name),而不是其 skill_01... ID。
  3. 自动使用: 当与您的请求相关时,Claude 会自动加载并使用 Skills。
  4. 组合: 多个 Skills 可组合在一起以处理复杂的工作流。

Claude 仅在需要时才加载完整的 Skill 指令。


用例

Skills 既适用于组织工作,也适用于个人工作。组织使用它们为文档应用品牌格式、围绕公司模板组织笔记和报告,以及运行公司特定的分析流程。个人使用它们来实现自定义文档模板、专用数据管道,以及代码生成或部署规范。

示例:财务建模

组合 Excel 和自定义 DCF 分析 Skills。首先,创建自定义 DCF 分析 Skill:

ant apply dcf_skill

然后将其与 Excel Skill 一起使用以创建财务模型。将您创建的 Skill 的 ID 作为自定义 Skill 的 skill_id 传递:

client = anthropic.Anthropic()

# 自定义 DCF 分析 Skill(ID 从 Skills API 创建响应中获取)
dcf_skill_id = "skill_01AbCdEfGhIjKlMnOpQrStUv"

# 与 Excel 配合使用以创建财务模型
response = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=4096,
    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)

限制与约束

请求限制

  • 每个请求的最大 Skills 数量: 20
  • 最大 Skill 上传大小: 30 MB(所有文件合计,未压缩)
  • YAML frontmatter 要求:
    • name:最多 64 个字符,仅限小写字母/数字/连字符,不得包含 XML 标签,不得包含保留字("anthropic"、"claude")
    • description:最多 1024 个字符,非空,不得包含 XML 标签

环境约束

Skills 在代码执行容器中运行,具有以下限制:

  • 无网络访问: 无法进行外部 API 调用
  • 无运行时包安装: 仅可使用预安装的包
  • 隔离环境: 除非您指定现有的容器 ID,否则会创建一个全新的容器

有关可用的包,请参阅代码执行工具。


最佳实践

何时使用多个 Skills

当任务涉及多种文档类型或领域时,组合使用 Skills:

良好的用例:

  • 数据分析(Excel)+ 演示文稿创建(PowerPoint)
  • 报告生成(Word)+ 导出为 PDF
  • 自定义领域逻辑 + 文档生成

应避免:

  • 包含未使用的 Skills(影响性能)

版本管理策略

本节中的 SDK 标签页展示了要包含在 Messages 请求中的 container 值。cURL 和 CLI 标签页展示了完整的请求。

对于生产环境: 固定特定版本,这样 Skill 更新永远不会改变您已部署的行为。如果您省略 version 或将其设置为 "latest",请求将使用该 Skill 的最新版本,因此工作区中任何人上传的版本都会立即改变您的生产代理所运行的内容。版本 ID 来自版本管理中的创建版本响应,或来自 List Skill Versions API。该 ID 始终是字符串,因此即使它看起来像数字,也请在 JSON 或 YAML 中为其加上引号。

# 固定到特定版本以保证稳定性
container = {
    "skills": [
        {
            "type": "custom",
            "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
            "version": "skver_01AbCdEfGhIjKlMnOpQrStUv",
        }
    ]
}

对于开发环境: 使用 latest,以便在迭代过程中自动获取最新版本。

# 开发过程中使用 latest 版本
container = {
    "skills": [
        {
            "type": "custom",
            "skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
            "version": "latest",
        }
    ]
}

提示缓存注意事项

如果您使用 prompt caching(提示缓存),更改容器中的 Skills 列表会破坏缓存。Skills 以固定顺序渲染到系统提示中,因此相同的列表会产生相同的可缓存前缀:

client = anthropic.Anthropic()

# Skills 以固定且对缓存友好的顺序渲染到系统提示中
response1 = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=4096,
    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 列表([xlsx] 与 [xlsx, pptx])会改变前缀:导致缓存未命中,而相同的列表则为缓存命中
response2 = client.messages.create(
    model="claude-opus-5-5",
    max_tokens=4096,
    container={
        "skills": [
            {"type": "anthropic", "skill_id": "xlsx", "version": "latest"},
            {
                "type": "anthropic",
                "skill_id": "pptx",
                "version": "latest",
            },  # prefix change: cache miss
        ]
    },
    messages=[{"role": "user", "content": "Create a presentation"}],
    tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)

为获得最佳缓存性能,请在各请求之间保持 Skills 列表(包括其顺序)一致。固定自定义 Skill 版本也有帮助:使用 "latest" 时,如果发布的新版本更改了 Skill 的描述,则可能使缓存的前缀失效。

错误处理

妥善处理与 Skill 相关的错误:

client = anthropic.Anthropic()

try:
    response = client.messages.create(
        model="claude-opus-5-5",
        max_tokens=4096,
        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:
        raise

从 skills-2025-10-02 迁移

Skills API 已结束 beta 阶段,不再需要 beta 标头。从 skills-2025-10-02 迁移是可选的:仍然发送该标头的请求会继续正常工作,并继续返回 beta 响应结构,因此现有集成在您更改之前会一直正常工作。移除该标头会将这些请求切换为本页所记录的结构:

使用 skills-2025-10-02不使用该标头
Skill 标签display_title(最多 64 个字符,每个工作区内唯一)display_name(最多 255 个字符,不唯一);省略时从 SKILL.md 的 name 派生
最新版本指针latest_version,一个纪元微秒字符串,例如 "1759178010641129"latest_version_id,一个版本 ID,例如 "skver_01AbCdEfGhIjKlMnOpQrStUv";GET /v1/skills/{skill_id}/versions/latest 可在一次调用中解析它
URL 中的版本标识符纪元微秒字符串版本 ID(skver_...)。在 beta 下以 skill_version_ 前缀捕获的 ID 可作为输入被接受。
版本对象包含 directory(始终等于 Skill 的 name)无 directory 字段
source字符串,"custom" 或 "anthropic"对象,例如 {"type": "custom"};示例目录的值为 "anthropic_example"
列表响应{ data, has_more, next_page }{ data, next_page };limit 从 1 到 1,000(默认 20)
版本列表顺序最旧的在前最新的在前,默认 limit 为 20。一种结构的分页游标在另一种结构上无效。
删除 Skill当存在任何版本时返回 400 错误删除 Skill 及其所有版本
删除 Skill 的唯一版本允许,留下一个没有版本的 Skill返回 400 错误;请先上传替代版本,或删除该 Skill
上传布局文件必须位于名称与 Skill name 匹配的顶层目录内SKILL.md 可以位于上传的根目录;无论哪种方式,存储路径都相同
响应类型CreateSkillResponse、GetSkillResponse,以及每个操作一个类型Skill、SkillVersion、DeletedSkill、DeletedSkillVersion

迁移步骤:

  1. 移除 beta 标头。 从您的请求中删除 anthropic-beta: skills-2025-10-02。在 SDK 中,调用 client.skills 而不是 client.beta.skills;继续使用 client.beta.skills 仅在不再发送该标头的 SDK 版本上有效。更早的版本即使没有 betas 参数,也会从 client.beta.skills 发送该标头。
  2. 重命名代码中的字段:将 display_title 改为 display_name,将 latest_version 改为 latest_version_id,并读取 source.type 而不是将 source 与字符串进行比较。
  3. 使用版本 ID。 在您存储纪元微秒版本的任何地方,改为存储版本的 id,或使用 latest。Messages 请求中的 Skill 引用接受版本 ID、latest,或(对于 Anthropic Skills)目录版本。
  4. 检查删除调用。 DELETE /v1/skills/{skill_id} 现在会连同 Skill 一起移除每个版本。如果您曾依赖 beta 的拒绝行为作为保护措施,请添加您自己的检查。

在 beta 下所有版本都已被删除的 Skill 没有可返回的当前版本:GET /v1/skills/{skill_id} 返回 400 错误,并且在您向其上传版本之前,该 Skill 会从列表响应中被省略。您仍然可以删除它。

SDK beta 命名空间

从 Python SDK 1.2.0、TypeScript SDK 0.122.0、Go SDK 1.68.0、Java SDK 2.59.0、Ruby SDK 1.67.0 和 C# SDK 12.44.0 开始,client.beta.skills 不再发送 skills-2025-10-02,并返回与 client.skills 相同的结构,类型名称带有 Beta 前缀(BetaSkill、BetaSkillVersion、BetaDeletedSkill、BetaDeletedSkillVersion)。它接受 betas 参数,用于仍处于 beta 阶段的 Skills 功能。在 beta Messages 类型中,容器 Skill 引用类型从 BetaSkill 重命名为 BetaContainerSkill(字段相同:type、skill_id、version);BetaSkill 现在用于命名 Skill 资源,与非 beta 类型中的 Skill 和 ContainerSkill 相对应。更早的 SDK 版本的类型对应 beta 结构;如果您依赖这些类型,请在迁移之前继续使用更早的版本。

数据保留

Agent Skills 不在 ZDR 安排的覆盖范围内。Skill 定义和执行数据根据 Anthropic 的标准数据保留政策进行保留。

有关所有功能的 ZDR 资格,请参阅 API 与数据保留。

审计日志

如果您的组织启用了 Compliance API,其 Activity Feed 会记录使用 Claude API 密钥或从 Claude Console 进行的 Skills 和 Skill 版本的创建与删除操作。在 Compliance API 关闭期间发生的操作不会被记录,且之后无法恢复,因此在依赖此审计跟踪之前,请先设置 Compliance API。

后续步骤

包含所有端点的完整 API 参考

了解如何编写 Claude 能够发现并成功使用的高效 Skills。

在沙盒容器中运行 Python 和 bash 代码,以分析数据、生成文件并迭代解决方案。

Was this page helpful?