指南
技能
用 SKILL.md 告訴 Agent 怎樣完成任務。
技能(Skill)解決的是「讓 Agent 按你的方法做事」:把固定流程、內部規範、專用腳本寫進技能,Agent 在需要時讀取並照做。沿用 Agent Skills 通用的 SKILL.md 格式;平台只讀取開頭的 name 和 description,其他欄位忽略。
什麼時候用技能,什麼時候用別的:
| 需求 | 用什麼 |
|---|---|
| 每一輪都要遵守的角色、語氣、規則 | 會話的 instruction |
| 這一輪要處理的數據 | 訊息的 files |
| 可複用的「怎麼做」:多步流程、帶腳本的處理方法、某個領域的操作手冊 | 技能。每輪只帶名字和一句描述,正文在 Agent 用到時才讀 |
| 查詢或操作你自己的系統 | MCP 伺服器 |
技能的結構
一個技能是一個目錄,SKILL.md 必需,其餘按需:
pdf-tools/
├── SKILL.md 必需:frontmatter + 操作說明
├── scripts/fill.py 可選:說明中讓 Agent 執行的腳本
└── reference.md 可選:較長的參考資料,Agent 需要時才讀被調用時,整個目錄會出現在沙箱的 /workspace/.skills/{skill_id}/ 下,Agent 會被告知這個絕對路徑。所以:
- 說明裡的命令和檔名用相對於技能目錄的路徑寫,例如
python3 scripts/fill.py <輸入> <輸出>,Agent 會補上目錄。 - 腳本在沙箱裡以
bash執行,可用沙箱預裝的 Python、Node.js 等(見沙箱);壓縮包裡的可執行權限會保留。腳本需要額外的包時,在說明裡寫明安裝命令(pip install的包在同一會話裡會保留)。 - 參考資料放在單獨的檔案裡,在
SKILL.md裡說明「什麼情況下去讀哪個檔案」,Agent 需要時用read_file讀取。
SKILL.md 的寫法
SKILL.md 以 YAML frontmatter 開頭,然後是給 Agent 的說明:
---
name: pdf-tools
description: 填寫和合併 PDF 表單。用戶需要處理 PDF 時使用。
---
# PDF 工具
## 填寫表單
1. 先用 `python3 scripts/inspect.py <檔案>` 列出表單欄位。
2. 把用戶給的值整理成 JSON,執行 `python3 scripts/fill.py <輸入> <輸出> <JSON>`。
3. 把輸出檔案用 deliver_file 交付。
## 合併
……
遇到加密的 PDF,先讀 reference.md 的「加密檔案」一節。name:必填,1–64 個小寫字母、數字和連字元,不能以連字元開頭或結尾,也不能連續兩個連字元;在項目內唯一。description:說明這個技能做什麼、什麼時候用。Agent 在決定是否調用一個技能時,只看到名字和描述,所以描述要能讓它判斷「這個任務該不該用它」。未填寫時取正文第一行,正文也沒有時取name;超過 1024 字元的部分會被截掉。- frontmatter 裡只讀取
name和description兩個鍵,且必須是字串;其餘鍵忽略。 - 整個
SKILL.md不超過 32 KiB。被調用時它會整份進入 Agent 的上下文,所以只寫「怎麼做」,把大段資料放進參考檔案。 - 正文建議按步驟寫,每步說明用什麼命令、輸入輸出是什麼、結果要怎麼交付;有分支時寫清判斷條件。寫給一個能讀檔案、能執行命令但不瞭解你業務的助手看。
打包與上載
- 上載技能目錄打成的
.zip(或改了副檔名的.skill),SKILL.md在壓縮包根目錄,或在唯一的頂層目錄裡(從 GitHub 下載的壓縮包就是這種);也可以只上載一個SKILL.md。 - 平台會把它整理成統一的形式(
SKILL.md在根目錄的 zip),去掉 macOS 打包時附帶的__MACOSX/,保留每個檔案的權限位。 - 限制:技能包 50 MiB;解壓後單個檔案 ≤ 25 MiB、總計 ≤ 200 MiB、壓縮包條目(含目錄)≤ 500 個;不能含符號連結、絕對路徑或
..。超限返回413 skill_bundle_too_large,其他問題返回422 invalid_skill_bundle,message說明具體原因。 - 項目內名字唯一,重名返回
409 skill_name_taken。
cd pdf-tools && zip -r ../pdf-tools.zip . && cd ..
curl -s "$AXON_API/skills" -H "Authorization: Bearer $AXON_KEY" -F "file=@pdf-tools.zip"{
"id": "skill_4e9a1c7b2d5f4a6e8c0b3d7f9a2e4c6b",
"name": "pdf-tools",
"description": "填寫和合併 PDF 表單。用戶需要處理 PDF 時使用。",
"size_bytes": 18342,
"created_at": "2026-10-09T03:20:11.512930Z"
}size_bytes 是平台整理後存儲的壓縮包大小。接口細節見上載技能。
在訊息中選用
發送訊息時把技能 ID 放進 skills(每條訊息最多 10 個,需要 skills:read 權限)。技能只對這一輪有效,下一輪需要時再次放進 skills。
curl -s "$AXON_API/sessions/$SESSION/messages" \
-H "Authorization: Bearer $AXON_KEY" -H "Content-Type: application/json" \
-d "{\"content\": \"把 form.pdf 的表單填上附件裡的資訊\", \"files\": [\"$FILE\"], \"skills\": [\"$SKILL\"]}"這一輪裡發生的事:
- 輪次開始時,Agent 拿到本輪可用技能的名字和描述(你選用的,加上平台內置的),並被提醒你選用了哪些。此時不下載任何東西。
- Agent 判斷任務需要某個技能時,調用
use_skill工具:agent.tool_use的name是use_skill,input是{"skill": "pdf-tools"}。平台這時才把技能包放進沙箱(下載、解壓,60 秒內完成),把SKILL.md的內容交給 Agent,agent.tool_result的content為Launching skill: pdf-tools。 - Agent 按說明執行:執行腳本、讀參考檔案、交付結果,這些照常以
bash、read_file、deliver_file等工具的事件出現。 - 同一會話裡已經放進沙箱的技能,下一輪再被調用時直接複用,不再下載;沙箱回收重建後也仍在(
/workspace會保留)。
要注意的幾點:
- 選用是建議,不是命令。 Agent 根據任務和技能描述決定是否調用;只是閒聊的一輪不會調用。想要它一定用某個技能時,在訊息裡明確說「用 pdf-tools 技能處理」。
- 技能放進沙箱失敗(例如技能已被刪除、網絡問題)時,這次
use_skill調用返回錯誤(agent.tool_result的is_error為true),Agent 能看到這個錯誤,輪次不會因此失敗。 - 平台內置的技能所有輪次都可用,不需要選用;與你選用的技能同名時,以你選用的為準。
更新與刪除
技能上載後內容不會變,同一個 ID 在任何一輪裡都是同一份說明。要更新:先刪除舊技能(釋放名字),再上載新版本,新技能有新的 ID;也可以換一個名字上載,再把客戶端改成新 ID。
刪除後:
- 之後的訊息不能再選用它(返回
404 skill_not_found),名字可以給新上載的技能使用; - 已經發出的事件中的
skills保持不變; - 正在執行、已經選用了它的那一輪,如果此時才調用
use_skill,會得到「無法載入」的錯誤。請在沒有輪次在用它時刪除。
排查技能問題
| 現象 | 看什麼 |
|---|---|
| 上載返回 422 | message 說明原因:副檔名不對、找不到 SKILL.md、frontmatter 格式或 name 不合規、SKILL.md 超過 32 KiB、壓縮包含不安全路徑或符號連結等 |
| 上載返回 413 | 技能包或解壓後的大小、條目數超限,message 給出超出的是哪一項 |
| Agent 沒有調用技能 | 事件裡沒有 use_skill。多半是 description 沒有說清「什麼時候用」,或訊息裡的任務與它無關;可以在訊息裡點名 |
use_skill 返回錯誤 | 技能已刪除,或放進沙箱時失敗;查看該 agent.tool_result 的 content |
| 腳本執行失敗 | 查看對應 bash 調用的 agent.tool_result:通常是依賴沒裝、路徑寫成了絕對路徑、或腳本假定了不存在的工具 |