详细分析 ▾
运行时依赖
版本
阿里云PAI工作区管理技能初始发布。 - 在阿里云PAI平台创建、查询、列举工作区。 - 对所有输出中的敏感信息(用户ID、名称、管理员账号)实施严格脱敏。 - 强制使用单管道命令 `| jq -r` 查询或列举工作区;绝不显示或记录原始API输出。 - 运行任何命令前均需确认所有用户可自定义参数。 - 提供凭据设置、权限要求及API输出安全处理的清晰指引。 - 通过与ram-permission-diagnose技能集成,为权限被拒错误提供排查流程。
安装命令
点击复制技能文档
在阿里云人工智能平台(PAI)上创建、查询和列出工作空间。 工作空间是用于 AI 模型训练、数据处理等任务的独立管理单元。
架构:PAI AIWorkSpace(工作空间) 工作空间模式:
- 简单模式:仅生产环境(
prod) - 标准模式:开发(
dev)+ 生产(prod)环境
安装
前置检查:需要 Aliyun CLI >= 3.3.1
运行aliyun version确认版本 >= 3.3.1。如未安装或版本过低,
请参考references/cli-installation-guide.md进行安装。
然后【必须】执行aliyun configure set --auto-plugin-install true以启用自动插件安装。
aliyun version
aliyun configure set --auto-plugin-install true
凭证校验
前置检查:需要阿里云凭证
安全规则:
- 禁止 读取、回显或打印 AK/SK 值(例如echo $ALIBABA_CLOUD_ACCESS_KEY_ID是禁止的)
- 禁止 在对话或命令行中直接要求用户输入 AK/SK
- 禁止 使用aliyun configure set并直接写入明文凭证值
- 仅允许 使用aliyun configure list检查凭证状态
敏感数据脱敏:
- 以下 API 响应字段包含个人身份信息,必须在展示前脱敏:
-Owner.UserId/Creator— 仅显示后 4 位,如*1234
-Owner.UserKp— 永不显示,直接省略
-Owner.UserName/Owner.DisplayName— 仅显示首字符 +,如z
-AdminNames中的账号 — 脱敏为u@example.com格式
- 【必须】原始敏感数据不得出现在 stdout、执行日志、磁盘或对话中:执行框架会将所有命令 stdout 记录到执行日志/抄本(如ran-scripts/executed-actions.log)。因此,任何get-workspace或list-workspaces的执行(即使不带--verbose)都必须包含| jq -r管道过滤 —— 因为Creator字段始终返回且敏感。不允许出现任何中间步骤将原始 API JSON 输出到命令行。| jq -r必须是单条管道命令的一部分:
基础查询(不带--verbose):> aliyun aiworkspace get-workspace --workspace-id --region \
--user-agent AlibabaCloud-Agent-Skills \
| jq -r '"Workspace: \(.WorkspaceName) (ID: \(.WorkspaceId))
Status: \(.Status)
Environment: \(.EnvTypes | join(", "))
Created: \(.GmtCreateTime)
Creator ID: \(.Creator // "" | if length > 0 then "*" + .[-4:] else "N/A" end)"'
详细查询(带--verbose true):> aliyun aiworkspace get-workspace --workspace-id --verbose true --region \
--user-agent AlibabaCloud-Agent-Skills \
| jq -r '"Workspace: \(.WorkspaceName) (ID: \(.WorkspaceId))
Status: \(.Status)
Owner: \(.Owner.UserName // "" | if length > 0 then .[0:1] + "" else "N/A" end) (ID: \(.Owner.UserId // "" | if length > 0 then "*" + .[-4:] else "N/A" end))
Creator ID: \(.Creator // "" | if length > 0 then "" + .[-4:] else "N/A" end)
Administrators: \(.AdminNames // [] | map(.[0:1] + "") | join(", "))"'
原始 API 响应仅在管道内部流转,永不进入 shell stdout。只有jq的输出(已脱敏且使用自然语言键)被框架捕获。以下行为全部禁止:
- 不带| jq管道直接执行 CLI 命令 —— 即使基础查询也返回敏感Creator
- 两步处理 —— 先执行 CLI 获取原始输出,再单独脱敏。原始 JSON 会在脱敏前被记录到执行抄本
- 将原始输出捕获到变量 —— 如response=$(aliyun ...)再echo "$response" | jq ...。变量赋值会把原始数据写入日志
- 输出重定向(> file.json、>> file.log、| tee file)
- 通过磁盘脚本执行命令(如ran-scripts/.sh)
- 在任何脚本或代码文件中嵌入原始 API 响应数据 —— 例如编写 Python/shell 脚本时,将原始 JSON 作为字符串字面量、变量或数据结构(如ran_scripts/process_workspace_data.py)。所有数据处理必须完全在| jq -r管道内完成;不得创建包含原始数据的中间处理脚本
- 在对话中展示原始 JSON 片段
- 【必须】禁止使用原始 API 字段名作为输出键:即使值已脱敏,也禁止在任何输出(对话或文件)中使用原始字段名(如UserId、UserName、UserKp、AdminNames)作为 JSON 键或结构化输出键。应改用自然语言键:
-UserId/Creator→Owner ID或Creator ID
-UserName→Username
-DisplayName→Display Name
-AdminNames→Administrators
正确做法:任何get-workspace或list-workspaces的执行必须是带| jq -r的单条管道命令。Agent 绝不得先执行 CLI 再分步处理 —— 原始 JSON 会在脱敏前被记录。所有提取、脱敏、格式化必须在同一管道的jq过滤器内完成。如需保存到文件,在管道末尾用> file.md重定向jq 输出(而非 CLI 输出)。该规则适用于所有查询:基础、详细、列表。
aliyun configure list
检查输出中是否存在有效 profile(AK、STS 或 OAuth 身份)。
若无有效 profile,请在此停止。
1. 前往阿里云控制台获取凭证
2. 在会话外配置凭证(终端执行aliyun configure或在 shell 配置文件里设置环境变量)
3. 返回并重新执行,直到aliyun configure list显示有效 profile
RAM 权限
请参考 references/ram-policies.md 获取所需权限(含 Policy JSON 及操作说明)。
【必须】权限失败处理: 任何时候因权限错误导致命令或 API 调用失败,按以下流程处理:
1. 读取references/ram-policies.md获取本 SKILL 所需的全部权限列表
2. 使用ram-permission-diagnose技能引导用户申请所需权限
3. 暂停并等待用户确认权限已授予后再继续
参数确认
重要:参数确认 —— 在执行任何命令或 API 调用前,
所有用户可自定义参数(如 RegionId、WorkspaceName、Description、EnvTypes 等)
必须经用户确认。不得假设或使用默认值。
| 参数 | 必选/可选 | 说明 | 示例 |
|---|---|---|---|
--region | 必选 | 地域 ID(全局参数),必须由用户指定,禁止使用默认值 | cn-hangzhou |
--workspace-name | 必选 | 工作空间名称:3-23 字符,以字母开头,可含字母、数字、下划线,区域内唯一 | myworkspace |
--description | 必选 | 工作空间描述,最多 80 字符 | My AI workspace |
--env-types | 必选 | 环境类型(列表格式):简单模式填 prod,标准模式填 dev prod | prod |
--display-name | 可选 | 显示名称,默认同 WorkspaceName | My Workspace |
--resource-group-id | 可选 | 资源组 ID,不填则使用默认资源组 | rg-xxxxxxxx |
注意:--resource-group-id 一旦设置,后续无法通过 CLI/代码修改。如需变更,请使用控制台或重建工作空间。超时配置
API 调用支持超时配置(单位:秒):
方案一:命令行参数(仅对当前命令生效):
--connect-timeout <秒>—— 连接超时--read-timeout <秒>—— 读取超时
方案二:持久化配置(写入当前 profile,全局生效):
aliyun configure set --connect-timeout 10 --read-timeout 30
命令行参数优先于持久化配置。未设置时使用内置默认值。
遇到timeout或context deadline exceeded错误时,请增大--read-timeout(如 30-60 秒)。
核心流程
详见 references/related-commands.md 获取所有 CLI 命令模板及参数详情。前置:选择地域并检查 PAI 开通状态
【必须】不得使用默认地域:Agent 不得假设或使用默认地域,必须明确询问用户。
【必须】首次使用某地域时检查 PAI 开通状态:用户指定地域(或会话首次使用该地域)后,Agent 必须先调用list-products检查该地域是否已开通 PAI,再继续后续工作空间操作。
步骤 1:确认地域
询问用户要使用哪个地域。若用户未指定,请提供常见地域列表供选择(见references/related-commands.md 中的常见地域 ID 表)。不得自动选择默认地域。步骤 2:检查 PAI 开通状态
使用aliyun aiworkspace list-products 检查用户指定地域是否已开通 PAI 及依赖产品:aliyun aiworkspace list-products \
--region \
--product-codes PAI_share \
--verbose true \
--user-agent AlibabaCloud-Agent-Skills
步骤 3:处理检查结果
检查返回的Products 数组中对应产品条目:决策逻辑:
1.IsPurchased == true→ PAI 已开通,继续后续流程
2.IsPurchased == false→ PAI 未开通,引导用户开通:
- 查看HasPermissionToPurchase字段:
-true→ 用户有权限,展示PurchaseUrl链接并提示用户前往控制台完成开通
-false→ 用户无权限(需主账号或具备pai:CreateOrder权限的 RAM 用户),请用户联系主账号管理员
- 不得在 PAI 未开通时继续创建/查询工作空间
流程 1:创建工作空间(CreateWorkspace)
使用 aliyun aiworkspace create-workspace 创建工作空间。
必填参数:--region、--workspace-name、--description、--env-types。
简单模式传 --env-types prod,标准模式传 --env-types dev prod。
可选参数:--display-name、--resource-group-id。
步骤 1:输入参数校验
【必须】参数格式校验:调用 API 前,Agent 必须按以下规则校验用户输入。若校验失败,请提示用户修正,不得提交不合规参数:
| 参数 | 校验规则 | 示例 |
|---|---|---|
--workspace-name | 3-23 字符,必须以字母开头,仅允许字母、数字、下划线(_)。不允许连字符(-)、空格、汉字及其他符号 | my_workspace_01 |
--description | 最多 80 字符,含特殊字符时请用引号包裹 | "My AI workspace" |
--env-types | 只能为 prod 或 dev prod,列表格式 | prod |
--display-name | 可选,无严格格式限制 | My Workspace |
步骤 2:名称唯一性检查(check-then-act 幂等模式)
【必须】幂等保证:CreateWorkspace API 不支持 ClientToken,因此采用 check-then-act 模式确保幂等。创建前必须调用 list-workspaces --option CheckWorkspaceExists --workspace-name 检查名称是否已存在。决策逻辑:
-TotalCount == 0→ 名称可用,进入步骤 3 创建
-TotalCount >= 1→ 名称已存在,执行以下操作:
1. 从返回的Workspaces[0]提取已有WorkspaceId
2. 调用get-workspace --workspace-id获取完整信息
3. 比对现有工作空间关键参数(EnvTypes、Description等)与当前请求参数
4. 匹配 → 视为已创建,直接返回已有WorkspaceId,不再重复创建
5. 不匹配 → 告知用户名称已被占用且配置不同,请换名
步骤 3:执行创建
参数校验通过且名称不存在后,执行create-workspace 命令。成功后将返回 WorkspaceId。
若因并发场景返回 WorkspaceNameAlreadyExists 错误,按步骤 2 中 TotalCount >= 1 的逻辑处理。流程 2:查询工作空间详情(GetWorkspace)
【必须】单工作空间查询必须使用get-workspace:查询单个工作空间详情时,必须使用aliyun aiworkspace get-workspace --workspace-id。不得用list-workspaces --workspace-ids替代。get-workspace调用 GetWorkspace API,返回单个工作空间的完整信息。仅接受--workspace-id(必填)与--verbose(可选)。地域通过全局--region指定。Status为ENABLED表示工作空间就绪。
【必须】--verbose true触发规则:--verbose true会返回 Owner(UserKp、UserId、UserName、DisplayName)及 AdminNames(管理员账号列表)。Agent 须遵守以下规则:
1. 触发条件 —— 当用户请求包含以下关键词时,构造命令必须追加--verbose true(在调用前判定,不依赖 API 结果):
- 中文关键词:所有者、拥有者、创建者、管理员、负责人、归属
- 英文关键词:owner、admin、administrator、verbose
- 字段名:Owner、AdminNames
2. 不触发时 —— 用户仅查询基础信息(状态、环境类型等)时,不追加--verbose
3. 脱敏规则 —— UserId/Creator:仅后 4 位(1234);UserKp:直接省略;UserName/DisplayName:仅首字符(z);AdminNames 条目:u@example.com
4. 不得在任何地方输出原始敏感数据 —— 任何get-workspace(无论是否--verbose)或list-workspaces的执行必须是带| jq -r的单条管道命令。Agent 绝不得先执行 CLI 再分步脱敏 —— 原始 JSON 会被记录。禁止两步处理、禁止变量捕获(response=$(aliyun ...))、禁止中间脚本。所有脱敏必须在同一管道的jq过滤器内完成。详见“敏感数据脱敏”节及references/related-commands.md模板
【必须】404 错误处理:当get-workspace返回StatusCode: 404, Code: 100400027, Message: Workspace not exists时,表示该工作空间 ID 不存在。Agent 必须直接向用户报告工作空间不存在,并附带用户最初提供的 workspace-id。不得回退到list-workspaces或其他 API 去“查找”工作空间。不得静默忽略该错误。若用户随后提供新的 workspace-id,Agent 必须使用与初次调用相同参数(含--verbose true等)重新执行get-workspace。
流程 3:列出工作空间(ListWorkspaces)
使用 aliyun aiworkspace list-workspaces 列出工作空间。支持以下过滤与排序参数:
--workspace-name—— 按名称模糊匹配--workspace-ids—— 按 ID 列表批量查询,逗号分隔(例:--workspace-ids "123,456,789")--status—— 按状态过滤,枚举值(全大写):ENABLED|INITIALIZING|FAILURE|DISABLED|FROZEN|UPDATING--sort-by—— 排序字段(区分大小写):GmtCreateTime(默认)|GmtModifiedTime--order—— 排序方向(全大写):ASC(默认)|DESC--page-number/--page-size—— 分页参数--option GetResourceLimits—— 获取资源额度信息(而非工作空间列表)--option CheckWorkspaceExists—— 检查指定名称的工作空间是否已存在(创建前检查,需配合--workspace-name)
【必须】API 选择规则:查询单个 ID 用get-workspace --workspace-id(GetWorkspace API);查询多个 ID(≥2)用list-workspaces --workspace-ids "id1,id2,..."一次性批量查询(ListWorkspaces API)。不得对每个 ID 单独调用get-workspace。
【必须】批量查询结果即为最终信息:list-workspaces --workspace-ids返回的Workspaces数组已包含每个工作空间的完整信息(Status、EnvTypes、GmtCreateTime 等)。不得对批量结果中的任何 ID 再调用get-workspace获取详情。若某些 ID 未出现在响应中,即表示这些 ID 不存在 —— 直接向用户说明。
【必须】枚举值区分大小写:--sort-by必须为GmtCreateTime或GmtModifiedTime(驼峰),--order必须为ASC或DESC(全大写),--status必须为全大写如ENABLED。大小写错误(如desc、gmtCreateTime、enabled)会导致 API 报错或结果异常。
【必须】ListWorkspaces 敏感字段脱敏:list-workspaces返回的每个工作空间对象始终包含Creator(创建者用户 ID)和AdminNames(管理员账号列表)——无需--verbose true。Agent 必须在展示时脱敏(Creator:仅后 4 位;AdminNames:首字符 +)。不得输出含原始值的 JSON,也不得通过重定向(> file)或脚本保存原始响应。
成功验证
| 验证目标 | 方法 | 成功标准 |
|---|---|---|
| 返回 WorkspaceId | 解析 create 命令响应 | WorkspaceId 非空 |
| 工作空间状态正常 | get-workspace 命令 | Status == "ENABLED" |
| 控制台可见 | 登录 PAI 控制台 手动确认 | 列表中出现新工作空间 |
详见 references/verification-method.md 了解详细验证方法清理(删除工作空间)
警告:删除工作空间是不可逆操作,会清空其内所有资源,请谨慎操作。
注意:工作空间无法直接通过 CLI 删除(aiworkspace插件暂不支持delete-workspace)。请使用以下方式:
1. 控制台删除:登录 PAI 控制台 -> 工作空间列表 -> 选择工作空间 -> 删除
2. API 调用:使用DELETE /api/v1/workspaces/{WorkspaceId}端点(通过 SDK 或直接 HTTP 请求)
最佳实践
- 命名规范:WorkspaceName 使用项目名或团队标识前缀,如
nlp_prod、cv_dev(注意:不支持连字符,请用下划线) - 环境选择:生产项目请使用标准模式(
dev+prod),以便隔离开发与生产资源 - 描述信息:描述应说明用途、团队或项目,方便管理
- 地域选择:选择与数据存储最近的地域,降低数据传输延迟
- 资源组管理:多项目场景使用不同资源组,便于成本分摊与权限管理
- DisplayName:使用业务友好名称作为显示名,WorkspaceName 保持英文标识
参考文档
| 文档 | 说明 |
|---|---|
| references/ram-policies.md | RAM 权限策略、Policy JSON 及操作说明 |
| references/related-commands.md | 完整 CLI 命令模板、参数表、枚举值及返回字段 |
| references/verification-method.md | 验证步骤与脚本 |
| references/acceptance-criteria.md | CLI 命令正误示例 |
| references/cli-installation-guide.md | Aliyun CLI 安装与配置 |
| ListWorkspaces API Doc | ListWorkspaces API 参考 |
| CreateWorkspace API Doc | CreateWorkspace API 参考 |
| GetWorkspace API Doc | GetWorkspace API 参考 |
| ListProducts API Doc | ListProducts API 参考(产品开通状态检查) |