完整的 RESTful API 文档,用于管理 Agent Skills 的生命周期。
- Base URL:
http://localhost:8080/api/agent-skills/manage - Content-Type:
application/json(除文件上传外)
上传压缩包来部署或更新一个技能。
POST /api/agent-skills/manage/upload
Content-Type: multipart/form-data请求参数:
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
file |
File | ✓ | ZIP 格式的技能包 |
skillName |
String | ✗ | 自定义技能名(如不提供则从描述文件中提取) |
示例请求:
curl -X POST http://localhost:8080/api/agent-skills/manage/upload \
-F "file=@demo-calculator-skill.zip" \
-F "skillName=my-calculator"成功响应 (200):
{
"success": true,
"skillName": "my-calculator",
"message": "Skill deployed successfully"
}失败响应 (400):
{
"success": false,
"message": "Cannot find skill descriptor in uploaded file"
}完全删除一个技能及其所有文件。
DELETE /api/agent-skills/manage/{skillName}示例请求:
curl -X DELETE http://localhost:8080/api/agent-skills/manage/my-calculator成功响应 (200):
{
"success": true,
"message": "Skill deleted successfully"
}从磁盘重新加载技能配置(用于手动触发更新)。
POST /api/agent-skills/manage/{skillName}/reload示例请求:
curl -X POST http://localhost:8080/api/agent-skills/manage/my-calculator/reload成功响应 (200):
{
"success": true,
"skillName": "my-calculator",
"message": "Skill reloaded successfully"
}将技能打包为 ZIP 文件下载。
GET /api/agent-skills/manage/{skillName}/export示例请求:
curl -O -J http://localhost:8080/api/agent-skills/manage/my-calculator/export
# 将下载 my-calculator.zip 文件成功响应:
- Content-Type:
application/octet-stream - Content-Disposition:
attachment; filename="my-calculator.zip" - Body: ZIP 文件二进制数据
获取技能目录中的所有文件和子目录。
GET /api/agent-skills/manage/{skillName}/files示例请求:
curl http://localhost:8080/api/agent-skills/manage/my-calculator/files成功响应 (200):
{
"success": true,
"skillName": "my-calculator",
"files": [
{
"path": "README.md",
"isDirectory": false,
"size": 3124,
"lastModified": 1704067200000
},
{
"path": "examples",
"isDirectory": true,
"size": 0,
"lastModified": 1704067200000
},
{
"path": "examples/example-usage.md",
"isDirectory": false,
"size": 545,
"lastModified": 1704067200000
},
{
"path": "skill.json",
"isDirectory": false,
"size": 1273,
"lastModified": 1704067200000
}
]
}获取指定文件的文本内容。
GET /api/agent-skills/manage/{skillName}/files/{filePath}示例请求:
# 读取根目录文件
curl http://localhost:8080/api/agent-skills/manage/my-calculator/files/skill.json
# 读取子目录文件
curl http://localhost:8080/api/agent-skills/manage/my-calculator/files/examples/example-usage.md成功响应 (200):
{
"success": true,
"skillName": "my-calculator",
"path": "skill.json",
"content": "{\n \"name\": \"demo-calculator-skill\",\n ...\n}"
}错误响应:
404: 技能或文件不存在400: 非法文件路径(路径遍历攻击防护)500: 读取失败
更新或创建文件。
PUT /api/agent-skills/manage/{skillName}/files/{filePath}
Content-Type: application/json请求体:
{
"content": "文件内容字符串"
}示例请求:
curl -X PUT http://localhost:8080/api/agent-skills/manage/my-calculator/files/README.md \
-H "Content-Type: application/json" \
-d '{
"content": "# Updated README\n\nNew content here..."
}'成功响应 (200):
{
"success": true,
"message": "File saved successfully",
"skillName": "my-calculator",
"path": "README.md"
}提示: 如果文件不存在会自动创建,父目录也会自动创建。
删除指定的文件或目录。
DELETE /api/agent-skills/manage/{skillName}/files/{filePath}示例请求:
# 删除文件
curl -X DELETE http://localhost:8080/api/agent-skills/manage/my-calculator/files/temp.txt
# 删除目录(递归删除)
curl -X DELETE http://localhost:8080/api/agent-skills/manage/my-calculator/files/old-examples成功响应 (200):
{
"success": true,
"message": "File deleted successfully",
"skillName": "my-calculator",
"path": "temp.txt"
}GET /api/agent-skills/namesGET /api/agent-skills/{skillName}可选查询参数:
revealScripts(boolean, 默认false):当设置为true时,接口会返回技能描述文件中由加载器披露的脚本内容(disclosedScripts)。默认不返回以保护敏感信息。
示例(不披露脚本,默认):
curl http://localhost:8080/api/agent-skills/my-new-skill示例(披露脚本内容):
curl "http://localhost:8080/api/agent-skills/my-new-skill?revealScripts=true"成功响应(当 revealScripts=true 且存在 disclosedScripts):
{
"name": "my-new-skill",
"description": "My custom skill",
"version": "1.0.0",
"requiredParameters": {},
"optionalParameters": {},
"instructions": "You are a helpful assistant...",
"disclosedScripts": {
"scripts/hello.py": {
"content": "#!/usr/bin/python\nprint('hello')\n",
"truncated": false,
"size": 42
},
"install/setup.sh": {
"content": "#!/bin/sh\n# ... long script truncated ...",
"truncated": true,
"size": 12345
}
}
}说明:disclosedScripts 的值是一个以相对路径为键的对象,值为包含 content(文本或被截断的文本)、truncated(布尔)和 size(字节数)字段的对象。加载器会基于配置 agent.skill.max-skill-md-size-kb 对脚本内容进行截断,默认不会在 API 中返回这些内容,必须显式请求。
GET /api/agent-skills/allPOST /api/agent-skills/execute/{skillName}
Content-Type: application/json
{
"parameters": {
"key": "value"
}
}根据请求内容查找能够处理的技能。
POST /api/agent-skills/find
Content-Type: application/json
{
"request": "用户请求文本"
}创建文件夹结构:
my-new-skill/
├── skill.json # 技能配置
└── README.md # 说明文档
skill.json:
{
"name": "my-new-skill",
"version": "1.0.0",
"description": "My custom skill",
"enabled": true,
"instructions": "You are a helpful assistant..."
}# Windows PowerShell
Compress-Archive -Path my-new-skill/* -DestinationPath my-new-skill.zip
# Linux/Mac
zip -r my-new-skill.zip my-new-skill/curl -X POST http://localhost:8080/api/agent-skills/manage/upload \
-F "file=@my-new-skill.zip"# 查看技能列表
curl http://localhost:8080/api/agent-skills/names
# 获取技能详情
curl http://localhost:8080/api/agent-skills/my-new-skill# 查看文件列表
curl http://localhost:8080/api/agent-skills/manage/my-new-skill/files
# 读取配置文件
curl http://localhost:8080/api/agent-skills/manage/my-new-skill/files/skill.json
# 修改配置
curl -X PUT http://localhost:8080/api/agent-skills/manage/my-new-skill/files/skill.json \
-H "Content-Type: application/json" \
-d '{
"content": "{\n \"name\": \"my-new-skill\",\n \"version\": \"1.1.0\",\n ...\n}"
}'
# 热加载会自动触发,无需手动重载!curl -O -J http://localhost:8080/api/agent-skills/manage/my-new-skill/export- 所有文件路径都经过安全检查,防止路径遍历攻击
- 无法通过
../等方式访问技能目录之外的文件
- 通过 API 更新文件后,系统会自动触发重载
- 如需手动控制,可以调用
/reload接口
支持的描述文件(按优先级):
skill.json- JSON 格式skill.yaml/skill.yml- YAML 格式SKILL.md- Markdown 格式 (agentskills.io 规范)
ZIP 结构支持两种方式:
# 方式 1: 直接包含技能文件
skill.zip
├── skill.json
└── README.md
# 方式 2: 包含父文件夹(更常见)
skill.zip
└── my-skill/
├── skill.json
└── README.md
所有 API 返回统一的响应格式:
{
"success": boolean,
"message": "操作结果描述",
// 其他字段...
}HTTP 状态码:
200 OK- 操作成功400 Bad Request- 请求参数错误404 Not Found- 技能或文件不存在500 Internal Server Error- 服务器内部错误
import requests
base_url = "http://localhost:8080/api/agent-skills/manage"
# 部署技能
with open("my-skill.zip", "rb") as f:
files = {"file": ("my-skill.zip", f, "application/zip")}
response = requests.post(f"{base_url}/upload", files=files)
print(response.json())
# 读取文件
response = requests.get(f"{base_url}/my-skill/files/skill.json")
data = response.json()
print(data["content"])
# 更新文件
response = requests.put(
f"{base_url}/my-skill/files/README.md",
json={"content": "# New Content"}
)
print(response.json())const FormData = require('form-data');
const fs = require('fs');
const axios = require('axios');
const baseUrl = 'http://localhost:8080/api/agent-skills/manage';
// 部署技能
async function deploySkill() {
const form = new FormData();
form.append('file', fs.createReadStream('my-skill.zip'));
const response = await axios.post(`${baseUrl}/upload`, form, {
headers: form.getHeaders()
});
console.log(response.data);
}
// 读取并更新文件
async function updateFile() {
// 读取
const { data } = await axios.get(
`${baseUrl}/my-skill/files/skill.json`
);
console.log(data.content);
// 更新
await axios.put(
`${baseUrl}/my-skill/files/skill.json`,
{ content: '{"name": "my-skill", "version": "2.0.0"}' }
);
}- 示例技能包:
demo-calculator-skill.zip - 示例技能源码:
demo-skill-example/目录 - 技能格式规范: agentskills.io
如有问题,请检查:
- 服务是否已启动
- ZIP 文件格式是否正确
- 技能描述文件是否存在且格式正确