本文介绍如何通过 API 修改 Agent 配置中的 Skill(技能)——即为 Agent 装载与卸载 Skill。
说明:
已通过 CreateApp 创建好应用,并通过 CreateAgent 创建好 Agent——即已拿到
AppId和AgentId。密钥准备与客户端初始化请参考 从零搭建一个 Claw 模式应用 的「前置条件与调用方式」小节。
完整流程:
查看已装载的 Skill → 查询可用 Skill → 修改 Agent 的 SkillList → 发布生效
前置条件(可选):获取 AppId / AgentId
若手头没有 AppId 或 AgentId,可通过以下接口查询。
查应用列表获取 AppId
关键入参:
| 参数 | 必选 | 说明 |
|---|---|---|
| SpaceId | 是 | 空间 ID |
| Query | 否 | 按应用名模糊查询 |
| FilterList.N | 否 | 过滤条件,可按 AppMode(Claw 模式为 4)、AppStatus 精确匹配 |
| PageNumber / PageSize | 否 | 分页(PageSize 最大 100) |
关键出参:
| 参数 | 类型 | 说明 |
|---|---|---|
| AppSummaryList | Array of AppSummary | 应用摘要列表,每项含 AppId、AppMode、Name |
| TotalCount | Integer | 总数 |
req = models.DescribeAppSummaryListRequest()
req.SpaceId = space_id
resp = client.DescribeAppSummaryList(req)
app_id = resp.AppSummaryList[0].AppId
查 Agent 列表获取 AgentId
关键入参:
| 参数 | 必选 | 说明 |
|---|---|---|
| Scope | 否 | 0 单应用查询(默认);1 跨应用查询 |
| AppId | 否 | Scope=0 时必填,目标应用 ID |
| FilterList.N | 否 | 过滤条件 |
| PageNumber / PageSize | 否 | 分页 |
关键出参:
| 参数 | 类型 | 说明 |
|---|---|---|
| AgentList | Array of AgentSummary | Agent 摘要列表;Profile.Role=0 为主 Agent,1 为子 Agent |
| TotalCount | Integer | 总数 |
req = models.DescribeAgentSummaryListRequest()
req.Scope = 0
req.AppId = app_id
resp = client.DescribeAgentSummaryList(req)
# 取主 Agent(Role=0)
agent_id = next(a.AgentId for a in resp.AgentList if a.Profile.Role == 0)
步骤 1:查看已装载的 Skill
调用 DescribeAgentDetail 获取 Agent 当前配置,从 SkillList 中确认已装载哪些 Skill。由于步骤 3 提交的 SkillList 为全量覆盖,本步获取的列表是后续增删的基准。
关键入参:
| 参数 | 必选 | 说明 |
|---|---|---|
| AppId | 否 | 应用 ID |
| AgentId | 否 | 目标 Agent ID |
关键出参:
| 参数 | 类型 | 说明 |
|---|---|---|
| Agent | AgentDetail | Agent 完整配置,其中 SkillList 为已装载的 Skill |
AgentDetail.SkillList 中每项(AgentSkill)的字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| SkillId | String | Skill ID |
| Name | String | Skill 名称 |
| DisplayName | String | Skill 展示名称 |
| Description | String | Skill 描述 |
| CurrentVersion | String | Skill 版本 |
| SourceType | Integer | Skill 来源 |
req = models.DescribeAgentDetailRequest()
req.AppId = app_id
req.AgentId = agent_id
resp = client.DescribeAgentDetail(req)
# 记录当前已装载的 SkillId,作为增删基准
current_skill_ids = [s.SkillId for s in resp.Agent.SkillList]
for s in resp.Agent.SkillList:
print(s.SkillId, s.Name, s.DisplayName, s.CurrentVersion)
步骤 2:查询可用 Skill
调用 DescribeSkillSummaryList 拉取空间内可用的 Skill 列表,取得目标 Skill 的 SkillId。
关键入参:
| 参数 | 必选 | 说明 |
|---|---|---|
| SpaceId | 是 | 空间 ID |
| Query | 否 | 按名称 / 展示名称模糊搜索 |
| FavoriteOnly | 否 | 仅查询当前用户收藏的 Skill |
| FilterList.N | 否 | 过滤条件,支持 SkillIdList、ProviderType、CategoryKey、SkillStatus、RiskLevel 等 |
| PageNumber / PageSize | 否 | 分页,页码从 0 开始,PageSize 最大 100 |
ProviderType(提供方类型)枚举值:
| 值 | 含义 |
|---|---|
| 1 | 官方 |
| 2 | 第三方 |
| 3 | 自定义 |
| 4 | 自定义企业级共享 |
关键出参:
| 参数 | 类型 | 说明 |
|---|---|---|
| SkillSummaryList | Array of SkillSummary | Skill 摘要列表 |
| TotalCount | Integer | 总数量 |
SkillSummary 中的常用字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| SkillId | String | Skill ID,装载时使用 |
| Profile | SkillProfile | 基础信息,含 Name、DisplayName、Description、Creator |
| ClassificationInfo | SkillClassification | 分类信息,含 CategoryKey、ProviderType、BillingType |
| CurrentVersionInfo | SkillVersion | 当前版本信息,含 Version、VersionId、安全检测结果 |
| IsFavorite | Boolean | 当前用户是否收藏 |
req = models.DescribeSkillSummaryListRequest()
req.SpaceId = space_id
req.Query = "数据分析"
req.PageNumber = 0
req.PageSize = 20
# 只看官方 Skill
f = models.Filter()
f.Name = "ProviderType"
f.ValueList = ["1"]
req.FilterList = [f]
resp = client.DescribeSkillSummaryList(req)
skill = resp.SkillSummaryList[0]
skill_id = skill.SkillId
print(skill_id, skill.Profile.DisplayName, skill.CurrentVersionInfo.Version)
说明: 若需按分类筛选,可先调用 DescribeSkillCategoryList(无需入参)获取全部分类,再将
CategoryKey填入FilterList。
req = models.DescribeSkillCategoryListRequest()
resp = client.DescribeSkillCategoryList(req)
for c in resp.CategoryList:
print(c.CategoryKey, c.CategoryName) # 例:doc 文档
(可选)查看 Skill 详情
装载前若需确认 Skill 的版本列表、调用情况或安全检测结果,可调用 DescribeSkillDetail:
关键入参:
| 参数 | 必选 | 说明 |
|---|---|---|
| SkillId | 是 | Skill ID |
| SpaceId | 是 | 空间 ID |
| VersionFilterList.N | 否 | 版本过滤条件,Perspective 取 USER(仅已上线版本)/ EDITOR / ALL |
关键出参:
| 参数 | 类型 | 说明 |
|---|---|---|
| SkillDetail | SkillDetail | Skill 详情,含 SkillSummary、VersionList、ReferenceSummaryList |
req = models.DescribeSkillDetailRequest()
req.SkillId = skill_id
req.SpaceId = space_id
resp = client.DescribeSkillDetail(req)
print(resp.SkillDetail.SkillSummary.Profile.DisplayName)
步骤 3:修改 Agent 的 SkillList
调用 ModifyAgent,提交更新后的 SkillList,并通过 UpdateMask.Paths 指定只更新 SkillList 字段。
关键入参:
| 参数 | 必选 | 说明 |
|---|---|---|
| AppId | 否 | 应用 ID |
| AgentId | 否 | 目标 Agent ID |
| Agent | 否 | AgentSpec,此处只需填 SkillList |
| UpdateMask | 否 | FieldMask,取值 ["SkillList"] |
AgentSkillConfig 字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| SkillId | String | 技能 ID,取自步骤 2 |
关键出参:
| 参数 | 类型 | 说明 |
|---|---|---|
| RequestId | String | 唯一请求 ID |
SkillList 为全量覆盖(非增量),三种操作都通过提交完整列表实现:
| 操作 | 提交内容 |
|---|---|
| 装载 Skill | 已有 SkillId + 新增 SkillId |
| 卸载 Skill | 已有 SkillId 中移除目标项 |
| 清空全部 | 空数组 [] |
# 在步骤 1 获取的 current_skill_ids 基础上追加新 Skill
target_skill_ids = current_skill_ids + [skill_id]
# 如需卸载:target_skill_ids = [i for i in current_skill_ids if i != skill_id]
skill_list = []
for sid in target_skill_ids:
s = models.AgentSkillConfig()
s.SkillId = sid
skill_list.append(s)
req = models.ModifyAgentRequest()
req.AppId = app_id
req.AgentId = agent_id
req.Agent = models.AgentSpec()
req.Agent.SkillList = skill_list
req.UpdateMask = models.FieldMask()
req.UpdateMask.Paths = ["SkillList"] # 只更新 SkillList 字段
client.ModifyAgent(req)
注意:
UpdateMask.Paths决定哪些字段被更新。只传["SkillList"]时,Agent 的指令、模型、工具等配置不受影响。
步骤 4:发布应用使配置生效
Agent 配置修改后不会立即对线上用户生效,需调用 CreateRelease 发布,并用 DescribeReleaseSummary 轮询发布状态。
发布状态枚举值:
| 值 | 状态 |
|---|---|
| 1 | 发布中 |
| 2 | 排队中 |
| 3 | 发布成功 |
| 4 | 发布失败 |
import time
req = models.CreateReleaseRequest()
req.AppId = app_id
req.Description = "装载数据分析 Skill"
release_id = client.CreateRelease(req).ReleaseId
while True:
req = models.DescribeReleaseSummaryRequest()
req.AppId = app_id
req.ReleaseId = release_id
status = client.DescribeReleaseSummary(req).ReleaseSummary.Status
if status == 3:
print("发布成功")
break
if status == 4:
print("发布失败")
break
time.sleep(2)
说明: Claw 模式下若开启了「允许在对话中动态修改配置」,可为每个用户复制独立的用户级 Agent 并在运行时装卸 Skill,无需重新发布。详见 动态修改 Agent 配置(Claw 模式)。
全流程接口一览
| 步骤 | 接口 |
|---|---|
| 获取 AppId / AgentId(可选) | DescribeAppSummaryList(查询已有应用) + DescribeAgentSummaryList(查询应用下 Agent) |
| 查看已装载 Skill | DescribeAgentDetail(返回 Agent.SkillList) |
| 查询可用 Skill | DescribeSkillSummaryList + DescribeSkillCategoryList(按分类筛选) + DescribeSkillDetail(查看详情) |
| 装载 / 卸载 Skill | ModifyAgent(UpdateMask.Paths=["SkillList"]) |
| 发布应用 | CreateRelease + DescribeReleaseSummary(轮询状态) |