Was this page helpful?
Agent Skills 透過組織化的指令、腳本和資源資料夾來擴展 Claude 的能力。本指南將向您展示如何透過 Claude API 使用預建和自訂的 Skills。
如需完整的 API 參考資料,包括請求/回應結構描述和所有參數,請參閱:
此功能不符合零資料保留(Zero Data Retention,ZDR)的資格。資料將依據該功能的標準保留政策進行保留。
如需深入了解 Agent Skills 的架構和實際應用,請閱讀工程部落格文章:Equipping agents for the real world with Agent Skills。
Skills 透過程式碼執行工具與 Messages API 整合。無論是使用由 Anthropic 管理的預建 Skills,還是您自行上傳的自訂 Skills,整合方式都完全相同:兩者都需要程式碼執行,並使用相同的 container 結構。
無論來源為何,Skills 在 Messages API 中的整合方式都相同。您在 container 參數中指定 Skills,包含 skill_id、type 和選用的 version,它們會在程式碼執行環境中執行。
您可以使用來自兩種來源的 Skills:
| 面向 | Anthropic Skills | 自訂 Skills |
|---|---|---|
| Type 值 | anthropic | custom |
| Skill ID | 簡短名稱:pptx、xlsx、docx、pdf | 自動產生:skill_01AbCdEfGhIjKlMnOpQrStUv |
| 版本格式 | 基於日期:20251013 或 latest | Epoch 時間戳記:1759178010641129 或 latest |
| 管理方式 |
兩種 Skill 來源都會由 List Skills 端點回傳(使用 source 參數進行篩選)。整合方式和執行環境完全相同,唯一的差異在於 Skills 的來源以及管理方式。
若要使用 Skills,您需要:
code-execution-2025-08-25 - 啟用程式碼執行(Skills 必需)skills-2025-10-02 - 啟用 Skills APIfiles-api-2025-04-14 - 用於上傳/下載檔案至容器或從容器下載Skills 是透過 Messages API 中的 container 參數來指定。每個請求最多可包含 8 個 Skills。
Anthropic 和自訂 Skills 的結構完全相同。指定必要的 type 和 skill_id,並可選擇性地包含 version 以固定至特定版本:
當 Skills 建立文件(Excel、PowerPoint、PDF、Word)時,會在回應中回傳 file_id 屬性。您必須使用 Files API 來下載這些檔案。
運作方式:
file_id範例:建立並下載 Excel 檔案
其他 Files API 操作:
如需 Files API 的完整詳細資訊,請參閱 Files API 文件。
透過指定容器 ID,在多個訊息之間重複使用相同的容器:
Skills 可能會執行需要多個回合的操作。請處理 pause_turn 停止原因:
回應可能包含 pause_turn 停止原因,這表示 API 暫停了長時間執行的 Skill 操作。您可以在後續請求中原樣提供該回應,讓 Claude 繼續其回合;或者如果您希望中斷對話並提供額外指引,也可以修改內容。
在單一請求中結合多個 Skills 以處理複雜的工作流程:
Skill 套件是一個目錄,其頂層包含一個具有 name 和 description YAML frontmatter 的 SKILL.md 檔案,以及任何支援的腳本或資源。請參閱在 API 中開始使用 Agent Skills 來撰寫一個 Skill,並參閱範例後方的需求清單以了解完整的限制條件。
上傳您的自訂 Skill 以使其在您的工作區中可用。您可以上傳 zip 壓縮檔或個別的檔案物件;Python SDK 另外提供了一個 files_from_dir 輔助函式,可接受目錄路徑。
需求:
name:最多 64 個字元,僅限小寫字母/數字/連字號,不得包含 XML 標籤,不得使用保留字(「anthropic」、「claude」)description:最多 1024 個字元,不得為空,不得包含 XML 標籤如需完整的請求/回應結構描述,請參閱 Create Skill API 參考。
擷取您工作區中所有可用的 Skills,包括 Anthropic 預建的 Skills 和您的自訂 Skills。使用 source 參數依 Skill 類型進行篩選:
請參閱 List Skills API 參考以了解分頁和篩選選項。
取得特定 Skill 的詳細資訊:
若要刪除 Skill,您必須先刪除其所有版本:
嘗試刪除仍有現存版本的 Skill 會回傳 400 錯誤。
Skills 支援版本管理,以安全地管理更新:
Anthropic Skills:
20251013自訂 Skills:
1759178010641129"latest" 以始終取得最新版本請參閱 Create Skill Version API 參考以取得完整詳細資訊。
當您在容器中指定 Skills 時:
/skills/{directory}/ 位置漸進式揭露架構確保有效率地使用上下文:Claude 僅在需要時才載入完整的 Skill 指令。
品牌與溝通
專案管理
業務營運
內容創作
資料分析
開發與自動化
結合 Excel 和自訂 DCF 分析 Skills:
name:最多 64 個字元,僅限小寫字母/數字/連字號,不得包含 XML 標籤,不得使用保留字(「anthropic」、「claude」)description:最多 1024 個字元,不得為空,不得包含 XML 標籤Skills 在程式碼執行容器中執行,具有以下限制:
請參閱程式碼執行工具以了解可用的套件。
當任務涉及多種文件類型或領域時,請結合使用 Skills:
適合的使用案例:
應避免:
用於正式環境:
# 固定至特定版本以確保穩定性
container = {
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "1759178010641129", # Specific version
}
]
}用於開發環境:
# 在積極開發時使用 latest
container = {
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest", # Always get newest
}
]
}使用提示快取時,請注意變更容器中的 Skills 清單會使快取失效:
為獲得最佳的快取效能,請在各個請求之間保持 Skills 清單一致。
妥善處理與 Skill 相關的錯誤:
Agent Skills 不在 ZDR 協議的涵蓋範圍內。Skill 定義和執行資料會依照 Anthropic 的標準資料保留政策進行保留。
如需了解所有功能的 ZDR 適用性,請參閱 API 與資料保留。
| 由 Anthropic 預建和維護 |
| 透過 Skills API 上傳和管理 |
| 可用性 | 所有使用者皆可使用 | 僅限您的工作區私有使用 |
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-opus-4-8",
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"}],
)client = anthropic.Anthropic()
# 步驟 1:使用 Skill 建立檔案
response = client.beta.messages.create(
model="claude-opus-4-8",
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"Downloaded: {file_metadata.filename}")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)# 第一個請求會建立容器
response1 = client.beta.messages.create(
model="claude-opus-4-8",
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-8",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"id": response1.container.id, # Reuse container
"skills": [{"type": "anthropic", "skill_id": "xlsx", "version": "latest"}],
},
messages=messages,
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)messages = [{"role": "user", "content": "Process this large dataset"}]
max_retries = 10
response = client.beta.messages.create(
model="claude-opus-4-8",
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-8",
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"}],
)response = client.beta.messages.create(
model="claude-opus-4-8",
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"}],
)# 選項 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# 列出所有 Skills
ant beta:skills list
# 僅列出自訂 Skills
ant beta:skills list --source customant beta:skills retrieve \
--skill-id skill_01AbCdEfGhIjKlMnOpQrStUv# 步驟 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# 建立新版本
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-8
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-8
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# 建立自訂 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-8",
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)# 第一個請求會建立快取
response1 = client.beta.messages.create(
model="claude-opus-4-8",
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-8",
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"}],
)client = anthropic.Anthropic()
try:
response = client.beta.messages.create(
model="claude-opus-4-8",
max_tokens=4096,
betas=["code-execution-2025-08-25", "skills-2025-10-02"],
container={
"skills": [
{
"type": "custom",
"skill_id": "skill_01AbCdEfGhIjKlMnOpQrStUv",
"version": "latest",
}
]
},
messages=[{"role": "user", "content": "Process data"}],
tools=[{"type": "code_execution_20250825", "name": "code_execution"}],
)
except anthropic.BadRequestError as e:
if "skill" in str(e):
print(f"Skill error: {e}")
# 處理技能特定的錯誤
else:
raise