在 API 中使用 Agent Skills
学习如何使用 Agent Skills 通过 API 扩展 Claude 的功能。
Agent Skills 通过组织有序的指令、脚本和资源文件夹来扩展 Claude 的功能。本指南展示如何在 Claude API 中使用预构建的和自定义的 Skills。
有关完整的 API 参考(包括请求/响应模式和所有参数),请参阅:
- Skill 管理 API 参考 - Skill 的 CRUD 操作
- Skill 版本 API 参考 - 版本管理
此功能不符合零数据保留(ZDR)的条件。数据根据该功能的标准保留策略进行保留。
快速链接
概述
要深入了解 Agent Skills 的架构和实际应用,请阅读工程博客文章:为真实世界装备智能体:Agent Skills。
Skills 通过代码执行工具与 Messages API 集成。无论使用 Anthropic 管理的预构建 Skills 还是您上传的自定义 Skills,集成方式都相同:两者都需要代码执行并使用相同的 container 结构。
使用 Skills
无论来源如何,Skills 在 Messages API 中的集成方式完全相同。您在 container 参数中使用 skill_id、type 和可选的 version 来指定 Skills,它们在代码执行环境中运行。
您可以从两个来源使用 Skills:
| 方面 | Anthropic Skills | 自定义 Skills |
|---|---|---|
| 类型值 | anthropic | custom |
| Skill ID | 短名称:pptx、xlsx、docx、pdf | 生成的:skill_01AbCdEfGhIjKlMnOpQrStUv |
| 版本格式 | 基于日期:20251013 或 latest | 纪元时间戳:1759178010641129 或 latest |
| 管理 | 由 Anthropic 预构建和维护 | 通过 Skills API 上传和管理 |
| 可用性 | 对所有用户可用 | 对您的工作区私有 |
两种 Skill 来源都由列出 Skills 端点返回(使用 source 参数进行过滤)。集成方式和执行环境完全相同。唯一的区别是 Skills 的来源和管理方式。
前提条件
要使用 Skills,您需要:
- 来自控制台的 Claude API 密钥
- Beta 头:
code-execution-2025-08-25- 启用代码执行(Skills 必需)skills-2025-10-02- 启用 Skills APIfiles-api-2025-04-14- 用于向/从容器上传/下载文件
- 在请求中启用 代码执行工具
在消息中使用 Skills
容器参数
Skills 通过 Messages API 中的 container 参数指定。每个请求最多可以包含 8 个 Skills。
Anthropic 和自定义 Skills 的结构完全相同。指定必需的 type 和 skill_id,并可选择包含 version 以固定到特定版本:
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: code-execution-2025-08-25,skills-2025-10-02" \
-H "content-type: application/json" \
-d '{
"model": "claude-opus-4-7",
"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"
}]
}'
ant beta:messages create \
--beta code-execution-2025-08-25 \
--beta skills-2025-10-02 <<'YAML'
model: claude-opus-4-7
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
YAML
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-opus-4-7",
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"}],
)
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const response = await client.beta.messages.create({
model: "claude-opus-4-7",
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"
}
]
});
using System;
using System.Threading.Tasks;
using Anthropic;
using Anthropic.Models.Beta.Messages;
public class Program
{
public static async Task Main(string[] args)
{
AnthropicClient client = new();
var parameters = new MessageCreateParams
{
Model = Model.ClaudeOpus4_7,
MaxTokens = 4096,
Betas = new[] { "code-execution-2025-08-25", "skills-2025-10-02" },
Container = new BetaContainerParams
{
Skills = new[]
{
new BetaAnthropicSkillParams
{
Type = "anthropic",
SkillId = "pptx",
Version = "latest"
}
}
},
Messages = new[]
{
new BetaMessageParam
{
Role = Role.User,
Content = "Create a presentation about renewable energy"
}
},
Tools = new[]
{
new BetaCodeExecutionToolParams
{
Type = "code_execution_20250825",
Name = "code_execution"
}
}
};
var message = await client.Beta.Messages.Create(parameters);
Console.WriteLine(message);
}
}
package main
import (
"context"
"fmt"
"log"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{
"code-execution-2025-08-25",
anthropic.AnthropicBetaSkills2025_10_02,
},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfContainers: &anthropic.BetaContainerParams{
Skills: []anthropic.BetaSkillParams{
{
Type: anthropic.BetaSkillParamsTypeAnthropic,
SkillID: "pptx",
Version: anthropic.String("latest"),
},
},
},
},
Messages: []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Create a presentation about renewable energy")),
},
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response)
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.messages.MessageCreateParams;
import com.anthropic.models.beta.messages.BetaMessage;
import com.anthropic.models.beta.messages.BetaContainerParams;
import com.anthropic.models.beta.messages.BetaSkillParams;
import com.anthropic.models.beta.messages.BetaCodeExecutionTool20250825;
public class Main {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
MessageCreateParams params = MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.container(BetaContainerParams.builder()
.addSkill(BetaSkillParams.builder()
.type(BetaSkillParams.Type.ANTHROPIC)
.skillId("pptx")
.version("latest")
.build())
.build())
.addUserMessage("Create a presentation about renewable energy")
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build();
BetaMessage response = client.beta().messages().create(params);
System.out.println(response);
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
$message = $client->beta->messages->create(
maxTokens: 4096,
messages: [
['role' => 'user', 'content' => 'Create a presentation about renewable energy']
],
model: 'claude-opus-4-7',
betas: ['code-execution-2025-08-25', 'skills-2025-10-02'],
container: [
'skills' => [
[
'type' => 'anthropic',
'skill_id' => 'pptx',
'version' => 'latest'
]
]
],
tools: [
['type' => 'code_execution_20250825', 'name' => 'code_execution']
]
);
echo $message;
require "anthropic"
client = Anthropic::Client.new
message = client.beta.messages.create(
model: "claude-opus-4-7",
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" }
]
)
puts message
下载生成的文件
当 Skills 创建文档(Excel、PowerPoint、PDF、Word)时,它们在响应中返回 file_id 属性。您必须使用 Files API 来下载这些文件。
工作原理:
- Skills 在代码执行期间创建文件
- 响应包含每个创建文件的
file_id - 使用 Files API 下载实际的文件内容
- 根据需要保存到本地或进行处理
示例:创建并下载 Excel 文件
cd "$(mktemp -d)"
# 步骤 1:使用 Skill 创建文件
RESPONSE=$(curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: code-execution-2025-08-25,skills-2025-10-02" \
-H "content-type: application/json" \
-d '{
"model": "claude-opus-4-7",
"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:从响应中提取 file_id(使用 jq)
FILE_ID=$(echo "$RESPONSE" | jq -r '.content[] | select(.type=="bash_code_execution_tool_result") | .content | select(.type=="bash_code_execution_result") | .content[] | select(.file_id) | .file_id')
# 步骤 3:从元数据获取文件名
FILENAME=$(curl "https://api.anthropic.com/v1/files/$FILE_ID" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: files-api-2025-04-14" | jq -r '.filename')
# 步骤 4:使用 Files API 下载文件
curl "https://api.anthropic.com/v1/files/$FILE_ID/content" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: files-api-2025-04-14" \
--output "$FILENAME"
echo "已下载: $FILENAME"
cd "$(mktemp -d)"
# 步骤 1:使用 xlsx Skill 创建文件
# 步骤 2:使用 --transform(GJSON 路径)从响应中提取 file_id
FILE_ID=$(ant beta:messages create \
--beta code-execution-2025-08-25 \
--beta skills-2025-10-02 \
--transform 'content.#.content.content.#.file_id|@flatten|0' \
--raw-output <<'YAML'
model: claude-opus-4-7
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
YAML
)
# 步骤 3:从文件元数据获取文件名
FILENAME=$(ant beta:files retrieve-metadata \
--file-id "$FILE_ID" \
--transform filename --raw-output)
# 步骤 4:使用 Files API 下载文件
ant beta:files download \
--file-id "$FILE_ID" \
--output "$FILENAME" > /dev/null
printf 'Downloaded: %s\n' "$FILENAME"
import anthropic
client = anthropic.Anthropic()
# 步骤 1:使用 Skill 创建文件
response = client.beta.messages.create(
model="claude-opus-4-7",
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":
# 具体类型列表:List[BashCodeExecutionOutputBlock]
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"已下载: {file_metadata.filename}")
import Anthropic from "@anthropic-ai/sdk";
import fs from "node:fs/promises";
const client = new Anthropic();
// 步骤 1:使用 Skill 创建文件
const response = await client.beta.messages.create({
model: "claude-opus-4-7",
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
function extractFileIds(response: any): string[] {
const fileIds: string[] = [];
for (const item of response.content) {
if (item.type === "bash_code_execution_tool_result") {
const contentItem = item.content;
if (contentItem.type === "bash_code_execution_result") {
for (const file of contentItem.content) {
if ("file_id" in file) {
fileIds.push(file.file_id);
}
}
}
}
}
return fileIds;
}
// 步骤 3:使用 Files API 下载文件
for (const fileId of extractFileIds(response)) {
const fileMetadata = await client.beta.files.retrieveMetadata(fileId);
const fileContent = await client.beta.files.download(fileId);
// 步骤 4:保存到磁盘
await fs.writeFile(fileMetadata.filename, Buffer.from(await fileContent.arrayBuffer()));
console.log(`Downloaded: ${fileMetadata.filename}`);
}
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Collections.Generic;
using Anthropic;
using Anthropic.Models.Beta.Messages;
using Anthropic.Models.Beta.Files;
class Program
{
static async Task Main(string[] args)
{
AnthropicClient client = new();
// 步骤 1:使用 Skill 创建文件
var parameters = new MessageCreateParams
{
Model = "claude-opus-4-7",
MaxTokens = 4096,
Betas = new[] { "code-execution-2025-08-25", "skills-2025-10-02" },
Container = new BetaContainer
{
Skills = new[]
{
new BetaSkill
{
Type = "anthropic",
SkillId = "xlsx",
Version = "latest"
}
}
},
Messages = new[]
{
new BetaMessage
{
Role = Role.User,
Content = "Create an Excel file with a simple budget spreadsheet"
}
},
Tools = new[]
{
new BetaTool
{
Type = "code_execution_20250825",
Name = "code_execution"
}
}
};
var response = await client.Beta.Messages.Create(parameters);
// 步骤 2:从响应中提取文件 ID
var fileIds = ExtractFileIds(response);
// 步骤 3:使用 Files API 下载文件
foreach (var fileId in fileIds)
{
var fileMetadata = await client.Beta.Files.RetrieveMetadata(fileId);
var fileContent = await client.Beta.Files.Download(fileId);
// 步骤 4:保存到磁盘
await File.WriteAllBytesAsync(fileMetadata.Filename, fileContent);
Console.WriteLine({{CONTENT}}quot;Downloaded: {fileMetadata.Filename}");
}
}
static List<string> ExtractFileIds(BetaMessage response)
{
var fileIds = new List<string>();
foreach (var item in response.Content)
{
if (item is BetaBashCodeExecutionToolResult toolResult)
{
if (toolResult.Content is BetaBashCodeExecutionResult result)
{
foreach (var content in result.Content)
{
if (content is BetaBashCodeExecutionResultFile file)
{
fileIds.Add(file.FileId);
}
}
}
}
}
return fileIds;
}
}
package main
import (
"context"
"fmt"
"io"
"log"
"os"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
// 步骤 1:使用 Skill 创建文件
response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{"code-execution-2025-08-25", anthropic.AnthropicBetaSkills2025_10_02},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfContainers: &anthropic.BetaContainerParams{
Skills: []anthropic.BetaSkillParams{
{
Type: anthropic.BetaSkillParamsTypeAnthropic,
SkillID: "xlsx",
Version: anthropic.String("latest"),
},
},
},
},
Messages: []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Create an Excel file with a simple budget spreadsheet")),
},
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
log.Fatal(err)
}
// 步骤 2:从响应中提取文件 ID
fileIDs := extractFileIDs(response)
// 步骤 3:使用 Files API 下载文件
for _, fileID := range fileIDs {
fileMetadata, err := client.Beta.Files.GetMetadata(context.TODO(), fileID, anthropic.BetaFileGetMetadataParams{})
if err != nil {
log.Fatal(err)
}
fileContent, err := client.Beta.Files.Download(context.TODO(), fileID, anthropic.BetaFileDownloadParams{})
if err != nil {
log.Fatal(err)
}
// 步骤 4:保存到磁盘
out, err := os.Create(fileMetadata.Filename)
if err != nil {
log.Fatal(err)
}
io.Copy(out, fileContent.Body)
out.Close()
fileContent.Body.Close()
fmt.Printf("Downloaded: %s\n", fileMetadata.Filename)
}
}
func extractFileIDs(response *anthropic.BetaMessage) []string {
var fileIDs []string
for _, item := range response.Content {
switch v := item.AsAny().(type) {
case anthropic.BetaBashCodeExecutionToolResultBlock:
for _, output := range v.Content.Content {
if output.FileID != "" {
fileIDs = append(fileIDs, output.FileID)
}
}
}
}
return fileIDs
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.messages.MessageCreateParams;
import com.anthropic.models.beta.messages.BetaMessage;
import com.anthropic.models.beta.messages.BetaContainerParams;
import com.anthropic.models.beta.messages.BetaSkillParams;
import com.anthropic.models.beta.messages.BetaCodeExecutionTool20250825;
import com.anthropic.models.beta.messages.BetaContentBlock;
import com.anthropic.models.beta.files.FileMetadata;
import com.anthropic.core.http.HttpResponse;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class SkillsFileDownload {
public static void main(String[] args) throws Exception {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
// 步骤 1:使用 Skill 创建文件
MessageCreateParams params = MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.container(BetaContainerParams.builder()
.addSkill(BetaSkillParams.builder()
.type(BetaSkillParams.Type.ANTHROPIC)
.skillId("xlsx")
.version("latest")
.build())
.build())
.addUserMessage("Create an Excel file with a simple budget spreadsheet")
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build();
BetaMessage response = client.beta().messages().create(params);
// 步骤 2:从响应中提取文件 ID
List<String> fileIds = new ArrayList<>();
for (BetaContentBlock block : response.content()) {
if (block.isCodeExecutionToolResult()) {
var toolResult = block.asCodeExecutionToolResult();
for (var content : toolResult.content()) {
content.file().ifPresent(file -> fileIds.add(file.fileId()));
}
}
}
// 步骤 3:使用 Files API 下载文件
for (String fileId : fileIds) {
FileMetadata fileMetadata = client.beta().files().retrieveMetadata(fileId);
HttpResponse fileContent = client.beta().files().download(fileId);
// 步骤 4:保存到磁盘
try (InputStream is = fileContent.body();
FileOutputStream fos = new FileOutputStream(fileMetadata.filename())) {
is.transferTo(fos);
}
System.out.println("Downloaded: " + fileMetadata.filename());
}
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
// 步骤 1:使用 Skill 创建文件
$response = $client->beta->messages->create(
maxTokens: 4096,
messages: [
['role' => 'user', 'content' => 'Create an Excel file with a simple budget spreadsheet']
],
model: 'claude-opus-4-7',
betas: ['code-execution-2025-08-25', 'skills-2025-10-02'],
container: [
'skills' => [
['type' => 'anthropic', 'skill_id' => 'xlsx', 'version' => 'latest']
]
],
tools: [
['type' => 'code_execution_20250825', 'name' => 'code_execution']
]
);
// 步骤 2:从响应中提取文件 ID
function extractFileIds($response) {
$fileIds = [];
foreach ($response->content as $item) {
if ($item->type === 'bash_code_execution_tool_result') {
$contentItem = $item->content;
if ($contentItem->type === 'bash_code_execution_result') {
foreach ($contentItem->content as $file) {
if (isset($file->fileID)) {
$fileIds[] = $file->fileID;
}
}
}
}
}
return $fileIds;
}
// 步骤 3:使用 Files API 下载文件
foreach (extractFileIds($response) as $fileId) {
$fileMetadata = $client->beta->files->retrieveMetadata($fileId);
$fileContent = $client->beta->files->download($fileId);
// 步骤 4:保存到磁盘
file_put_contents($fileMetadata->filename, $fileContent);
echo "Downloaded: {$fileMetadata->filename}\n";
}
require "anthropic"
client = Anthropic::Client.new
# 步骤 1:使用 Skill 创建文件
response = client.beta.messages.create(
model: "claude-opus-4-7",
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 = []
response.content.each do |item|
if item.type == :bash_code_execution_tool_result
content_item = item.content
if content_item.type == :bash_code_execution_result
content_item.content.each do |file|
file_ids << file.file_id if file.respond_to?(:file_id)
end
end
end
end
file_ids
end
# 步骤 3:使用 Files API 下载文件
extract_file_ids(response).each do |file_id|
file_metadata = client.beta.files.retrieve_metadata(file_id)
file_content = client.beta.files.download(file_id)
# 步骤 4:保存到磁盘
File.binwrite(file_metadata.filename, file_content.read)
puts "Downloaded: #{file_metadata.filename}"
end
Additional Files API operations:
# 获取文件元数据
curl "https://api.anthropic.com/v1/files/$FILE_ID" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: files-api-2025-04-14"
# 列出所有文件
curl "https://api.anthropic.com/v1/files" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: files-api-2025-04-14"
# 删除文件
curl -X DELETE "https://api.anthropic.com/v1/files/$FILE_ID" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: files-api-2025-04-14"
# 获取文件元数据
ant beta:files retrieve-metadata --file-id "$FILE_ID" \
--transform '{filename,size_bytes}' --format yaml \
| { read -r _ name; read -r _ size
printf 'Filename: %s, Size: %s bytes\n' "$name" "$size"; }
# 列出所有文件
ant beta:files list \
--transform '{filename,created_at}' --format yaml \
| while read -r _ name && read -r _ date; do
printf '%s - %s\n' "$name" "${date//\"/}"
done
# 删除文件
ant beta:files delete --file-id "$FILE_ID" >/dev/null
import anthropic
client = anthropic.Anthropic()
file_id = "file_abc123"
# 获取文件元数据
file_info = client.beta.files.retrieve_metadata(file_id=file_id)
print(f"Filename: {file_info.filename}, Size: {file_info.size_bytes} bytes")
# 列出所有文件
files = client.beta.files.list()
for file in files.data:
print(f"{file.filename} - {file.created_at}")
# 删除文件
client.beta.files.delete(file_id=file_id)
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const fileId = "file_011CNha8iCJcU1wXNR6q4V8w";
// 获取文件元数据
const fileInfo = await client.beta.files.retrieveMetadata(fileId);
console.log(`Filename: ${fileInfo.filename}, Size: ${fileInfo.size_bytes} bytes`);
// 列出所有文件
const files = await client.beta.files.list();
for (const file of files.data) {
console.log(`${file.filename} - ${file.created_at}`);
}
// 删除文件
await client.beta.files.delete(fileId);
using System;
using System.Threading.Tasks;
using Anthropic;
using Anthropic.Models.Beta.Files;
class Program
{
static async Task Main(string[] args)
{
AnthropicClient client = new();
string fileId = "file_abc123";
// 获取文件元数据
var fileInfo = await client.Beta.Files.RetrieveMetadata(fileId);
Console.WriteLine({{CONTENT}}quot;Filename: {fileInfo.Filename}, Size: {fileInfo.SizeBytes} bytes");
// 列出所有文件
var files = await client.Beta.Files.List();
foreach (var file in files.Data)
{
Console.WriteLine({{CONTENT}}quot;{file.Filename} - {file.CreatedAt}");
}
// 删除文件
await client.Beta.Files.Delete(fileId);
}
}
package main
import (
"context"
"fmt"
"log"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
fileID := "file_abc123"
// 获取文件元数据
fileInfo, err := client.Beta.Files.GetMetadata(context.TODO(), fileID, anthropic.BetaFileGetMetadataParams{})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Filename: %s, Size: %d bytes\n", fileInfo.Filename, fileInfo.SizeBytes)
// 列出所有文件
files := client.Beta.Files.ListAutoPaging(context.TODO(), anthropic.BetaFileListParams{})
for files.Next() {
file := files.Current()
fmt.Printf("%s - %s\n", file.Filename, file.CreatedAt)
}
// 删除文件
_, err = client.Beta.Files.Delete(context.TODO(), fileID, anthropic.BetaFileDeleteParams{})
if err != nil {
log.Fatal(err)
}
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.files.FileMetadata;
import com.anthropic.models.beta.files.FileListPage;
public class FileManagement {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
String fileId = "file_abc123";
// 获取文件元数据
FileMetadata fileInfo = client.beta().files().retrieveMetadata(fileId);
System.out.println("Filename: " + fileInfo.filename() + ", Size: " + fileInfo.sizeBytes() + " bytes");
// 列出所有文件
FileListPage files = client.beta().files().list();
for (var file : files.data()) {
System.out.println(file.filename() + " - " + file.createdAt());
}
// 删除文件
client.beta().files().delete(fileId);
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
$fileId = "file_abc123";
// 获取文件元数据
$fileInfo = $client->beta->files->retrieveMetadata($fileId);
echo "Filename: {$fileInfo->filename}, Size: {$fileInfo->sizeBytes} bytes\n";
// 列出所有文件
$files = $client->beta->files->list();
foreach ($files->data as $file) {
echo "{$file->filename} - {$file->createdAt}\n";
}
// 删除文件
$client->beta->files->delete($fileId);
require "anthropic"
client = Anthropic::Client.new
file_id = "file_abc123"
# 获取文件元数据
file_info = client.beta.files.retrieve_metadata(file_id)
puts "Filename: #{file_info.filename}, Size: #{file_info.size_bytes} bytes"
# 列出所有文件
files = client.beta.files.list
files.data.each do |file|
puts "#{file.filename} - #{file.created_at}"
end
# 删除文件
client.beta.files.delete(file_id)
For complete details on the Files API, see the Files API documentation.
多轮对话
通过指定容器 ID 在多条消息中复用同一容器:
# 第一个请求创建容器
CONTAINER_ID=$(ant beta:messages create \
--beta code-execution-2025-08-25 --beta skills-2025-10-02 \
--transform container.id --raw-output <<'YAML'
model: claude-opus-4-7
max_tokens: 4096
container:
skills:
- {type: anthropic, skill_id: xlsx, version: latest}
messages:
- role: user
content: Analyze this sales data
tools:
- {type: code_execution_20250825, name: code_execution}
YAML
)
# 使用同一容器继续对话
ant beta:messages create \
--beta code-execution-2025-08-25 --beta skills-2025-10-02 <<YAML
model: claude-opus-4-7
max_tokens: 4096
container:
id: $CONTAINER_ID # 复用容器
skills:
- {type: anthropic, skill_id: xlsx, version: latest}
messages:
- role: user
content: Analyze this sales data
- role: assistant
content: [] # content blocks from the first response
- role: user
content: What was the total revenue?
tools:
- {type: code_execution_20250825, name: code_execution}
YAML
# 第一个请求创建容器
response1 = client.beta.messages.create(
model="claude-opus-4-7",
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 this sales data"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
# 使用同一容器继续对话
messages = [
{"role": "user", "content": "Analyze this sales data"},
{"role": "assistant", "content": response1.content},
{"role": "user", "content": "What was the total revenue?"},
]
response2 = client.beta.messages.create(
model="claude-opus-4-7",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"id": response1.container.id, # 复用容器
"skills": [{"type": "anthropic", "skill_id": "xlsx", "version": "latest"}],
},
messages=messages,
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
// 第一个请求创建容器
const response1 = await client.beta.messages.create({
model: "claude-opus-4-7",
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 this sales data" }],
tools: [{ type: "code_execution_20250825", name: "code_execution" }]
});
// 使用同一容器继续对话
const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
{ role: "user", content: "Analyze this sales data" },
{
role: "assistant",
content: response1.content as Anthropic.Beta.Messages.BetaContentBlockParam[]
},
{ role: "user", content: "What was the total revenue?" }
];
const response2 = await client.beta.messages.create({
model: "claude-opus-4-7",
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,
tools: [{ type: "code_execution_20250825", name: "code_execution" }]
});
using System;
using System.Threading.Tasks;
using Anthropic;
using Anthropic.Models.Beta.Messages;
public class Program
{
public static async Task Main()
{
var client = new AnthropicClient();
var parameters1 = new MessageCreateParams
{
Model = "claude-opus-4-7",
MaxTokens = 4096,
Betas = new[] { "code-execution-2025-08-25", "skills-2025-10-02" },
Container = new BetaContainerParams
{
Skills = new[]
{
new BetaSkillParam
{
Type = "anthropic",
SkillId = "xlsx",
Version = "latest"
}
}
},
Messages = new[]
{
new BetaMessageParam
{
Role = Role.User,
Content = "Analyze this sales data"
}
},
Tools = new[]
{
new BetaToolParam
{
Type = "code_execution_20250825",
Name = "code_execution"
}
}
};
var response1 = await client.Beta.Messages.Create(parameters1);
var parameters2 = new MessageCreateParams
{
Model = "claude-opus-4-7",
MaxTokens = 4096,
Betas = new[] { "code-execution-2025-08-25", "skills-2025-10-02" },
Container = new BetaContainerParams
{
Id = response1.Container.Id,
Skills = new[]
{
new BetaSkillParam
{
Type = "anthropic",
SkillId = "xlsx",
Version = "latest"
}
}
},
Messages = new[]
{
new BetaMessageParam { Role = Role.User, Content = "Analyze this sales data" },
new BetaMessageParam { Role = Role.Assistant, Content = response1.Content },
new BetaMessageParam { Role = Role.User, Content = "What was the total revenue?" }
},
Tools = new[]
{
new BetaToolParam
{
Type = "code_execution_20250825",
Name = "code_execution"
}
}
};
var response2 = await client.Beta.Messages.Create(parameters2);
Console.WriteLine(response2);
}
}
package main
import (
"context"
"fmt"
"log"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
response1, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{"code-execution-2025-08-25", anthropic.AnthropicBetaSkills2025_10_02},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfContainers: &anthropic.BetaContainerParams{
Skills: []anthropic.BetaSkillParams{
{
Type: anthropic.BetaSkillParamsTypeAnthropic,
SkillID: "xlsx",
Version: anthropic.String("latest"),
},
},
},
},
Messages: []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Analyze this sales data")),
},
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
log.Fatal(err)
}
response2, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{"code-execution-2025-08-25", anthropic.AnthropicBetaSkills2025_10_02},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfString: anthropic.String(response1.Container.ID),
},
Messages: []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Analyze this sales data")),
response1.ToParam(),
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("What was the total revenue?")),
},
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response2)
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.messages.MessageCreateParams;
import com.anthropic.models.beta.messages.BetaMessage;
import com.anthropic.models.beta.messages.BetaContainerParams;
import com.anthropic.models.beta.messages.BetaSkillParams;
import com.anthropic.models.beta.messages.BetaCodeExecutionTool20250825;
public class ContainerReuse {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
MessageCreateParams params1 = MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.container(BetaContainerParams.builder()
.addSkill(BetaSkillParams.builder()
.type(BetaSkillParams.Type.ANTHROPIC)
.skillId("xlsx")
.version("latest")
.build())
.build())
.addUserMessage("Analyze this sales data")
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build();
BetaMessage response1 = client.beta().messages().create(params1);
MessageCreateParams params2 = MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.container(BetaContainerParams.builder()
.id(response1.container().get().id())
.addSkill(BetaSkillParams.builder()
.type(BetaSkillParams.Type.ANTHROPIC)
.skillId("xlsx")
.version("latest")
.build())
.build())
.addUserMessage("Analyze this sales data")
.addMessage(response1)
.addUserMessage("What was the total revenue?")
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build();
BetaMessage response2 = client.beta().messages().create(params2);
System.out.println(response2);
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
$response1 = $client->beta->messages->create(
maxTokens: 4096,
messages: [
['role' => 'user', 'content' => 'Analyze this sales data']
],
model: 'claude-opus-4-7',
betas: ['code-execution-2025-08-25', 'skills-2025-10-02'],
container: [
'skills' => [
['type' => 'anthropic', 'skill_id' => 'xlsx', 'version' => 'latest']
]
],
tools: [
['type' => 'code_execution_20250825', 'name' => 'code_execution']
]
);
$messages = [
['role' => 'user', 'content' => 'Analyze this sales data'],
['role' => 'assistant', 'content' => $response1->content],
['role' => 'user', 'content' => 'What was the total revenue?']
];
$response2 = $client->beta->messages->create(
maxTokens: 4096,
messages: $messages,
model: 'claude-opus-4-7',
betas: ['code-execution-2025-08-25', 'skills-2025-10-02'],
container: [
'id' => $response1->container->id,
'skills' => [
['type' => 'anthropic', 'skill_id' => 'xlsx', 'version' => 'latest']
]
],
tools: [
['type' => 'code_execution_20250825', 'name' => 'code_execution']
]
);
echo $response2;
require "anthropic"
client = Anthropic::Client.new
response1 = client.beta.messages.create(
model: "claude-opus-4-7",
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 this sales data" }
],
tools: [
{ type: "code_execution_20250825", name: "code_execution" }
]
)
messages = [
{ role: "user", content: "Analyze this sales data" },
{ role: "assistant", content: response1.content },
{ role: "user", content: "What was the total revenue?" }
]
response2 = client.beta.messages.create(
model: "claude-opus-4-7",
max_tokens: 4096,
betas: ["code-execution-2025-08-25", "skills-2025-10-02"],
container: {
id: response1.container.id,
skills: [
{ type: "anthropic", skill_id: "xlsx", version: "latest" }
]
},
messages: messages,
tools: [
{ type: "code_execution_20250825", name: "code_execution" }
]
)
puts response2
长时间运行的操作
Skills 可能执行需要多轮的操作。处理 pause_turn 停止原因:
# 初始请求
RESPONSE=$(curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: code-execution-2025-08-25,skills-2025-10-02" \
-H "content-type: application/json" \
-d '{
"model": "claude-opus-4-7",
"max_tokens": 4096,
"container": {
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest"
}
]
},
"messages": [{
"role": "user",
"content": "Process this large dataset"
}],
"tools": [{
"type": "code_execution_20250825",
"name": "code_execution"
}]
}')
# 在循环中检查 stop_reason 并处理 pause_turn
STOP_REASON=$(echo "$RESPONSE" | jq -r '.stop_reason')
CONTAINER_ID=$(echo "$RESPONSE" | jq -r '.container.id')
while [ "$STOP_REASON" = "pause_turn" ]; do
# 使用同一容器继续
RESPONSE=$(curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: code-execution-2025-08-25,skills-2025-10-02" \
-H "content-type: application/json" \
-d "{
\"model\": \"claude-opus-4-7\",
\"max_tokens\": 4096,
\"container\": {
\"id\": \"$CONTAINER_ID\",
\"skills\": [{
\"type\": \"custom\",
\"skill_id\": \"skill_01AbCdEfGhIjKlMnOpQrStUv\",
\"version\": \"latest\"
}]
},
\"messages\": [/* include conversation history */],
\"tools\": [{
\"type\": \"code_execution_20250825\",
\"name\": \"code_execution\"
}]
}")
STOP_REASON=$(echo "$RESPONSE" | jq -r '.stop_reason')
done
RESP=$(mktemp)
# 初始请求: capture the full JSON response to a temp file
ant beta:messages create \
--beta code-execution-2025-08-25 \
--beta skills-2025-10-02 \
> "$RESP" <<'YAML'
model: claude-opus-4-7
max_tokens: 4096
container:
skills:
- type: custom
skill_id: skill_01AbCdEfGhIjKlMnOpQrStUv
version: latest
messages:
- role: user
content: Process this large dataset
tools:
- type: code_execution_20250825
name: code_execution
YAML
# 处理长时间操作的 pause_turn(最多 10 次迭代)
for _ in {1..10}; do
[[ $(jq -r '.stop_reason' "$RESP") == pause_turn ]] || break
CONTAINER_ID=$(jq -r '.container.id' "$RESP")
# 在同一容器中继续,追加先前响应的
# content array to messages as the assistant turn.
ant beta:messages create \
--beta code-execution-2025-08-25 \
--beta skills-2025-10-02 \
> "$RESP" <<YAML
model: claude-opus-4-7
max_tokens: 4096
container:
id: $CONTAINER_ID
skills:
- type: custom
skill_id: skill_01AbCdEfGhIjKlMnOpQrStUv
version: latest
messages:
# ... conversation history with prior assistant content appended
tools:
- type: code_execution_20250825
name: code_execution
YAML
done
messages = [{"role": "user", "content": "Process this large dataset"}]
max_retries = 10
response = client.beta.messages.create(
model="claude-opus-4-7",
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 i 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-4-7",
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"}],
)
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
const messages: Anthropic.Beta.Messages.BetaMessageParam[] = [
{ role: "user", content: "Process this large dataset" }
];
const maxRetries = 10;
let response = await client.beta.messages.create({
model: "claude-opus-4-7",
max_tokens: 4096,
betas: ["code-execution-2025-08-25", "skills-2025-10-02"],
container: {
skills: [{ type: "custom", skill_id: "skill_01AbCdEfGhIjKlMnOpQrStUv", version: "latest" }]
},
messages,
tools: [{ type: "code_execution_20250825", name: "code_execution" }]
});
// 处理长时间操作的 pause_turn
for (let i = 0; i < maxRetries; i++) {
if (response.stop_reason !== "pause_turn") {
break;
}
messages.push({
role: "assistant" as const,
content: response.content as Anthropic.Beta.Messages.BetaContentBlockParam[]
});
response = await client.beta.messages.create({
model: "claude-opus-4-7",
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,
tools: [{ type: "code_execution_20250825", name: "code_execution" }]
});
}
using Anthropic;
using Anthropic.Models.Beta.Messages;
AnthropicClient client = new();
var messages = new List<BetaMessageParam>
{
new() { Role = Role.User, Content = "Process this large dataset" }
};
int maxRetries = 10;
var response = await client.Beta.Messages.Create(new MessageCreateParams
{
Model = "claude-opus-4-7",
MaxTokens = 4096,
Betas = ["code-execution-2025-08-25", "skills-2025-10-02"],
Container = new BetaContainerParams
{
Skills = [
new BetaSkillParam
{
Type = "custom",
SkillId = "skill_01AbCdEfGhIjKlMnOpQrStUv",
Version = "latest"
}
]
},
Messages = messages,
Tools = [new BetaToolParam { Type = "code_execution_20250825", Name = "code_execution" }]
});
for (int i = 0; i < maxRetries; i++)
{
if (response.StopReason != "pause_turn")
{
break;
}
messages.Add(new BetaMessageParam { Role = Role.Assistant, Content = response.Content });
response = await client.Beta.Messages.Create(new MessageCreateParams
{
Model = "claude-opus-4-7",
MaxTokens = 4096,
Betas = ["code-execution-2025-08-25", "skills-2025-10-02"],
Container = new BetaContainerParams
{
Id = response.Container.Id,
Skills = [
new BetaSkillParam
{
Type = "custom",
SkillId = "skill_01AbCdEfGhIjKlMnOpQrStUv",
Version = "latest"
}
]
},
Messages = messages,
Tools = [new BetaToolParam { Type = "code_execution_20250825", Name = "code_execution" }]
});
}
package main
import (
"context"
"fmt"
"log"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
messages := []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Process this large dataset")),
}
maxRetries := 10
response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{"code-execution-2025-08-25", anthropic.AnthropicBetaSkills2025_10_02},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfContainers: &anthropic.BetaContainerParams{
Skills: []anthropic.BetaSkillParams{
{
Type: anthropic.BetaSkillParamsTypeCustom,
SkillID: "skill_01AbCdEfGhIjKlMnOpQrStUv",
Version: anthropic.String("latest"),
},
},
},
},
Messages: messages,
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
log.Fatal(err)
}
for i := 0; i < maxRetries; i++ {
if response.StopReason != "pause_turn" {
break
}
messages = append(messages, response.ToParam())
response, err = client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{"code-execution-2025-08-25", anthropic.AnthropicBetaSkills2025_10_02},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfString: anthropic.String(response.Container.ID),
},
Messages: messages,
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
log.Fatal(err)
}
}
fmt.Println(response)
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.messages.MessageCreateParams;
import com.anthropic.models.beta.messages.BetaMessage;
import com.anthropic.models.beta.messages.BetaMessageParam;
import com.anthropic.models.beta.messages.BetaContainerParams;
import com.anthropic.models.beta.messages.BetaSkillParams;
import com.anthropic.models.beta.messages.BetaCodeExecutionTool20250825;
import java.util.ArrayList;
import java.util.List;
import com.anthropic.models.beta.messages.BetaStopReason;
public class Main {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
List<BetaMessageParam> messages = new ArrayList<>();
messages.add(
BetaMessageParam.builder()
.role(BetaMessageParam.Role.USER)
.content("Process this large dataset")
.build()
);
int maxRetries = 10;
BetaMessage response = client.beta().messages().create(
MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.container(BetaContainerParams.builder()
.addSkill(BetaSkillParams.builder()
.type(BetaSkillParams.Type.CUSTOM)
.skillId("skill_01AbCdEfGhIjKlMnOpQrStUv")
.version("latest")
.build())
.build())
.messages(messages)
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build());
for (int i = 0; i < maxRetries; i++) {
if (!response.stopReason().isPresent()
|| !response.stopReason().get().equals(BetaStopReason.PAUSE_TURN)) {
break;
}
messages.add(response.toParam());
response = client.beta().messages().create(
MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.container(BetaContainerParams.builder()
.id(response.container().get().id())
.addSkill(BetaSkillParams.builder()
.type(BetaSkillParams.Type.CUSTOM)
.skillId("skill_01AbCdEfGhIjKlMnOpQrStUv")
.version("latest")
.build())
.build())
.messages(messages)
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build());
}
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
$messages = [
['role' => 'user', 'content' => 'Process this large dataset']
];
$maxRetries = 10;
$response = $client->beta->messages->create(
maxTokens: 4096,
messages: $messages,
model: 'claude-opus-4-7',
betas: ['code-execution-2025-08-25', 'skills-2025-10-02'],
container: [
'skills' => [
[
'type' => 'custom',
'skill_id' => 'skill_01AbCdEfGhIjKlMnOpQrStUv',
'version' => 'latest'
]
]
],
tools: [['type' => 'code_execution_20250825', 'name' => 'code_execution']]
);
for ($i = 0; $i < $maxRetries; $i++) {
if ($response->stopReason !== 'pause_turn') {
break;
}
$messages[] = ['role' => 'assistant', 'content' => $response->content];
$response = $client->beta->messages->create(
maxTokens: 4096,
messages: $messages,
model: 'claude-opus-4-7',
betas: ['code-execution-2025-08-25', 'skills-2025-10-02'],
container: [
'id' => $response->container->id,
'skills' => [
[
'type' => 'custom',
'skill_id' => 'skill_01AbCdEfGhIjKlMnOpQrStUv',
'version' => 'latest'
]
]
],
tools: [['type' => 'code_execution_20250825', 'name' => 'code_execution']]
);
}
require "anthropic"
client = Anthropic::Client.new
messages = [
{ role: "user", content: "Process this large dataset" }
]
max_retries = 10
response = client.beta.messages.create(
model: "claude-opus-4-7",
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" }]
)
max_retries.times do
break if response.stop_reason != :pause_turn
messages << { role: "assistant", content: response.content }
response = client.beta.messages.create(
model: "claude-opus-4-7",
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" }]
)
end
响应可能包含 pause_turn 停止原因,表示 API 暂停了长时间运行的 Skill 操作。您可以在后续请求中原样返回响应以让 Claude 继续其轮次,或者如果您想中断对话并提供额外指导,可以修改内容。
使用多个 Skills
在单个请求中组合多个 Skills 以处理复杂工作流:
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: code-execution-2025-08-25,skills-2025-10-02" \
-H "content-type: application/json" \
-d '{
"model": "claude-opus-4-7",
"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"
}]
}'
ant beta:messages create \
--beta code-execution-2025-08-25 \
--beta skills-2025-10-02 <<'YAML'
model: claude-opus-4-7
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
YAML
response = client.beta.messages.create(
model="claude-opus-4-7",
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"}],
)
const response = await client.beta.messages.create({
model: "claude-opus-4-7",
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"
}
]
});
using System;
using System.Threading.Tasks;
using Anthropic;
using Anthropic.Models.Beta.Messages;
public class Program
{
public static async Task Main(string[] args)
{
AnthropicClient client = new();
var parameters = new MessageCreateParams
{
Model = "claude-opus-4-7",
MaxTokens = 4096,
Betas = new[] { "code-execution-2025-08-25", "skills-2025-10-02" },
Container = new BetaContainerParams
{
Skills = new object[]
{
new
{
type = "anthropic",
skill_id = "xlsx",
version = "latest"
},
new
{
type = "anthropic",
skill_id = "pptx",
version = "latest"
},
new
{
type = "custom",
skill_id = "skill_01AbCdEfGhIjKlMnOpQrStUv",
version = "latest"
}
}
},
Messages = new[]
{
new BetaMessageParam
{
Role = Role.User,
Content = "Analyze sales data and create a presentation"
}
},
Tools = new object[]
{
new
{
type = "code_execution_20250825",
name = "code_execution"
}
}
};
var message = await client.Beta.Messages.Create(parameters);
Console.WriteLine(message);
}
}
package main
import (
"context"
"fmt"
"log"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{
"code-execution-2025-08-25",
anthropic.AnthropicBetaSkills2025_10_02,
},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfContainers: &anthropic.BetaContainerParams{
Skills: []anthropic.BetaSkillParams{
{
Type: anthropic.BetaSkillParamsTypeAnthropic,
SkillID: "xlsx",
Version: anthropic.String("latest"),
},
{
Type: anthropic.BetaSkillParamsTypeAnthropic,
SkillID: "pptx",
Version: anthropic.String("latest"),
},
{
Type: anthropic.BetaSkillParamsTypeCustom,
SkillID: "skill_01AbCdEfGhIjKlMnOpQrStUv",
Version: anthropic.String("latest"),
},
},
},
},
Messages: []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Analyze sales data and create a presentation")),
},
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response)
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.messages.MessageCreateParams;
import com.anthropic.models.beta.messages.BetaMessage;
import com.anthropic.models.beta.messages.BetaContainerParams;
import com.anthropic.models.beta.messages.BetaSkillParams;
import com.anthropic.models.beta.messages.BetaCodeExecutionTool20250825;
import java.util.List;
public class SkillsExample {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
MessageCreateParams params = MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.container(BetaContainerParams.builder()
.skills(List.of(
BetaSkillParams.builder()
.type(BetaSkillParams.Type.ANTHROPIC)
.skillId("xlsx")
.version("latest")
.build(),
BetaSkillParams.builder()
.type(BetaSkillParams.Type.ANTHROPIC)
.skillId("pptx")
.version("latest")
.build(),
BetaSkillParams.builder()
.type(BetaSkillParams.Type.CUSTOM)
.skillId("skill_01AbCdEfGhIjKlMnOpQrStUv")
.version("latest")
.build()
))
.build())
.addUserMessage("Analyze sales data and create a presentation")
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build();
BetaMessage response = client.beta().messages().create(params);
System.out.println(response);
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
$message = $client->beta->messages->create(
maxTokens: 4096,
messages: [
['role' => 'user', 'content' => 'Analyze sales data and create a presentation']
],
model: 'claude-opus-4-7',
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'
]
]
],
tools: [
['type' => 'code_execution_20250825', 'name' => 'code_execution']
]
);
echo $message;
require "anthropic"
client = Anthropic::Client.new
message = client.beta.messages.create(
model: "claude-opus-4-7",
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" }
]
)
puts message
管理自定义 Skills
创建 Skill
Skill 包是一个目录,顶层包含一个 SKILL.md 文件,带有 name 和 description YAML 前置信息,以及任何支持脚本或资源。请参阅 API 中的 Agent Skills 入门来编写一个,以及示例后面的需求列表了解完整约束。
上传您的自定义 Skill 以使其在您的工作区中可用。您可以上传 zip 归档或单独的文件对象;Python SDK 还提供了一个 files_from_dir 辅助函数,接受目录路径。
curl -X POST "https://api.anthropic.com/v1/skills" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: skills-2025-10-02" \
-F "display_title=Financial Analysis" \
-F "files[]=@financial_skill/SKILL.md;filename=financial_skill/SKILL.md" \
-F "files[]=@financial_skill/analyze.py;filename=financial_skill/analyze.py"
# 选项 1:上传单个文件(每个文件一个 --file 标志)
ant beta:skills create \
--display-title "Financial Analysis" \
--file financial_skill/SKILL.md \
--file financial_skill/analyze.py \
--beta skills-2025-10-02
# 选项 2:上传 zip 归档
ant beta:skills create \
--display-title "Financial Analysis" \
--file financial_analysis_skill.zip \
--beta skills-2025-10-02
import anthropic
client = anthropic.Anthropic()
# 选项 1:使用 files_from_dir 辅助函数(仅 Python,推荐)
from anthropic.lib import files_from_dir
skill = client.beta.skills.create(
display_title="Financial Analysis",
files=files_from_dir("/path/to/financial_analysis_skill"),
)
# 选项 2:使用 zip 文件
skill = client.beta.skills.create(
display_title="Financial Analysis",
files=[("skill.zip", open("financial_analysis_skill.zip", "rb"))],
)
# 选项 3:使用文件元组 (filename, file_content, mime_type)
skill = client.beta.skills.create(
display_title="Financial Analysis",
files=[
(
"financial_skill/SKILL.md",
open("financial_skill/SKILL.md", "rb"),
"text/markdown",
),
(
"financial_skill/analyze.py",
open("financial_skill/analyze.py", "rb"),
"text/x-python",
),
],
)
print(f"Created skill: {skill.id}")
print(f"Latest version: {skill.latest_version}")
import Anthropic, { toFile } from "@anthropic-ai/sdk";
import fs from "fs";
const client = new Anthropic();
// 选项 1:使用 zip 文件
const skillFromZip = await client.beta.skills.create({
display_title: "Financial Analysis",
files: [await toFile(fs.createReadStream("financial_analysis_skill.zip"), "skill.zip")]
});
// 选项 2:使用单独的文件对象
const skill = await client.beta.skills.create({
display_title: "Financial Analysis",
files: [
await toFile(fs.createReadStream("financial_skill/SKILL.md"), "financial_skill/SKILL.md", {
type: "text/markdown"
}),
await toFile(
fs.createReadStream("financial_skill/analyze.py"),
"financial_skill/analyze.py",
{ type: "text/x-python" }
)
]
});
console.log(`Created skill: ${skill.id}`);
console.log(`Latest version: ${skill.latest_version}`);
using System;
using System.IO;
using System.Threading.Tasks;
using Anthropic;
using Anthropic.Models.Beta.Skills;
class Program
{
static async Task Main(string[] args)
{
AnthropicClient client = new();
// 选项 1:使用 zip 文件
var parameters = new SkillCreateParams
{
DisplayTitle = "Financial Analysis",
Files = [
new FileStream("financial_analysis_skill.zip", FileMode.Open, FileAccess.Read)
],
};
var skill = await client.Beta.Skills.Create(parameters);
// 选项 2:使用单个文件
var parameters2 = new SkillCreateParams
{
DisplayTitle = "Financial Analysis",
Files = [
new FileStream("financial_skill/SKILL.md", FileMode.Open, FileAccess.Read),
new FileStream("financial_skill/analyze.py", FileMode.Open, FileAccess.Read)
],
};
var skill2 = await client.Beta.Skills.Create(parameters2);
Console.WriteLine({{CONTENT}}quot;Created skill: {skill.Id}");
Console.WriteLine({{CONTENT}}quot;Latest version: {skill.LatestVersion}");
}
}
package main
import (
"context"
"fmt"
"io"
"log"
"os"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
// 选项 1:使用 zip 文件
zipFile, err := os.Open("financial_analysis_skill.zip")
if err != nil {
log.Fatal(err)
}
defer zipFile.Close()
skill, err := client.Beta.Skills.New(context.TODO(), anthropic.BetaSkillNewParams{
DisplayTitle: anthropic.String("Financial Analysis"),
Files: []io.Reader{zipFile},
})
if err != nil {
log.Fatal(err)
}
// 选项 2:使用单个文件
skillMd, err := os.Open("financial_skill/SKILL.md")
if err != nil {
log.Fatal(err)
}
defer skillMd.Close()
analyzePy, err := os.Open("financial_skill/analyze.py")
if err != nil {
log.Fatal(err)
}
defer analyzePy.Close()
skill2, err := client.Beta.Skills.New(context.TODO(), anthropic.BetaSkillNewParams{
DisplayTitle: anthropic.String("Financial Analysis"),
Files: []io.Reader{skillMd, analyzePy},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Created skill: %s\n", skill.ID)
fmt.Printf("Latest version: %s\n", skill.LatestVersion)
fmt.Printf("Created skill 2: %s\n", skill2.ID)
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.skills.SkillCreateParams;
import com.anthropic.models.beta.skills.SkillCreateResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Path;
public class SkillCreate {
public static void main(String[] args) throws IOException {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
// 选项 1:使用 zip 文件
SkillCreateParams params = SkillCreateParams.builder()
.displayTitle("Financial Analysis")
.addFile(new FileInputStream("financial_analysis_skill.zip"))
.build();
SkillCreateResponse skill = client.beta().skills().create(params);
// 选项 2:使用单个文件
SkillCreateParams params2 = SkillCreateParams.builder()
.displayTitle("Financial Analysis")
.addFile(Path.of("financial_skill/SKILL.md"))
.addFile(Path.of("financial_skill/analyze.py"))
.build();
SkillCreateResponse skill2 = client.beta().skills().create(params2);
System.out.println("Created skill: " + skill.id());
System.out.println("Latest version: " + skill.latestVersion());
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
// 选项 1:使用 zip 文件
$skill = $client->beta->skills->create(
displayTitle: 'Financial Analysis',
files: [
fopen('financial_analysis_skill.zip', 'r')
],
);
// 选项 2:使用单个文件
$skill = $client->beta->skills->create(
displayTitle: 'Financial Analysis',
files: [
fopen('financial_skill/SKILL.md', 'r'),
fopen('financial_skill/analyze.py', 'r')
],
);
echo "Created skill: {$skill->id}\n";
echo "Latest version: {$skill->latestVersion}\n";
require "anthropic"
client = Anthropic::Client.new
# 选项 1:使用 zip 文件
skill = client.beta.skills.create(
display_title: "Financial Analysis",
files: [
File.open("financial_analysis_skill.zip", "rb")
]
)
# 选项 2:使用单个文件
skill = client.beta.skills.create(
display_title: "Financial Analysis",
files: [
File.open("financial_skill/SKILL.md", "rb"),
File.open("financial_skill/analyze.py", "rb")
]
)
puts "Created skill: #{skill.id}"
puts "Latest version: #{skill.latest_version}"
需求:
- 必须在顶层包含 SKILL.md 文件
- 所有文件必须在其路径中指定公共根目录
- 总上传大小必须低于 30 MB
- YAML 前置信息需求:
name:最多 64 个字符,仅限小写字母/数字/连字符,无 XML 标签,无保留字("anthropic"、"claude")description:最多 1024 个字符,非空,无 XML 标签
有关完整的请求/响应模式,请参阅 创建 Skill API 参考。
列出 Skills
检索您的工作区中可用的所有 Skills,包括 Anthropic 预构建的 Skills 和您的自定义 Skills。使用 source 参数按 Skill 类型过滤:
# 列出所有 Skills
curl "https://api.anthropic.com/v1/skills" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: skills-2025-10-02"
# 仅列出自定义 Skills
curl "https://api.anthropic.com/v1/skills?source=custom" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: skills-2025-10-02"
# 列出所有 Skills
ant beta:skills list
# 仅列出自定义 Skills
ant beta:skills list --source custom
# 列出所有 Skills
skills = client.beta.skills.list()
for skill in skills.data:
print(f"{skill.id}: {skill.display_title} (source: {skill.source})")
# 仅列出自定义 Skills
custom_skills = client.beta.skills.list(source="custom")
// 列出所有 Skills
const skills = await client.beta.skills.list();
for (const skill of skills.data) {
console.log(`${skill.id}: ${skill.display_title} (source: ${skill.source})`);
}
// 仅列出自定义 Skills
const customSkills = await client.beta.skills.list({
source: "custom"
});
using System;
using System.Threading.Tasks;
using Anthropic;
using Anthropic.Models.Beta.Skills;
class Program
{
static async Task Main(string[] args)
{
AnthropicClient client = new();
// 列出所有 Skills
var skills = await client.Beta.Skills.List();
foreach (var skill in skills.Data)
{
Console.WriteLine({{CONTENT}}quot;{skill.Id}: {skill.DisplayTitle} (source: {skill.Source})");
}
// 仅列出自定义 Skills
var customSkills = await client.Beta.Skills.List(new SkillListParams
{
Source = "custom",
});
}
}
package main
import (
"context"
"fmt"
"log"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
// 列出所有 Skills
skills := client.Beta.Skills.ListAutoPaging(context.TODO(), anthropic.BetaSkillListParams{})
for skills.Next() {
skill := skills.Current()
fmt.Printf("%s: %s (source: %s)\n", skill.ID, skill.DisplayTitle, skill.Source)
}
if skills.Err() != nil {
log.Fatal(skills.Err())
}
// 仅列出自定义 Skills
customSkills := client.Beta.Skills.ListAutoPaging(context.TODO(), anthropic.BetaSkillListParams{
Source: anthropic.String("custom"),
})
for customSkills.Next() {
skill := customSkills.Current()
fmt.Printf("%s: %s (source: %s)\n", skill.ID, skill.DisplayTitle, skill.Source)
}
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.skills.SkillListParams;
import com.anthropic.models.beta.skills.SkillListPage;
import com.anthropic.models.beta.skills.SkillListResponse;
public class ListSkills {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
// 列出所有 Skills
SkillListPage skills = client.beta().skills().list();
for (SkillListResponse skill : skills.data()) {
System.out.println(skill.id() + ": " + skill.displayTitle() + " (source: " + skill.source() + ")");
}
// 仅列出自定义 Skills
SkillListParams customParams = SkillListParams.builder()
.source("custom")
.build();
SkillListPage customSkills = client.beta().skills().list(customParams);
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
// 列出所有 Skills
$skills = $client->beta->skills->list();
foreach ($skills->data as $skill) {
echo "{$skill->id}: {$skill->displayTitle} (source: {$skill->source})\n";
}
// 仅列出自定义 Skills
$customSkills = $client->beta->skills->list(
source: 'custom',
);
require "anthropic"
client = Anthropic::Client.new
# 列出所有 Skills
skills = client.beta.skills.list
skills.data.each do |skill|
puts "#{skill.id}: #{skill.display_title} (source: #{skill.source})"
end
# 仅列出自定义 Skills
custom_skills = client.beta.skills.list(
source: "custom"
)
有关分页和过滤选项,请参阅列出 Skills API 参考。
检索 Skill
获取特定 Skill 的详细信息:
curl "https://api.anthropic.com/v1/skills/skill_01AbCdEfGhIjKlMnOpQrStUv" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: skills-2025-10-02"
ant beta:skills retrieve \
--skill-id skill_01AbCdEfGhIjKlMnOpQrStUv
skill = client.beta.skills.retrieve(skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv")
print(f"Skill: {skill.display_title}")
print(f"Latest version: {skill.latest_version}")
print(f"Created: {skill.created_at}")
const skill = await client.beta.skills.retrieve("skill_01AbCdEfGhIjKlMnOpQrStUv");
console.log(`Skill: ${skill.display_title}`);
console.log(`Latest version: ${skill.latest_version}`);
console.log(`Created: ${skill.created_at}`);
using System;
using System.Threading.Tasks;
using Anthropic;
using Anthropic.Models.Beta.Skills;
class Program
{
static async Task Main(string[] args)
{
AnthropicClient client = new();
var skill = await client.Beta.Skills.Retrieve("skill_01AbCdEfGhIjKlMnOpQrStUv");
Console.WriteLine({{CONTENT}}quot;Skill: {skill.DisplayTitle}");
Console.WriteLine({{CONTENT}}quot;Latest version: {skill.LatestVersion}");
Console.WriteLine({{CONTENT}}quot;Created: {skill.CreatedAt}");
}
}
package main
import (
"context"
"fmt"
"log"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
skill, err := client.Beta.Skills.Get(
context.TODO(),
"skill_01AbCdEfGhIjKlMnOpQrStUv",
anthropic.BetaSkillGetParams{},
)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Skill: %s\n", skill.DisplayTitle)
fmt.Printf("Latest version: %s\n", skill.LatestVersion)
fmt.Printf("Created: %s\n", skill.CreatedAt)
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.skills.SkillRetrieveResponse;
public class RetrieveSkill {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
SkillRetrieveResponse skill = client.beta().skills().retrieve("skill_01AbCdEfGhIjKlMnOpQrStUv");
System.out.println("Skill: " + skill.displayTitle());
System.out.println("Latest version: " + skill.latestVersion());
System.out.println("Created: " + skill.createdAt());
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
$skill = $client->beta->skills->retrieve(
skillID: "skill_01AbCdEfGhIjKlMnOpQrStUv",
);
echo "Skill: " . $skill->displayTitle . "\n";
echo "Latest version: " . $skill->latestVersion . "\n";
echo "Created: " . $skill->createdAt . "\n";
require "anthropic"
client = Anthropic::Client.new
skill = client.beta.skills.retrieve("skill_01AbCdEfGhIjKlMnOpQrStUv")
puts "Skill: #{skill.display_title}"
puts "Latest version: #{skill.latest_version}"
puts "Created: #{skill.created_at}"
删除 Skill
要删除 Skill,您必须首先删除其所有版本:
# 首先删除所有版本,然后删除 Skill
curl -X DELETE "https://api.anthropic.com/v1/skills/skill_01AbCdEfGhIjKlMnOpQrStUv" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: skills-2025-10-02"
# 步骤 1:删除所有版本
ant beta:skills:versions list \
--skill-id skill_01AbCdEfGhIjKlMnOpQrStUv \
--transform version --raw-output \
| while read -r VERSION; do
ant beta:skills:versions delete \
--skill-id skill_01AbCdEfGhIjKlMnOpQrStUv \
--version "$VERSION" >/dev/null
done
# 步骤 2:删除 Skill
ant beta:skills delete \
--skill-id skill_01AbCdEfGhIjKlMnOpQrStUv >/dev/null
# 步骤 1:删除所有版本
versions = client.beta.skills.versions.list(skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv")
for version in versions.data:
client.beta.skills.versions.delete(
skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
version=version.version,
)
# 步骤 2:删除 Skill
client.beta.skills.delete(skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv")
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic();
// 步骤 1:删除所有版本
const versions = await client.beta.skills.versions.list("skill_01AbCdEfGhIjKlMnOpQrStUv");
for (const version of versions.data) {
await client.beta.skills.versions.delete("skill_01AbCdEfGhIjKlMnOpQrStUv", version.version);
}
// 步骤 2:删除 Skill
await client.beta.skills.delete("skill_01AbCdEfGhIjKlMnOpQrStUv");
using System;
using System.Threading.Tasks;
using Anthropic;
class Program
{
static async Task Main(string[] args)
{
AnthropicClient client = new();
// 步骤 1:删除所有版本
var versions = await client.Beta.Skills.Versions.List("skill_01AbCdEfGhIjKlMnOpQrStUv");
foreach (var version in versions.Data)
{
await client.Beta.Skills.Versions.Delete(
"skill_01AbCdEfGhIjKlMnOpQrStUv",
version.Version
);
}
// 步骤 2:删除 Skill
await client.Beta.Skills.Delete("skill_01AbCdEfGhIjKlMnOpQrStUv");
}
}
package main
import (
"context"
"log"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
// 步骤 1:删除所有版本
versions := client.Beta.Skills.Versions.ListAutoPaging(
context.TODO(),
"skill_01AbCdEfGhIjKlMnOpQrStUv",
anthropic.BetaSkillVersionListParams{},
)
for versions.Next() {
version := versions.Current()
_, err := client.Beta.Skills.Versions.Delete(
context.TODO(),
version.Version,
anthropic.BetaSkillVersionDeleteParams{
SkillID: "skill_01AbCdEfGhIjKlMnOpQrStUv",
},
)
if err != nil {
log.Fatal(err)
}
}
// 步骤 2:删除 Skill
_, err := client.Beta.Skills.Delete(
context.TODO(),
"skill_01AbCdEfGhIjKlMnOpQrStUv",
anthropic.BetaSkillDeleteParams{},
)
if err != nil {
log.Fatal(err)
}
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.skills.versions.VersionListPage;
import com.anthropic.models.beta.skills.versions.VersionDeleteParams;
public class DeleteSkill {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
// 步骤 1:删除所有版本
VersionListPage versions = client.beta().skills().versions().list("skill_01AbCdEfGhIjKlMnOpQrStUv");
for (var version : versions.data()) {
client.beta().skills().versions().delete(
version.version(),
VersionDeleteParams.builder()
.skillId("skill_01AbCdEfGhIjKlMnOpQrStUv")
.build()
);
}
// 步骤 2:删除 Skill
client.beta().skills().delete("skill_01AbCdEfGhIjKlMnOpQrStUv");
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
// 步骤 1:删除所有版本
$versions = $client->beta->skills->versions->list(
skillID: "skill_01AbCdEfGhIjKlMnOpQrStUv",
);
foreach ($versions->data as $version) {
$client->beta->skills->versions->delete(
skillID: "skill_01AbCdEfGhIjKlMnOpQrStUv",
version: $version->version,
);
}
// 步骤 2:删除 Skill
$client->beta->skills->delete(
skillID: "skill_01AbCdEfGhIjKlMnOpQrStUv",
);
require "anthropic"
client = Anthropic::Client.new
# 步骤 1:删除所有版本
versions = client.beta.skills.versions.list("skill_01AbCdEfGhIjKlMnOpQrStUv")
versions.data.each do |version|
client.beta.skills.versions.delete(
version.version,
skill_id: "skill_01AbCdEfGhIjKlMnOpQrStUv"
)
end
# 步骤 2:删除 Skill
client.beta.skills.delete("skill_01AbCdEfGhIjKlMnOpQrStUv")
尝试删除具有现有版本的 Skill 会返回 400 错误。
版本管理
Skills 支持版本管理以安全地管理更新:
Anthropic Skills:
- 版本使用日期格式:
20251013 - 更新时发布新版本
- 指定确切版本以确保稳定性
自定义 Skills:
- 自动生成的纪元时间戳:
1759178010641129 - 使用
"latest"始终获取最新版本 - 更新 Skill 文件时创建新版本
# 创建新版本
NEW_VERSION=$(curl -X POST "https://api.anthropic.com/v1/skills/skill_01AbCdEfGhIjKlMnOpQrStUv/versions" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: skills-2025-10-02" \
-F "files[]=@updated_skill/SKILL.md;filename=updated_skill/SKILL.md")
VERSION_NUMBER=$(echo "$NEW_VERSION" | jq -r '.version')
# 使用特定版本
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: code-execution-2025-08-25,skills-2025-10-02" \
-H "content-type: application/json" \
-d "{
\"model\": \"claude-opus-4-7\",
\"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\"}]
}"
# 使用最新版本
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: code-execution-2025-08-25,skills-2025-10-02" \
-H "content-type: application/json" \
-d '{
"model": "claude-opus-4-7",
"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"}]
}'
# 创建新版本
VERSION_NUMBER=$(ant beta:skills:versions create \
--skill-id skill_01AbCdEfGhIjKlMnOpQrStUv \
--file updated_skill/SKILL.md \
--transform version --raw-output)
# 使用特定版本
ant beta:messages create \
--beta code-execution-2025-08-25 \
--beta skills-2025-10-02 <<YAML
model: claude-opus-4-7
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 \
--beta skills-2025-10-02 <<'YAML'
model: claude-opus-4-7
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
# 创建新版本
from anthropic.lib import files_from_dir
new_version = client.beta.skills.versions.create(
skill_id="skill_01AbCdEfGhIjKlMnOpQrStUv",
files=files_from_dir("/path/to/updated_skill"),
)
# 使用特定版本
response = client.beta.messages.create(
model="claude-opus-4-7",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": new_version.version,
}
]
},
messages=[{"role": "user", "content": "Use updated Skill"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
# 使用最新版本
response = client.beta.messages.create(
model="claude-opus-4-7",
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": "Use latest Skill version"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
import Anthropic from "@anthropic-ai/sdk";
import fs from "fs";
const client = new Anthropic();
// 使用 zip 文件创建新版本
const newVersion = await client.beta.skills.versions.create("skill_01AbCdEfGhIjKlMnOpQrStUv", {
files: [fs.createReadStream("updated_skill.zip")]
});
// 使用特定版本
const specificVersionResponse = await client.beta.messages.create({
model: "claude-opus-4-7",
max_tokens: 4096,
betas: ["code-execution-2025-08-25", "skills-2025-10-02"],
container: {
skills: [
{
type: "custom",
skill_id: "skill_01AbCdEfGhIjKlMnOpQrStUv",
version: newVersion.version
}
]
},
messages: [{ role: "user", content: "Use updated Skill" }],
tools: [{ type: "code_execution_20250825", name: "code_execution" }]
});
// 使用最新版本
const latestVersionResponse = await client.beta.messages.create({
model: "claude-opus-4-7",
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: "Use latest Skill version" }],
tools: [{ type: "code_execution_20250825", name: "code_execution" }]
});
using System;
using System.IO;
using System.Threading.Tasks;
using Anthropic;
using Anthropic.Models.Beta.Messages;
using Anthropic.Models.Beta.Skills;
class Program
{
static async Task Main()
{
var client = new AnthropicClient
{
ApiKey = Environment.GetEnvironmentVariable("ANTHROPIC_API_KEY")
};
// 创建新版本
var versionParams = new SkillVersionCreateParams
{
Files = [File.OpenRead("/path/to/updated_skill/SKILL.md")],
};
var newVersion = await client.Beta.Skills.Versions.Create(
"skill_01AbCdEfGhIjKlMnOpQrStUv",
versionParams
);
// 使用特定版本
var specificVersionParams = new MessageCreateParams
{
Model = "claude-opus-4-7",
MaxTokens = 4096,
Betas = ["code-execution-2025-08-25", "skills-2025-10-02"],
Container = new()
{
Skills =
[
new()
{
Type = "custom",
SkillId = "skill_01AbCdEfGhIjKlMnOpQrStUv",
Version = newVersion.Version
}
]
},
Messages = [new() { Role = Role.User, Content = "Use updated Skill" }],
Tools =
[
new() { Type = "code_execution_20250825", Name = "code_execution" }
]
};
var response = await client.Beta.Messages.Create(specificVersionParams);
Console.WriteLine(response);
// 使用最新版本
var latestVersionParams = new MessageCreateParams
{
Model = "claude-opus-4-7",
MaxTokens = 4096,
Betas = ["code-execution-2025-08-25", "skills-2025-10-02"],
Container = new()
{
Skills =
[
new()
{
Type = "custom",
SkillId = "skill_01AbCdEfGhIjKlMnOpQrStUv",
Version = "latest"
}
]
},
Messages = [new() { Role = Role.User, Content = "Use latest Skill version" }],
Tools =
[
new() { Type = "code_execution_20250825", Name = "code_execution" }
]
};
var latestResponse = await client.Beta.Messages.Create(latestVersionParams);
Console.WriteLine(latestResponse);
}
}
package main
import (
"context"
"fmt"
"io"
"log"
"os"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
// 创建新版本
skillFile := mustOpen("/path/to/updated_skill/SKILL.md")
defer skillFile.Close()
newVersion, err := client.Beta.Skills.Versions.New(
context.TODO(),
"skill_01AbCdEfGhIjKlMnOpQrStUv",
anthropic.BetaSkillVersionNewParams{
Files: []io.Reader{skillFile},
},
)
if err != nil {
log.Fatal(err)
}
// 使用特定版本
response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{"code-execution-2025-08-25", anthropic.AnthropicBetaSkills2025_10_02},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfContainers: &anthropic.BetaContainerParams{
Skills: []anthropic.BetaSkillParams{
{
Type: anthropic.BetaSkillParamsTypeCustom,
SkillID: "skill_01AbCdEfGhIjKlMnOpQrStUv",
Version: anthropic.String(newVersion.Version),
},
},
},
},
Messages: []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Use updated Skill")),
},
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response)
// 使用最新版本
latestResponse, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{"code-execution-2025-08-25", anthropic.AnthropicBetaSkills2025_10_02},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfContainers: &anthropic.BetaContainerParams{
Skills: []anthropic.BetaSkillParams{
{
Type: anthropic.BetaSkillParamsTypeCustom,
SkillID: "skill_01AbCdEfGhIjKlMnOpQrStUv",
Version: anthropic.String("latest"),
},
},
},
},
Messages: []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Use latest Skill version")),
},
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(latestResponse)
}
func mustOpen(path string) *os.File {
f, err := os.Open(path)
if err != nil {
log.Fatal(err)
}
return f
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.messages.MessageCreateParams;
import com.anthropic.models.beta.messages.BetaMessage;
import com.anthropic.models.beta.messages.BetaContainerParams;
import com.anthropic.models.beta.messages.BetaSkillParams;
import com.anthropic.models.beta.messages.BetaCodeExecutionTool20250825;
import com.anthropic.models.beta.skills.versions.VersionCreateParams;
import com.anthropic.models.beta.skills.versions.VersionCreateResponse;
import java.nio.file.Path;
public class SkillVersioning {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
// 创建新版本
VersionCreateParams versionParams = VersionCreateParams.builder()
.addFile(Path.of("/path/to/updated_skill/SKILL.md"))
.build();
VersionCreateResponse newVersion = client.beta().skills().versions()
.create("skill_01AbCdEfGhIjKlMnOpQrStUv", versionParams);
// 使用特定版本
MessageCreateParams specificVersionParams = MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.container(BetaContainerParams.builder()
.addSkill(BetaSkillParams.builder()
.type(BetaSkillParams.Type.CUSTOM)
.skillId("skill_01AbCdEfGhIjKlMnOpQrStUv")
.version(newVersion.version())
.build())
.build())
.addUserMessage("Use updated Skill")
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build();
BetaMessage response = client.beta().messages().create(specificVersionParams);
System.out.println(response);
// 使用最新版本
MessageCreateParams latestVersionParams = MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.container(BetaContainerParams.builder()
.addSkill(BetaSkillParams.builder()
.type(BetaSkillParams.Type.CUSTOM)
.skillId("skill_01AbCdEfGhIjKlMnOpQrStUv")
.version("latest")
.build())
.build())
.addUserMessage("Use latest Skill version")
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build();
BetaMessage latestResponse = client.beta().messages().create(latestVersionParams);
System.out.println(latestResponse);
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
// 创建新版本
$newVersion = $client->beta->skills->versions->create(
skillID: "skill_01AbCdEfGhIjKlMnOpQrStUv",
files: [fopen("/path/to/updated_skill/SKILL.md", "r")],
);
// 使用特定版本
$response = $client->beta->messages->create(
maxTokens: 4096,
messages: [['role' => 'user', 'content' => 'Use updated Skill']],
model: 'claude-opus-4-7',
betas: ['code-execution-2025-08-25', 'skills-2025-10-02'],
container: [
'skills' => [[
'type' => 'custom',
'skill_id' => 'skill_01AbCdEfGhIjKlMnOpQrStUv',
'version' => $newVersion->version
]]
],
tools: [['type' => 'code_execution_20250825', 'name' => 'code_execution']]
);
echo $response;
// 使用最新版本
$latestResponse = $client->beta->messages->create(
maxTokens: 4096,
messages: [['role' => 'user', 'content' => 'Use latest Skill version']],
model: 'claude-opus-4-7',
betas: ['code-execution-2025-08-25', 'skills-2025-10-02'],
container: [
'skills' => [[
'type' => 'custom',
'skill_id' => 'skill_01AbCdEfGhIjKlMnOpQrStUv',
'version' => 'latest'
]]
],
tools: [['type' => 'code_execution_20250825', 'name' => 'code_execution']]
);
echo $latestResponse;
require "anthropic"
client = Anthropic::Client.new
# 创建新版本
new_version = client.beta.skills.versions.create(
"skill_01AbCdEfGhIjKlMnOpQrStUv",
files: [File.open("/path/to/updated_skill/SKILL.md")]
)
# 使用特定版本
response = client.beta.messages.create(
model: "claude-opus-4-7",
max_tokens: 4096,
betas: ["code-execution-2025-08-25", "skills-2025-10-02"],
container: {
skills: [{
type: "custom",
skill_id: "skill_01AbCdEfGhIjKlMnOpQrStUv",
version: new_version.version
}]
},
messages: [{ role: "user", content: "Use updated Skill" }],
tools: [{ type: "code_execution_20250825", name: "code_execution" }]
)
puts response
# 使用最新版本
latest_response = client.beta.messages.create(
model: "claude-opus-4-7",
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: "Use latest Skill version" }],
tools: [{ type: "code_execution_20250825", name: "code_execution" }]
)
puts latest_response
有关完整详情,请参阅创建 Skill 版本 API 参考。
Skills 如何加载
在容器中指定 Skills 时:
- 元数据发现: Claude 在系统提示中看到每个 Skill 的元数据(名称、描述)
- 文件加载: Skill 文件被复制到容器中的
/skills/{directory}/ - 自动使用: Claude 在与您的请求相关时自动加载和使用 Skills
- 组合: 多个 Skills 组合在一起处理复杂工作流
渐进式披露架构确保高效的上下文使用:Claude 仅在需要时加载完整的 Skill 指令。
用例
组织级 Skills
品牌与传播
- 将公司特定的格式(颜色、字体、布局)应用于文档
- 按照组织模板生成传播内容
- 确保所有输出中一致的品牌指南
项目管理
- 使用公司特定的格式(OKR、决策日志)组织笔记
- 按照团队规范生成任务
- 创建标准化的会议回顾和状态更新
业务运营
- 创建公司标准的报告、提案和分析
- 执行公司特定的分析程序
- 按照组织模板生成财务模型
个人 Skills
内容创作
- 自定义文档模板
- 专业格式和样式
- 特定领域的内容生成
数据分析
- 自定义数据处理管道
- 专业可视化模板
- 特定行业的分析方法
开发与自动化
- 代码生成模板
- 测试框架
- 部署工作流
示例:财务建模
Combine Excel and custom DCF analysis Skills:
# 创建自定义 DCF 分析 Skill
DCF_SKILL=$(curl -X POST "https://api.anthropic.com/v1/skills" \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: skills-2025-10-02" \
-F "display_title=DCF Analysis" \
-F "files[]=@dcf_skill/SKILL.md;filename=dcf_skill/SKILL.md")
DCF_SKILL_ID=$(echo "$DCF_SKILL" | jq -r '.id')
# 与 Excel 一起使用创建财务模型
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: code-execution-2025-08-25,skills-2025-10-02" \
-H "content-type: application/json" \
-d "{
\"model\": \"claude-opus-4-7\",
\"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 with the attached financials\"
}],
\"tools\": [{
\"type\": \"code_execution_20250825\",
\"name\": \"code_execution\"
}]
}"
# 创建自定义 DCF 分析 Skill
DCF_SKILL_ID=$(ant beta:skills create \
--display-title "DCF Analysis" \
--file dcf_skill/SKILL.md \
--transform id --raw-output)
# 与 Excel 一起使用创建财务模型
ant beta:messages create \
--beta code-execution-2025-08-25 \
--beta skills-2025-10-02 <<YAML
model: claude-opus-4-7
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 with the attached financials
tools:
- type: code_execution_20250825
name: code_execution
YAML
# 创建自定义 DCF 分析 Skill
from anthropic.lib import files_from_dir
dcf_skill = client.beta.skills.create(
display_title="DCF Analysis",
files=files_from_dir("/path/to/dcf_skill"),
)
# 与 Excel 一起使用创建财务模型
response = client.beta.messages.create(
model="claude-opus-4-7",
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 with the attached financials",
}
],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
print(response)
// 创建自定义 DCF 分析 Skill
import Anthropic, { toFile } from "@anthropic-ai/sdk";
import fs from "fs";
const client = new Anthropic();
const dcfSkill = await client.beta.skills.create({
display_title: "DCF Analysis",
files: [await toFile(fs.createReadStream("dcf_skill.zip"), "skill.zip")]
});
// 与 Excel 一起使用创建财务模型
const response = await client.beta.messages.create({
model: "claude-opus-4-7",
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: dcfSkill.id, version: "latest" }
]
},
messages: [
{
role: "user",
content: "Build a DCF valuation model for a SaaS company with the attached financials"
}
],
tools: [{ type: "code_execution_20250825", name: "code_execution" }]
});
console.log(response);
using System;
using System.Threading.Tasks;
using Anthropic;
using Anthropic.Models.Beta.Messages;
var client = new AnthropicClient();
// 创建自定义 DCF 分析 Skill
var dcfSkill = await client.Beta.Skills.Create(new SkillCreateParams
{
DisplayTitle = "DCF Analysis",
Files = new[]
{
new SkillFileParam
{
Path = "dcf_skill/SKILL.md",
Content = System.IO.File.ReadAllText("dcf_skill/SKILL.md")
}
},
});
// 与 Excel 一起使用创建财务模型
var parameters = new MessageCreateParams
{
Model = Model.ClaudeOpus4_7,
MaxTokens = 4096,
Betas = new[] { "code-execution-2025-08-25", "skills-2025-10-02" },
Container = new BetaContainerParams
{
Skills = new[]
{
new BetaSkillParam
{
Type = "anthropic",
SkillId = "xlsx",
Version = "latest"
},
new BetaSkillParam
{
Type = "custom",
SkillId = dcfSkill.Id,
Version = "latest"
}
}
},
Messages = new[]
{
new BetaMessageParam
{
Role = Role.User,
Content = "Build a DCF valuation model for a SaaS company with the attached financials"
}
},
Tools = new[]
{
new BetaToolParam
{
Type = "code_execution_20250825",
Name = "code_execution"
}
}
};
var message = await client.Beta.Messages.Create(parameters);
Console.WriteLine(message);
package main
import (
"context"
"fmt"
"log"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
// 自定义 DCF 分析 Skill(从 Skills API 创建响应中获取 ID)
dcfSkillID := "skill_01AbCdEfGhIjKlMnOpQrStUv"
// 与 Excel 一起使用创建财务模型
response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{
"code-execution-2025-08-25",
anthropic.AnthropicBetaSkills2025_10_02,
},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfContainers: &anthropic.BetaContainerParams{
Skills: []anthropic.BetaSkillParams{
{
Type: anthropic.BetaSkillParamsTypeAnthropic,
SkillID: "xlsx",
Version: anthropic.String("latest"),
},
{
Type: anthropic.BetaSkillParamsTypeCustom,
SkillID: dcfSkillID,
Version: anthropic.String("latest"),
},
},
},
},
Messages: []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Build a DCF valuation model for a SaaS company with the attached financials")),
},
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response)
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.messages.MessageCreateParams;
import com.anthropic.models.beta.messages.BetaMessage;
import com.anthropic.models.beta.messages.BetaContainerParams;
import com.anthropic.models.beta.messages.BetaSkillParams;
import com.anthropic.models.beta.messages.BetaCodeExecutionTool20250825;
import java.util.List;
public class CustomSkillExample {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
// 自定义 DCF 分析 Skill(从 Skills API 创建响应中获取 ID)
String dcfSkillId = "skill_01AbCdEfGhIjKlMnOpQrStUv";
// Use with Excel Skill to create financial model
MessageCreateParams params = MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.container(BetaContainerParams.builder()
.skills(List.of(
BetaSkillParams.builder()
.type(BetaSkillParams.Type.ANTHROPIC)
.skillId("xlsx")
.version("latest")
.build(),
BetaSkillParams.builder()
.type(BetaSkillParams.Type.CUSTOM)
.skillId(dcfSkillId)
.version("latest")
.build()
))
.build())
.addUserMessage("Build a DCF valuation model for a SaaS company with the attached financials")
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build();
BetaMessage response = client.beta().messages().create(params);
System.out.println(response);
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
// 自定义 DCF 分析 Skill(从 Skills API 创建响应中获取 ID)
$dcfSkillId = "skill_01AbCdEfGhIjKlMnOpQrStUv";
// 与 Excel 一起使用创建财务模型
$message = $client->beta->messages->create(
maxTokens: 4096,
messages: [
['role' => 'user', 'content' => 'Build a DCF valuation model for a SaaS company with the attached financials']
],
model: 'claude-opus-4-7',
betas: ['code-execution-2025-08-25', 'skills-2025-10-02'],
container: [
'skills' => [
['type' => 'anthropic', 'skill_id' => 'xlsx', 'version' => 'latest'],
['type' => 'custom', 'skill_id' => $dcfSkillId, 'version' => 'latest']
]
],
tools: [
['type' => 'code_execution_20250825', 'name' => 'code_execution']
]
);
echo $message;
require "anthropic"
client = Anthropic::Client.new
# 创建自定义 DCF 分析 Skill
dcf_skill = client.beta.skills.create(
display_title: "DCF Analysis",
files: [
File.open("dcf_skill/SKILL.md", "rb")
]
)
# 与 Excel 一起使用创建财务模型
response = client.beta.messages.create(
model: "claude-opus-4-7",
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 with the attached financials" }
],
tools: [{ type: "code_execution_20250825", name: "code_execution" }]
)
puts response
限制和约束
请求限制
- 每个请求最多 Skills 数: 8
- 最大 Skill 上传大小: 30 MB(所有文件合计)
- YAML 前置信息需求:
name:最多 64 个字符,仅限小写字母/数字/连字符,无 XML 标签,无保留字("anthropic"、"claude")description:最多 1024 个字符,非空,无 XML 标签
环境约束
Skills 在代码执行容器中运行,具有以下限制:
- 无网络访问: 无法进行外部 API 调用
- 无运行时包安装: 仅预安装的包可用
- 隔离环境: 容器是隔离的;除非指定现有容器 ID,否则会创建新容器
请参阅代码执行工具获取可用包列表。
最佳实践
何时使用多个 Skills
当任务涉及多个文档类型或领域时组合 Skills:
好的用例:
- 数据分析(Excel)+ 演示文稿创建(PowerPoint)
- 报告生成(Word)+ 导出为 PDF
- 自定义领域逻辑 + 文档生成
避免:
- 包含未使用的 Skills(影响性能)
版本管理策略
生产环境:
# 固定到特定版本以确保稳定性
container = {
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "1759178010641129", # 特定版本
}
]
}
开发环境:
# 使用 latest 进行活跃开发
container = {
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest", # 始终获取最新版本
}
]
}
提示缓存注意事项
使用提示缓存时,请注意更改容器中的 Skills 列表会破坏缓存:
# 第一个请求创建缓存
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: code-execution-2025-08-25,skills-2025-10-02,prompt-caching-2024-07-31" \
-H "content-type: application/json" \
-d '{
"model": "claude-opus-4-7",
"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 会破坏缓存
curl https://api.anthropic.com/v1/messages \
-H "x-api-key: $ANTHROPIC_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "anthropic-beta: code-execution-2025-08-25,skills-2025-10-02,prompt-caching-2024-07-31" \
-H "content-type: application/json" \
-d '{
"model": "claude-opus-4-7",
"max_tokens": 4096,
"container": {
"skills": [
{"type": "anthropic", "skill_id": "xlsx", "version": "latest"},
{"type": "anthropic", "skill_id": "pptx", "version": "latest"}
]
},
"messages": [{"role": "user", "content": "Create a presentation"}],
"tools": [{"type": "code_execution_20250825", "name": "code_execution"}]
}'
# 第一个请求创建缓存
ant beta:messages create \
--beta code-execution-2025-08-25 \
--beta skills-2025-10-02 \
--beta prompt-caching-2024-07-31 <<'YAML'
model: claude-opus-4-7
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
YAML
# 添加/删除 Skills 会破坏缓存
ant beta:messages create \
--beta code-execution-2025-08-25 \
--beta skills-2025-10-02 \
--beta prompt-caching-2024-07-31 <<'YAML'
model: claude-opus-4-7
max_tokens: 4096
container:
skills:
- type: anthropic
skill_id: xlsx
version: latest
- type: anthropic
skill_id: pptx
version: latest
messages:
- role: user
content: Create a presentation
tools:
- type: code_execution_20250825
name: code_execution
YAML
# 第一个请求创建缓存
response1 = client.beta.messages.create(
model="claude-opus-4-7",
max_tokens=4096,
betas=[
"code-execution-2025-08-25",
"skills-2025-10-02",
"prompt-caching-2024-07-31",
],
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-4-7",
max_tokens=4096,
betas=[
"code-execution-2025-08-25",
"skills-2025-10-02",
"prompt-caching-2024-07-31",
],
container={
"skills": [
{"type": "anthropic", "skill_id": "xlsx", "version": "latest"},
{
"type": "anthropic",
"skill_id": "pptx",
"version": "latest",
}, # 缓存未命中
]
},
messages=[{"role": "user", "content": "Create a presentation"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
// 第一个请求创建缓存
const response1 = await client.beta.messages.create({
model: "claude-opus-4-7",
max_tokens: 4096,
betas: ["code-execution-2025-08-25", "skills-2025-10-02", "prompt-caching-2024-07-31"],
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 会破坏缓存
const response2 = await client.beta.messages.create({
model: "claude-opus-4-7",
max_tokens: 4096,
betas: ["code-execution-2025-08-25", "skills-2025-10-02", "prompt-caching-2024-07-31"],
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" }]
});
using System;
using System.Threading.Tasks;
using Anthropic;
using Anthropic.Models.Beta.Messages;
var client = new AnthropicClient();
// 第一个请求创建缓存
var parameters1 = new MessageCreateParams
{
Model = Model.ClaudeOpus4_7,
MaxTokens = 4096,
Betas = new[] { "code-execution-2025-08-25", "skills-2025-10-02", "prompt-caching-2024-07-31" },
Container = new BetaContainer
{
Skills = new[]
{
new BetaSkill { Type = "anthropic", SkillId = "xlsx", Version = "latest" }
}
},
Messages = new[] { new BetaMessageParam { Role = Role.User, Content = "Analyze sales data" } },
Tools = new[] { new BetaTool { Type = "code_execution_20250825", Name = "code_execution" } }
};
var response1 = await client.Beta.Messages.Create(parameters1);
Console.WriteLine(response1);
// 添加/删除 Skills 会破坏缓存
var parameters2 = new MessageCreateParams
{
Model = Model.ClaudeOpus4_7,
MaxTokens = 4096,
Betas = new[] { "code-execution-2025-08-25", "skills-2025-10-02", "prompt-caching-2024-07-31" },
Container = new BetaContainer
{
Skills = new[]
{
new BetaSkill { Type = "anthropic", SkillId = "xlsx", Version = "latest" },
new BetaSkill { Type = "anthropic", SkillId = "pptx", Version = "latest" }
}
},
Messages = new[] { new BetaMessageParam { Role = Role.User, Content = "Create a presentation" } },
Tools = new[] { new BetaTool { Type = "code_execution_20250825", Name = "code_execution" } }
};
var response2 = await client.Beta.Messages.Create(parameters2);
Console.WriteLine(response2);
package main
import (
"context"
"fmt"
"log"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
// 第一个请求创建缓存
response1, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{
"code-execution-2025-08-25",
anthropic.AnthropicBetaSkills2025_10_02,
anthropic.AnthropicBetaPromptCaching2024_07_31,
},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfContainers: &anthropic.BetaContainerParams{
Skills: []anthropic.BetaSkillParams{
{
Type: anthropic.BetaSkillParamsTypeAnthropic,
SkillID: "xlsx",
Version: anthropic.String("latest"),
},
},
},
},
Messages: []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Analyze sales data")),
},
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response1)
// 添加/删除 Skills 会破坏缓存
response2, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{
"code-execution-2025-08-25",
anthropic.AnthropicBetaSkills2025_10_02,
anthropic.AnthropicBetaPromptCaching2024_07_31,
},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfContainers: &anthropic.BetaContainerParams{
Skills: []anthropic.BetaSkillParams{
{
Type: anthropic.BetaSkillParamsTypeAnthropic,
SkillID: "xlsx",
Version: anthropic.String("latest"),
},
{
Type: anthropic.BetaSkillParamsTypeAnthropic,
SkillID: "pptx",
Version: anthropic.String("latest"),
},
},
},
},
Messages: []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Create a presentation")),
},
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response2)
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.messages.MessageCreateParams;
import com.anthropic.models.beta.messages.BetaMessage;
import com.anthropic.models.beta.messages.BetaContainerParams;
import com.anthropic.models.beta.messages.BetaSkillParams;
import com.anthropic.models.beta.messages.BetaCodeExecutionTool20250825;
import java.util.List;
public class SkillsCaching {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
// 第一个请求创建缓存
MessageCreateParams params1 = MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.addBeta("prompt-caching-2024-07-31")
.container(BetaContainerParams.builder()
.skills(List.of(
BetaSkillParams.builder()
.type(BetaSkillParams.Type.ANTHROPIC)
.skillId("xlsx")
.version("latest")
.build()
))
.build())
.addUserMessage("Analyze sales data")
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build();
BetaMessage response1 = client.beta().messages().create(params1);
System.out.println(response1);
// 添加/删除 Skills 会破坏缓存
MessageCreateParams params2 = MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.addBeta("prompt-caching-2024-07-31")
.container(BetaContainerParams.builder()
.skills(List.of(
BetaSkillParams.builder()
.type(BetaSkillParams.Type.ANTHROPIC)
.skillId("xlsx")
.version("latest")
.build(),
BetaSkillParams.builder()
.type(BetaSkillParams.Type.ANTHROPIC)
.skillId("pptx")
.version("latest")
.build()
))
.build())
.addUserMessage("Create a presentation")
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build();
BetaMessage response2 = client.beta().messages().create(params2);
System.out.println(response2);
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
// 第一个请求创建缓存
$response1 = $client->beta->messages->create(
maxTokens: 4096,
messages: [
['role' => 'user', 'content' => 'Analyze sales data']
],
model: 'claude-opus-4-7',
betas: [
'code-execution-2025-08-25',
'skills-2025-10-02',
'prompt-caching-2024-07-31'
],
container: [
'skills' => [
['type' => 'anthropic', 'skill_id' => 'xlsx', 'version' => 'latest']
]
],
tools: [
['type' => 'code_execution_20250825', 'name' => 'code_execution']
]
);
echo $response1;
// 添加/删除 Skills 会破坏缓存
$response2 = $client->beta->messages->create(
maxTokens: 4096,
messages: [
['role' => 'user', 'content' => 'Create a presentation']
],
model: 'claude-opus-4-7',
betas: [
'code-execution-2025-08-25',
'skills-2025-10-02',
'prompt-caching-2024-07-31'
],
container: [
'skills' => [
['type' => 'anthropic', 'skill_id' => 'xlsx', 'version' => 'latest'],
['type' => 'anthropic', 'skill_id' => 'pptx', 'version' => 'latest']
]
],
tools: [
['type' => 'code_execution_20250825', 'name' => 'code_execution']
]
);
echo $response2;
require "anthropic"
client = Anthropic::Client.new
# 第一个请求创建缓存
response1 = client.beta.messages.create(
model: "claude-opus-4-7",
max_tokens: 4096,
betas: [
"code-execution-2025-08-25",
"skills-2025-10-02",
"prompt-caching-2024-07-31"
],
container: {
skills: [{ type: "anthropic", skill_id: "xlsx", version: "latest" }]
},
messages: [{ role: "user", content: "Analyze sales data" }],
tools: [{ type: "code_execution_20250825", name: "code_execution" }]
)
puts response1
# 添加/删除 Skills 会破坏缓存
response2 = client.beta.messages.create(
model: "claude-opus-4-7",
max_tokens: 4096,
betas: [
"code-execution-2025-08-25",
"skills-2025-10-02",
"prompt-caching-2024-07-31"
],
container: {
skills: [
{ type: "anthropic", skill_id: "xlsx", version: "latest" },
{ type: "anthropic", skill_id: "pptx", version: "latest" }
]
},
messages: [{ role: "user", content: "Create a presentation" }],
tools: [{ type: "code_execution_20250825", name: "code_execution" }]
)
puts response2
为了获得最佳缓存性能,请在请求间保持 Skills 列表一致。
错误处理
优雅地处理与 Skill 相关的错误:
if ! RESULT=$(ant beta:messages create \
--beta code-execution-2025-08-25 \
--beta skills-2025-10-02 \
--transform-error error.message --format-error yaml 2>&1 <<'YAML'
model: claude-opus-4-7
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
YAML
); then
case "$RESULT" in
*skill*)
printf 'Skill error: %s\n' "$RESULT"
# 处理特定于 Skill 的错误
;;
*)
printf '%s\n' "$RESULT" >&2
exit 1
;;
esac
fi
import anthropic
client = anthropic.Anthropic()
try:
response = client.beta.messages.create(
model="claude-opus-4-7",
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}")
# 处理特定于 Skill 的错误
else:
raise
try {
const response = await client.beta.messages.create({
model: "claude-opus-4-7",
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" }]
});
console.log(response);
} catch (error) {
if (error instanceof Anthropic.BadRequestError && error.message.includes("skill")) {
console.error(`Skill error: ${error.message}`);
// 处理特定于 Skill 的错误
} else {
throw error;
}
}
using System;
using System.Threading.Tasks;
using Anthropic;
using Anthropic.Models.Beta.Messages;
class Program
{
static async Task Main(string[] args)
{
var client = new AnthropicClient();
try
{
var parameters = new MessageCreateParams
{
Model = "claude-opus-4-7",
MaxTokens = 4096,
Betas = ["code-execution-2025-08-25", "skills-2025-10-02"],
Container = new BetaContainerParams
{
Skills = [
new BetaSkillParam
{
Type = "custom",
SkillId = "skill_01AbCdEfGhIjKlMnOpQrStUv",
Version = "latest"
}
]
},
Messages = [new() { Role = Role.User, Content = "Process data" }],
Tools = [new BetaToolParam { Type = "code_execution_20250825", Name = "code_execution" }]
};
var message = await client.Beta.Messages.Create(parameters);
Console.WriteLine(message);
}
catch (Exception e) when (e.Message.Contains("skill"))
{
Console.WriteLine({{CONTENT}}quot;Skill error: {e.Message}");
}
}
}
package main
import (
"context"
"fmt"
"log"
"strings"
"github.com/anthropics/anthropic-sdk-go"
)
func main() {
client := anthropic.NewClient()
response, err := client.Beta.Messages.New(context.TODO(), anthropic.BetaMessageNewParams{
Model: "claude-opus-4-7",
MaxTokens: 4096,
Betas: []anthropic.AnthropicBeta{"code-execution-2025-08-25", anthropic.AnthropicBetaSkills2025_10_02},
Container: anthropic.BetaMessageNewParamsContainerUnion{
OfContainers: &anthropic.BetaContainerParams{
Skills: []anthropic.BetaSkillParams{
{
Type: anthropic.BetaSkillParamsTypeCustom,
SkillID: "skill_01AbCdEfGhIjKlMnOpQrStUv",
Version: anthropic.String("latest"),
},
},
},
},
Messages: []anthropic.BetaMessageParam{
anthropic.NewBetaUserMessage(anthropic.NewBetaTextBlock("Process data")),
},
Tools: []anthropic.BetaToolUnionParam{
{OfCodeExecutionTool20250825: &anthropic.BetaCodeExecutionTool20250825Param{}},
},
})
if err != nil {
if strings.Contains(err.Error(), "skill") {
fmt.Printf("Skill error: %v\n", err)
} else {
log.Fatal(err)
}
return
}
fmt.Println(response)
}
import com.anthropic.client.AnthropicClient;
import com.anthropic.client.okhttp.AnthropicOkHttpClient;
import com.anthropic.models.beta.messages.MessageCreateParams;
import com.anthropic.models.beta.messages.BetaMessage;
import com.anthropic.models.beta.messages.BetaContainerParams;
import com.anthropic.models.beta.messages.BetaSkillParams;
import com.anthropic.models.beta.messages.BetaCodeExecutionTool20250825;
public class SkillErrorHandling {
public static void main(String[] args) {
AnthropicClient client = AnthropicOkHttpClient.fromEnv();
try {
MessageCreateParams params = MessageCreateParams.builder()
.model("claude-opus-4-7")
.maxTokens(4096L)
.addBeta("code-execution-2025-08-25")
.addBeta("skills-2025-10-02")
.container(BetaContainerParams.builder()
.addSkill(BetaSkillParams.builder()
.type(BetaSkillParams.Type.CUSTOM)
.skillId("skill_01AbCdEfGhIjKlMnOpQrStUv")
.version("latest")
.build())
.build())
.addUserMessage("Process data")
.addTool(BetaCodeExecutionTool20250825.builder().build())
.build();
BetaMessage response = client.beta().messages().create(params);
System.out.println(response);
} catch (Exception e) {
if (e.getMessage().contains("skill")) {
System.err.println("Skill error: " + e.getMessage());
} else {
throw e;
}
}
}
}
<?php
use Anthropic\Client;
$client = new Client(apiKey: getenv("ANTHROPIC_API_KEY"));
try {
$message = $client->beta->messages->create(
maxTokens: 4096,
messages: [
['role' => 'user', 'content' => 'Process data']
],
model: 'claude-opus-4-7',
betas: ['code-execution-2025-08-25', 'skills-2025-10-02'],
container: [
'skills' => [
[
'type' => 'custom',
'skill_id' => 'skill_01AbCdEfGhIjKlMnOpQrStUv',
'version' => 'latest'
]
]
],
tools: [
['type' => 'code_execution_20250825', 'name' => 'code_execution']
]
);
echo $message->content[0]->text;
} catch (Exception $e) {
if (str_contains($e->getMessage(), 'skill')) {
echo "Skill error: " . $e->getMessage();
} else {
throw $e;
}
}
require "anthropic"
client = Anthropic::Client.new
begin
response = client.beta.messages.create(
model: "claude-opus-4-7",
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" }]
)
rescue Anthropic::Errors::BadRequestError => e
if e.message.include?("skill")
puts "Skill error: #{e.message}"
else
raise
end
end
数据保留
Agent Skills 不受 ZDR 安排覆盖。Skill 定义和执行数据根据 Anthropic 的标准数据保留策略进行保留。
有关所有功能的 ZDR 资格,请参阅 API 和数据保留。