--- name: aliyun-all-in-skill description: 阿里云资源报价与统计工具。支持 ECS 报价查询和 OSS 资源统计、RDS 报价。触发场景:(1) ECS 报价、询价、云产品报价、阿里云报价、ECS 价格查询 (2) 发送 ecs_instance_list_*.csv 文件 (3) RDS 报价、发送 rds_instance_list_*.csv 文件 (4) OSS 统计、OSS 分析、Bucket 统计、对象存储统计 (5) 发送 buckets_*.csv 文件。生成 Excel 后由 AI 通过 openclaw message send 发送到当前对话。 --- # 阿里云资源报价与统计 ## 功能概述 - **ECS 报价**:查询阿里云 ECS 实例价格,生成 Excel 报价单 - **RDS 报价**:查询阿里云 RDS 实例价格(MySQL、SQLServer、PostgreSQL、MariaDB),生成 Excel 报价单 - **OSS 统计**:分析 OSS 资源使用情况,生成统计报告 ## RDS 报价场景判断 AI 需根据输入类型自动判断 RDS 报价场景: | 输入 | 场景 | 说明 | |------|------|------| | `rds_instance_list_<地域>_YYYY 年 MM 月 DD 日 时_分_秒.csv` 文件 | 场景一 | 基于 CSV 文件自动报价 | | 文字配置描述(如 "杭州,4核8G,MySQL 8.0,高可用系列,500GB") | 场景二 | 基于文字描述自动报价 | ### RDS 场景一:标准 CSV 格式(直接报价) 文件名匹配 `rds_instance_list_**_YYYY-MM-DD.csv` 或 `rds_instance_list_**_YYYY 年 MM 月 DD 日.csv` 时,直接报价: ```bash venv/bin/python3 scripts/rds_csv_quoter_auto.py /path/to/file.csv ``` **报价说明:** - 支持 4 种数据库类型:MySQL、SQLServer、PostgreSQL、MariaDB - 自动查询 1 年和 3 年价格 - 自动选择 1 年目录价最高的实例应用"新客首购 6 折优惠"(限 1 次,限 1 件) - 输出 Excel 格式与 ECS 报价单一致 ### RDS 场景二:文字配置报价 用户提供文字描述配置(非 CSV 格式),调用: ```bash venv/bin/python3 scripts/rds_text_quoter.py '<配置文本>' ``` **⚠️ AI 执行指引(必读)**:AI 在调用脚本前,必须先将用户原文格式调整为脚本可正确解析的标准格式。**只做格式调整,不补全任何字段,不更改任何内容**(地域、系列、存储类型等默认值全部由脚本处理)。 #### 标准化步骤 1. **按序号分割** — 识别 `1、` `2.` `3)` 等序号,分割每台实例 2. **提取配置项** — 从原文中提取:引擎+版本、ClassCode(如 `mysql.n2.medium.1`)、CPU+内存(如 `2核4G`)、产品系列、存储类型、存储大小、地域 3. **调整格式** — 将每台实例重组为脚本可解析的标准格式(见下方) 4. **不补全** — 用户没提供的字段不要补,留空即可,脚本会自动处理默认值 #### 标准输入格式 ``` 1、<地域>,,<引擎> <版本>,<系列>,<存储类型>,<存储大小>GB ``` **字段说明:** - 地域:用户提供则保留,未提供则不写(脚本默认杭州) - ClassCode:用户提供则保留(优先级最高),未提供则不写(脚本会按 CPU+内存匹配) - 引擎+版本:用户提供则保留,未提供则不写(脚本默认 MySQL 8.0) - 系列:用户提供则保留,未提供则不写(脚本默认高可用系列) - 存储类型:用户提供则保留,未提供则不写(脚本根据 ClassCode 从 JSON 推导) - 存储大小:用户提供则保留 **注意**:字段之间用中文逗号 `,` 分隔,按序号 `1、2、3、` 开头。 #### 标准化示例 **用户输入(简写/不规范格式):** ``` 1、postgresql 15.0,基础系列,高性能云盘,2核 4G(通用型)50GB 2、引擎:mysql 8.0,产品系列:基础系列,存储类型:ESSD PL1 云盘,实例规格:2核 4GB(单机基础版) mysql.n2.medium.1,存储空间:120GB 3、ESSD PL1 mysql.n2.large.2c 100GB 4、杭州 4核8G 250GB ``` **AI 标准化后传给脚本:** ``` 1、postgresql 15.0,基础系列,高性能云盘,2核 4G 50GB 2、mysql 8.0,mysql.n2.medium.1,基础系列,ESSD PL1 云盘,120GB 3、mysql.n2.large.2c,ESSD PL1 云盘,100GB 4、杭州,4核 8GB,250GB ``` #### 关键规则 ⚠️ **只做格式调整,不补全任何字段**:用户没写的不要帮用户补。例如用户没写地域,不要补"杭州";没写系列,不要补"高可用系列"。所有默认值由脚本处理。 ⚠️ **ClassCode 优先级最高**:用户提供了 ClassCode 必须保留(脚本会精确匹配 rds_series.json)。用户没提供 ClassCode 时保留 CPU+内存信息,由脚本的 CPU+内存匹配逻辑处理。 ⚠️ **存储大小不要误取**:注意区分内存(如 `4GiB`)和存储(如 `50GB`)。存储大小是传给脚本的 `DBInstanceStorage` 参数。 ⚠️ **多条匹配时脚本会要求人工确认**:无 ClassCode + CPU+内存匹配到多条规格时(如 PostgreSQL 2核4G 基础系列对应多个规格),脚本会在 Excel 备注中标红提示「匹配到的规格为:xxx、xxx,请人工确认」,这属于脚本的正常设计。 ⚠️ **存储类型关键词**:脚本可识别 `高性能云盘` `general_essd` `ESSD PL1` `cloud_essd` `高性能本地盘` `local_ssd` 等关键词。用户写了就保留,没写就不写。 **输出格式**:Excel 报价单共 9 列(无实例 ID 列) | A | B | C | D | E | F | G | H | I | |---|---|---|---|---|---|---|---|---| | 产品名称 | 产品描述 | 地域 | 数量 | 1年目录价 | 1年折扣价 | 3年目录价 | 3年折扣价 | 备注 | **输入参数规则:** | 参数 | 规则 | 默认值 | |------|------|--------| | CommodityCode | 固定为 rds | rds | | RegionId | 用户提供地域则用用户的,否则默认杭州 | cn-hangzhou | | Engine | 用户提供数据库类型则用用户的,否则默认 MySQL;不在 MySQL/SQLServer/PostgreSQL/MariaDB 中则不报价 | MySQL | | EngineVersion | 用户提供则用用户的(支持模糊匹配),否则默认引擎最高版本 | MySQL 8.0 / SQLServer 2022 / PG 18.0 / MariaDB 10.6 | | DBInstanceClass | 【优先级最高】提供则精确匹配 references/rds_series.json 中的 ClassCode | 无 | | CPU+内存 | 未提供 ClassCode 时,在 rds_series.json 中按引擎+CPU+内存+系列匹配 | 无 | | Category | 用户提供系列则用用户的,否则默认高可用系列 | HighAvailability | | DBInstanceStorage | 用户提供则用用户的,否则默认 100GB | 100GB | | DBInstanceStorageType | 用户提供则用用户的,ClassCode 路径下未提供时根据 JSON 的 storageType 推导(Local→local_ssd, Cloud→general_essd) | 动态推导 | **规格匹配规则:** 1. **提供 ClassCode**:精确匹配 rds_series.json,校验 Engine、CPU/内存、category(系列)、storageType(存储类型)、ClassGroup(规格族)一致性。用户未提供 storageType 时根据 JSON 的 storageType 自动推导(Local→local_ssd, Cloud→general_essd) 2. **未提供 ClassCode 但提供 CPU+内存**:在 rds_series.json 中按引擎+CPU+内存+系列筛选: - 仅 1 条匹配 → 直接选用 - 2 条匹配 → 优先选非 ARM 架构的;若非 ARM 有 2 条,且去掉字母 `e` 后 ClassCode 相同(如 `pg.n2.2c.1m` 和 `pg.n2e.2c.1m`),则选不带 `e` 的标准版(`pg.n2.2c.1m`);否则要求人工确认 - 3 条及以上 → 要求人工确认 **错误处理:** | 场景 | 备注(红色字体) | |------|------------------| | 不支持的数据库类型 | 该数据库类型暂不支持 | | ClassCode 不存在 | 提供的数据库规格不存在,请检查 | | Engine 冲突 | 该数据库规格和提供的数据库类型冲突,请检查 | | CPU/内存冲突 | 该数据库规格和提供的 CPU/内存配置冲突,请检查 | | 系列冲突 | 该数据库规格和提供的产品系列冲突,请检查 | | 存储类型冲突 | 该数据库规格和提供的存储类型冲突,请检查 | | 规格族冲突 | 该数据库规格和提供的规格族冲突,请检查 | | 集群系列 | 集群系列暂不自动报价,请人工确认 | | 匹配不到规格 | 未找到匹配的规格,请检查配置 | | 无 ClassCode 且无 CPU+内存 | 未提供实例规格或 CPU/内存配置 | | MCP 询价失败 | MCP 询价失败,请检查配置或人工询价 | **默认值规则:** - 地域:杭州 - 数据库类型:MySQL - 数据库版本:引擎对应的最高版本 - 存储:100GB - 存储类型:CPU+内存路径默认高性能云盘;ClassCode 路径根据 JSON 的 storageType 推导(Local→高性能本地盘, Cloud→高性能云盘) - 产品系列:高可用系列 - 集群系列不报价 **SQLServer 特殊处理:** - rds_series.json 中 SQLServer 规格无 category 字段,通过 ClassCode 后缀判断系列 - `.e2` 后缀需结合 EngineVersion 判断:含"集群"/"cluster"为集群系列,否则为高可用系列 - 默认优先高可用系列 **MariaDB 特殊处理:** - 仅支持高可用系列(HighAvailability),不提供其他系列 - 仅支持 ESSD PL1/PL2/PL3 云盘,默认 ESSD PL1(cloud_essd) - 仅支持 10.3 和 10.6 两个版本,其他版本报错 **存储类型参考:** - general_essd:高性能云盘 - local_ssd:高性能本地盘 - cloud_ssd:SSD 云盘 - cloud_essd:ESSD PL1 云盘 - cloud_essd2:ESSD PL2 云盘 - cloud_essd3:ESSD PL3 云盘 ## OSS 统计场景判断 AI 需根据输入类型自动判断 OSS 统计场景: | 输入 | 场景 | 说明 | |------|------|------| | AK + SK | 场景一 | 基于 AK 查询账号 OSS 资源,**含 ECS 快照** | | `buckets_YYYYMMDD.csv` 文件 | 场景二 | 基于 CSV 文件统计,**不含 ECS 快照** | ### OSS 场景一:基于 AK 查询(含 ECS 快照) ```bash venv/bin/python3 scripts/oss_quoter_auto.py ``` ### OSS 场景二:基于 CSV 文件(不含 ECS 快照) 文件名匹配 `buckets_*.csv` 时,使用 CSV 场景: ```bash venv/bin/python3 scripts/oss_csv_quoter_auto.py /path/to/buckets_YYYYMMDD.csv ``` 两种场景共用同一个 Excel 模板(地域、存储类型、冗余类型、实际存储、计费存储),场景二不含 ECS 快照行。 ## ECS 报价 ### 场景一:标准 CSV 格式(直接报价) 文件名匹配 `ecs_instance_list_**_YYYY-MM-DD.csv` 时,直接报价: ```bash venv/bin/python3 scripts/ecs_csv_quoter_auto.py /path/to/file.csv ``` **输出格式**:Excel 报价单共 10 列 | A | B | C | D | E | F | G | H | I | J | |---|---|---|---|---|---|---|---|---|---| | 产品名称 | **实例 ID** | 产品描述 | 地域 | 数量 | 1年目录价 | 1年折扣价 | 3年目录价 | 3年折扣价 | 备注 | - B列"实例 ID"对应 CSV 文件中每行的 A 列(实例 ID) - 从 B 列开始所有数据向右移动一列 ## AI 执行指引(场景二必读) 当用户输入文字描述配置(而非 CSV 文件)时,AI 需要先**标准化**配置文本,再调用脚本。脚本的正则解析依赖标准格式,直接传入用户原文会导致数据丢失。 ### 标准化步骤 1. **识别每台实例** — 按序号分割(1. / 2. / 3. ...) 2. **提取每项配置** — 地域、规格、镜像、系统盘、数据盘、带宽 3. **补全缺失字段** — 用户未明确提供的字段按「默认值规则」补全 4. **统一格式** — 按以下标准格式重组后传给脚本 ### 标准输入格式 ``` 1. <地域> 实例规格:<规格代码> ( vCPU <内存> GiB) 镜像:<镜像名称> 系统盘:<类型> <大小>GiB 数据盘:<类型> <大小>GiB 公网带宽:<计费方式> <大小>Mbps 2. ... ``` **⚠️ 关键规则(必须遵守):** | 用户提供的信息 | AI 标准化格式 | 脚本走哪个场景 | |--------------|-------------|-------------| | 用户明确给了规格代码(如 `ecs.g6.xlarge`) | `实例规格:ecs.g6.xlarge (4 vCPU 8 GiB)` | 场景1(精确匹配) | | 用户给了规格族+核数内存(如 `u1,8核32G`) | `规格族:u1 (8 vCPU 32 GiB)` | 场景2(族内匹配) | | **用户只给了几核几G**(如 `8核32G`) | **`配置:8 vCPU 32 GiB`** | **场景3(优先级自动匹配)** | **绝对禁止:用户只给了几核几G时,AI 自行编造规格代码填入 `实例规格:ecs.xxx`!** 这会导致脚本走场景1并校验一致性,AI 填错了就会报价失败。场景3 的自动匹配优先级是 `u1 > u2i > c9i > g9i > r9i`,由脚本根据 `ecs_series.json` 自动匹配。 ### 标准化示例 **用户输入(简写):** ``` 1、8 核 16G,80G,5Mbps 2、香港,4C8G,数据盘100G,3M ``` **AI 标准化后传给脚本:** ``` 1. 华东1(杭州) 配置:8 vCPU 16 GiB 镜像:公共免费镜像 系统盘:ESSD PL0 80GiB 公网带宽:按固定带宽 5Mbps 2. 中国香港 配置:4 vCPU 8 GiB 镜像:公共免费镜像 系统盘:ESSD PL0 40GiB 数据盘:ESSD PL0 100GiB 公网带宽:按固定带宽 3Mbps ``` ### 关键注意事项 ⚠️ **收费镜像**:Windows 在中国香港及海外地域收费,内地免费。Red Hat / SUSE / Alibaba Cloud Linux 3 Pro 全球收费。遇到收费镜像需告知用户「不报价,需人工确认」。 ⚠️ **地域**:每台实例可独立指定地域。用户未指定时默认杭州(cn-hangzhou)。**不要把某台实例的地域当成全局地域**。 ⚠️ **磁盘**:用户只写大小没写类型 → 默认 ESSD PL0。只写一个大小 → 系统盘。写多个大小 → 最小的为系统盘,其余为数据盘。 ⚠️ **带宽**:用户写了大小但没写计费方式 → ≤20Mbps 默认按固定带宽,≥21Mbps 默认按流量计费。 --- ### 场景二:文本配置(非 CSV 格式的 ECS 报价) 适用场景:用户提供文字描述配置(如几台实例,每台实例的规格、磁盘、带宽等),而非标准 CSV 文件。 AI 按上述「AI 执行指引」标准化配置后,调用: ```bash venv/bin/python3 scripts/ecs_text_quoter.py '<标准化后的配置文本>' ``` **输出格式**:Excel 报价单共 9 列 | A | B | C | D | E | F | G | H | I | |---|---|---|---|---|---|---|---|---| | 产品名称 | 产品描述 | 地域 | 数量 | 1年目录价 | 1年折扣价 | 3年目录价 | 3年折扣价 | 备注 | - 无"实例 ID"列(与场景一不同) #### 默认值规则表 | 配置项 | 默认值 | 判断条件 | |--------|--------|----------| | 地域 | cn-hangzhou(杭州) | 用户未指定时 | | 磁盘类型 | ESSD PL0 | 用户只写了大小,未指定类型 | | 系统盘大小 | 40 GiB | 用户未提供任何磁盘大小 | | 带宽计费方式 | PayByBandwidth(固定带宽) | 用户提供带宽 ≤20Mbps,未说明计费方式 | | 带宽计费方式 | PayByTraffic(按流量计费) | 用户提供带宽 ≥21Mbps,未说明计费方式 | | 镜像 | 公共免费镜像 | 使用 CentOS / Ubuntu / Alibaba Cloud Linux 等免费 OS | #### 规格判断规则 脚本内置 `ecs_spec_validator.py` 从 `references/ecs_series.json` 加载规格数据,自动判断以下三种场景: **场景 1:有标准格式的实例规格名称(ecs.<规格族>.<规格大小>)** - a. 规格不存在 → 不报价,备注红色字体 "该规格不存在" - b. 规格存在: - i. 同时提供了几核几G → 校验规格名称与几核几G 是否匹配:匹配则报价,不匹配则不报价,备注红色字体 "ECS 规格和配置描述不一致" - ii. 没有提供几核几G → 直接按照该规格报价 **场景 2:有规格族但没有标准规格名称** 根据语义检索规格族(如 u1、g8i、c6、g7a 等),大小写不影响(U1 = u1),但必须完全一致(u1 ≠ u2i,c9 ≠ c9i ≠ c9a): - a. 有准确规格族 + 提供了几核几G → 在 `ecs_series.json` 中查找该规格族下是否有对应配置: - i. 有匹配规格 → 按匹配的规格报价 - ii. 无匹配规格 → 不报价,备注红色字体 "没有提供具体的规格要求" - b. 有准确规格族 + 没有几核几G → 不报价,备注红色字体 "缺少配置要求" - c. 规格族不存在 → 不报价,备注红色字体 "该规格" **场景 3:只有几核几G** 按照默认优先级匹配:`u1 > u2i > c9i > g9i > r9i` - 匹配到 → 按匹配的规格报价 - 五个优先级规格族中都不存在 → 不报价,备注红色字体 "没有该规格" #### 系统盘/数据盘规则 - 只提供了大小(如 100GB、100G、100GiB、1T、1TB、1TiB 等)→ 默认按照 **ESSD PL0** 类型报价 - 没有 "系统盘" "数据盘" 关键字时: - 只有一个盘的大小 → 默认为系统盘 - 有多个盘的大小 → 从小到大排列,最小的为系统盘,剩余为数据盘(数据盘1、数据盘2…) #### 带宽规则 - 提供了带宽大小(如 100M、100Mbps 等): - 明确说明了固定带宽或按流量计费 → 按说明的方式报价 - 没有说明计费方式 → **1-20Mbps 默认按固定带宽**,**21Mbps 及以上默认按流量计费** - 没有提供带宽 → 无带宽 #### 镜像规则 免费镜像(Alibaba Cloud Linux、Ubuntu、CentOS、Debian 等)和收费镜像的判断: - **收费镜像**:Red Hat、SUSE、Alibaba Cloud Linux 3 Pro、Windows(在中国香港及海外地域创建) - **免费镜像**:除上述收费镜像外的其他镜像(Windows 在中国内地地域免费) 处理方式: - 免费镜像 → 产品描述中镜像行统一写为 **"公共免费镜像"** - 收费镜像 → 不报价,价格留空,备注红色字体 "涉及收费镜像,请人工确认",产品描述中保留实际镜像名称 ## 执行流程(所有场景通用) | 步骤 | 操作 | 说明 | |------|------|------| | 0 | 输入标准化 | **仅场景二**:AI 先将用户原文标准化为标准格式(见上方「AI 执行指引」) | | 1 | 调用脚本 | 根据场景选择对应脚本 | | 2 | 输出路径 | 脚本输出 `FILE_PATH:xxx.xlsx`,AI 读取此路径 | | 3 | 发送文件 | 钉钉渠道用裸露路径独占一行,其他渠道用 `openclaw message send` CLI(见下方「文件发送⚠️」) | | 4 | 无需清理 | **不要删除文件!** 钉钉连接器异步上传,AI 删得太快会导致上传失败。文件默认长期保留,由用户手动定期清理。 | ## 文件发送 ⚠️ AI 需根据当前会话渠道(通过 inbound context 中的 `channel` 字段判断)选择对应发送方式: | 渠道 | `channel` 值 | 发送方式 | |------|-------------|----------| | 钉钉 | `dingtalk-connector` | 裸露文件路径(独占一行) | | 其他渠道 | feishu / telegram / discord 等 | `openclaw message send` CLI | ### 方式一:钉钉渠道 — 裸露文件路径 在回复中将文件绝对路径**独占一行**,前后无其他字符(包括 `MEDIA:` 前缀): ``` 报价单已生成,请查收。 /root/.openclaw/workspace/download/阿里云资源清单260508-112945.xlsx ``` **注意:** - 路径必须是绝对路径 - 必须独占一行,行首行尾不能有其他字符 - **不能加 `MEDIA:` 前缀**(钉钉连接器通过正则匹配裸露路径,`MEDIA:` 前缀会导致匹配失败) - 支持的扩展名:xlsx, xls, pdf, doc, docx, ppt, pptx, txt, zip, rar, 7z, mp4, mp3 等 - 钉钉连接器会自动识别路径、上传文件并发送,然后从消息中移除路径文本 - **钉钉连接器是异步上传的,AI 绝不要在发送路径后删除文件!** 否则连接器读取时文件已不存在 - 文件默认长期保留,由用户手动定期清理,AI 无需操作 ### 方式二:其他渠道 — CLI 命令 通过 `exec` 工具执行: ```bash openclaw message send --channel feishu --target "user:ou_xxxxx" \ --media "/root/.openclaw/workspace/download/阿里云资源清单260508-112945.xlsx" ``` 根据实际渠道替换 `--channel` 参数(如 `telegram` / `discord` / `feishu` 等)。 ### 完整流程示例 ```bash # 1. 生成报价单 venv/bin/python3 scripts/ecs_csv_quoter_auto.py /path/to/file.csv # 输出 FILE_PATH:/root/.openclaw/workspace/download/阿里云资源清单260508-112945.xlsx # 2. 发送文件 # 钉钉渠道:在回复中将文件路径独占一行发送 # 其他渠道:openclaw message send --channel feishu --target "user:xxx" --media "/path/to/file.xlsx" # 3. 无需清理(钉钉连接器异步上传,AI 不要删文件) ``` ## 文件结构 ``` aliyun-all-in-skill/ ├── SKILL.md # Skill 定义文件 ├── config/ │ └── config.json # MCP + AK 配置 ├── references/ │ └── ecs_series.json # ECS 规格数据 └── scripts/ ├── ecs_csv_quoter_auto.py # ECS 场景一:CSV 自动报价 ├── ecs_text_quoter.py # ECS 场景二:文本报价 ├── rds_csv_quoter_auto.py # RDS 场景一:CSV 自动报价 ├── rds_csv_quoter.py # RDS 报价核心逻辑 ├── rds_excel_generator.py # RDS Excel 生成器 ├── rds_constants.py # RDS 常量定义 ├── oss_quoter_auto.py # OSS 场景一:AK 查询(含快照) ├── oss_csv_quoter_auto.py # OSS 场景二:CSV 统计(不含快照) ├── oss_excel.py # OSS Excel 生成器(共用) ├── oss_stat.py # OSS 分析核心 ├── ecs_quoter.py # ECS 报价统一入口 ├── mcp_client.py # MCP JSON-RPC 客户端 ├── ... # 其他支撑脚本 └── venv/ # Python 虚拟环境 ``` ## 配置要求 `config/config.json` 使用 AK 静态凭证认证。 ```json { "mcp": { "endpoint": "https://openapi-mcp.cn-hangzhou.aliyuncs.com/id/YOUR_ID/mcp" }, "ak": { "access_key_id": "LTAI...", "access_key_secret": "..." } } ``` - AK 凭证**永不过期**(除非手动吊销),无需定期刷新 - mcp-proxy 通过 venv 安装,运行 `setup.sh` 自动安装 - AK 对应的 RAM 用户需授予 `AliyunOpenAPIMCPServerStaticCredentialAccess` 权限 - 获取 AccessKey:[RAM 控制台](https://ram.console.aliyun.com/users) → 用户 → 创建 AccessKey ### 输出目录配置 所有场景生成的文件(ECS 报价单、RDS 报价单、OSS 统计报告等)统一输出到同一目录,通过 `config.json` 的 `output_dir` 字段配置: ```json { "output_dir": "/root/.openclaw/workspace/download/", "mcp": { ... }, ... } ``` - **默认值**:`/root/.openclaw/workspace/download/` - 用户可自行修改为其他路径,脚本会自动创建目录(`os.makedirs(exist_ok=True)`) - 入口脚本读取该配置后通过环境变量 `ALIYUN_SKILL_OUTPUT_DIR` 传递给生成器类 - `FILE_PATH:` 输出和 `openclaw message send --media` 均基于此目录 ### Python 依赖 ```bash cd scripts python3 -m venv venv venv/bin/pip install -r requirements.txt ``` 依赖包: - `openpyxl>=3.1.2` - Excel 生成 - `oss2>=2.19.0` - OSS SDK ## 参考文档 - [阿里云 OpenAPI MCP Server](https://help.aliyun.com/zh/openapi/integrating-openapi-mcp-server-into-agent) - [ECS 实例规格族](https://help.aliyun.com/document_detail/25378.html) - [RDS 产品详情](https://www.aliyun.com/product/rds)