/api/v1/skills 接口用于向 OpenViking 导入一个技能(Skill)。技能是描述 Agent 能力的结构化文档,定义了 Agent 可执行的操作、触发条件和所需工具。导入后,技能将被解析并建立索引,供 Agent 在推理时检索和调用。
技能数据支持三种传入方式:通过
data直接传入内容(字符串或结构化对象),或通过temp_file_id引用已上传的 SKILL.md 文件(或包含 SKILL.md 的 ZIP 包)。
完成 API 鉴权说明 页面的 API Key 获取后,可调用本接口导入技能。如需上传本地 SKILL.md 文件,请先调用 /api/v1/resources/temp_upload 获取 temp_file_id。
URI | /api/v1/skills | 统一资源标识符 |
|---|---|---|
请求方法 | POST | 客户端对服务器请求的操作类型 |
请求头 | Content-Type: application/json | 请求消息类型 |
Authorization: Bearer {api_key} | 鉴权 | |
X-OpenViking-Agent: {agent_id} | Agent ID |
参数 | 类型 | 必选 | 默认值 | 备注 |
|---|---|---|---|---|
data | string / object | 条件必选 | -- | 技能内容或结构化技能数据
|
temp_file_id | string | 条件必选 | -- | 临时文件 ID |
wait | bool | 否 | false | 是否等待处理完成 |
timeout | float | 否 | null | 等待超时时间(秒) |
telemetry | bool / object | 否 | false | 是否返回调用统计信息 |
技能结构化对象(data 为 object 时)字段说明:
字段 | 类型 | 说明 |
|---|---|---|
name | string | 技能名称,唯一标识该技能,同名技能导入时会覆盖已有版本 |
description | string | 技能描述,用于向量索引和检索 |
instruction | string | 技能执行指令,描述 Agent 应如何执行该技能 |
allowed_tools | list | 允许使用的工具列表 |
tags | list | 标签列表,用于分类和过滤 |
字段 | 参数说明 |
|---|---|
status | 请求状态,成功为 |
result | 成功时返回的数据对象 |
result.status | 处理状态,成功为 |
result.uri | 技能的 URI,格式为 |
result.root_uri | 技能的正式访问地址,与 |
result.name | 导入的技能名称 |
result.auxiliary_files | 随技能一同导入的辅助文件数量(仅 ZIP 包导入时可能大于 0) |
result.queue_status | 后台处理进度,包含 |
result.queue_status.*.processed | 该阶段已处理的条目数 |
result.queue_status.*.error_count | 该阶段处理失败的条目数 |
result.queue_status.*.errors | 错误详情列表 |
error | 失败时返回的错误对象 |
error.code | 错误码字符串,常见值见下表 |
error.message | 可读的错误描述 |
telemetry | 调用统计信息,例如接口耗时(仅当请求参数 |
常见错误码:
error.code | 说明 |
|---|---|
UNAUTHENTICATED | 缺少 API Key 或 API Key 无效 |
PERMISSION_DENIED | API Key 权限不足 |
INVALID_ARGUMENT | 参数错误,例如 |
PROCESSING_ERROR | 技能解析或索引处理失败,例如 SKILL.md 格式不正确 |
curl -X POST https://xxx/api/v1/skills \ -H "Authorization: Bearer {api_key}" \ -H "X-OpenViking-Agent: {agent_id}" \ -H "Content-Type: application/json" \ -d '{ "data": { "name": "search-and-summarize", "description": "搜索指定主题的资料并生成摘要", "instruction": "根据用户提供的关键词,检索相关资源,提取关键信息,生成结构化摘要报告。", "allowed_tools": ["search", "summarize"], "tags": ["search", "summary"] }, "wait": true }'
执行成功返回:
HTTP/1.1 200 OK Content-Type: application/json { "status": "ok", "result": { "status": "success", "root_uri": "viking://agent/{agent_id}/skills/search-and-summarize", "uri": "viking://agent/{agent_id}/skills/search-and-summarize", "name": "search-and-summarize", "auxiliary_files": 0, "queue_status": { "Semantic": { "processed": 0, "requeue_count": 0, "error_count": 0, "errors": [] }, "Embedding": { "processed": 1, "requeue_count": 0, "error_count": 0, "errors": [] } } } }
# 第一步:上传 SKILL.md curl -X POST https://xxx/api/v1/resources/temp_upload \ -H "Authorization: Bearer {api_key}" \ -H "X-OpenViking-Agent: {agent_id}" \ -F "file=@SKILL.md" # 返回:{"status":"ok","result":{"temp_file_id":"upload_def456.md"}} # 第二步:导入技能 curl -X POST https://xxx/api/v1/skills \ -H "Authorization: Bearer {api_key}" \ -H "X-OpenViking-Agent: {agent_id}" \ -H "Content-Type: application/json" \ -d '{ "temp_file_id": "upload_def456.md", "wait": true }'
执行成功返回:
HTTP/1.1 200 OK Content-Type: application/json { "status": "ok", "result": { "uri": "viking://agent/{agent_id}/skills/my-skill", "root_uri": "viking://agent/{agent_id}/skills/my-skill", "name": "my-skill", "auxiliary_files": 0 } }
执行失败返回(技能解析失败):
HTTP/1.1 500 Internal Server Error Content-Type: application/json { "status": "error", "error": { "code": "PROCESSING_ERROR", "message": "Skill parse error: SKILL.md not found in uploaded archive" } }
curl -X POST https://xxx/api/v1/skills \ -H "Authorization: Bearer {api_key}" \ -H "X-OpenViking-Agent: {agent_id}" \ -H "Content-Type: application/json" \ -d '{ "data": "---\nname: code-review\ndescription: 对代码进行审查并提出改进建议\n---\n\n## 执行步骤\n\n1. 读取代码文件\n2. 分析代码结构和潜在问题\n3. 生成审查报告", "wait": false }'
执行成功返回:
HTTP/1.1 200 OK Content-Type: application/json { "status": "ok", "result": { "uri": "viking://agent/{agent_id}/skills/code-review", "root_uri": "viking://agent/{agent_id}/skills/code-review", "name": "code-review", "auxiliary_files": 0 } }