Install
openclaw skills install @1688aiinfra/1688-item-batch-opt-apply1688商品批量优化应用 用户需要对一批商品或素材进行批量优化并应用到商品时使用本技能;上游技能(商品诊断一键优化、店铺体检行动项)交接出批量任务清单时同样进入本技能; 本技能是批量编排层:任务解析与确认(任意输入由主 Agent 结构化后统一入台账,当前主路径 ask_user 表单确认)、逐任务委托执行技能(1688-item-image-agent / 1688-item-title-optimizer 等)、逐任务落账(台账为唯一数据源)、执行结果展示与 Excel 产物导出(非交互式 present_files)、以及按 item_id 粒度的批量应用确认(当前逐任务单卡,batch-apply 单卡上线后升级); 本技能不直接生图、不直接写商品:生图与写入分别由执行技能与 MCP App 卡片组件完成; 触发词:批量优化、批量处理、批量修图、批量换背景、批量白底图、批量生成主图、批量标题优化、把这些商品都优化一下、全部应用、批量应用到商品、一键应用到商品、批量融合、多图融合、图片合成、任务确认
openclaw skills install @1688aiinfra/1688-item-batch-opt-apply本技能是批量编排层,覆盖钉钉需求《批量优化和应用技术拆解》的三段链路: 任务解析及确认 → 执行结果展示 → 应用到商品。
batch-apply。本技能 CLI 与主 Agent 均不直接写商品。1688-item-batch-opt-apply/tasks.json(当前工作目录下与本技能同名的目录内,
与其他技能的产物目录隔离);未落账的结果不会出现在展示与导出中。
每处理一个任务必须落账一次,不做内存累积。applyParams、store_ref 等内部字段仅作
透传参数,禁止在面向用户的回复、进度、总结或错误说明中复述或展示。1688-seller-assistant 插件分发;读取插件内技能时携带对应 plugin_id。
单独安装测试时按宿主提供的技能来源读取。复用宿主 AW 登录态,无自有 AK/Token 配置。用户提出「批量优化这些商品」「把这批素材都处理成白底图」「诊断结果全部应用」等批量诉求时, 本技能把任务结构化进台账、ask_user 表单确认、分批并行委托执行技能(每批 ≤5 任务)、 实时展示进度并导出 Excel 产物,用户看过完整方案并要求应用后才进入应用环节(当前逐任务单卡确认, batch-apply 单卡组件上线后升级为一次勾选批量写入)。
| 阶段 | 完成条件与下一步 |
|---|---|
| 任务确认(规则3) | 用户勾选要生成方案的任务;仅授权生成,不代表确认写入商品。 |
| 方案生成与展示(规则4、5) | 生成、落账、导出并展示完整方案;告知尚未应用,等待用户点击「应用」或明确要求应用。 |
| CPV 核对(规则6) | 收到应用意图后查询并核对;无须澄清则继续应用,需要澄清则暂停受影响商品的写入。 |
| 商品应用与回执(规则6) | 无须澄清的任务沿已授权通道应用;需要澄清的任务重新处理并展示终案,弹卡取得二次确认后应用。根据实际写入回执报告结果。 |
status=success 只表示方案生成成功,apply_status=applied 才表示商品应用成功。
方案生成进度 100% 或 Excel 已导出不代表商品已更新。用户未要求应用时,停在方案交付阶段
等待是正常流程,不自动推进 CPV 查询或写入;无须澄清的任务不额外增加二次确认,
现有应用组件自身的确认要求仍保留。无商品 ID 的素材任务交付产物后结束,不进入应用环节。
统一入口:python3 "{baseDir}/cli.py" <command> [options],所有命令输出 JSON:
{"success": bool, "markdown": str, "data": {...}}。
{baseDir} 为本 Skill 的根目录(cli.py 所在目录),按以下规则解析:
{baseDir} 绝对路径。
单独安装测试时同样使用宿主给出的实际 Skill 目录,不固定为账户级或 Agent 级目录。{baseDir} 未解析,可使用宿主提供的
PHOENIX_PLUGIN_ROOT_1688_SELLER_ASSISTANT 拼接 skills/1688-item-batch-opt-apply 兜底。
执行前确认该目录存在 cli.py,读取的 SKILL.md 与执行的 CLI 须来自同一份安装;
路径仍不确定时检查宿主提供的技能路径,不猜测其他账户或 Agent 的目录。{baseDir} 解析成完整绝对路径,并始终给整个脚本路径加引号;路径含空格或
中文时也必须作为一个参数传入。\ 续行、export 或 VAR=value command。python3;确认 python 可用后才替换命令名,不安装系统 Python。--json-file "<绝对路径>":先把卡片参数 JSON 写入系统临时
目录唯一命名的 UTF-8 文件,再单独、直接执行 accio-mcp-cli call ... --json-file "<绝对路径>"。| 命令 | 说明 | 示例 |
|---|---|---|
parse_tasks | 解析主 Agent 已结构化的任务进台账并出确认参数(可选 --store_name 记店铺名入台账,用于产物文件名前缀) | cli.py parse_tasks --tasks '[...]' --store_name "<店铺展示名>" |
query_offer_prop | 按模型匹配词查询实际属性(每次 ≤20 商品) | cli.py query_offer_prop --items_file "<JSON文件>" |
save_result | 单任务执行/应用结果落账(每任务必调) | cli.py save_result --task_id T001 --status success --result_summary "..." |
build_result_card | 汇总台账生成结果展示参数(Markdown 进度/升级卡) | cli.py build_result_card |
export_results | 导出 Excel 产物(openpyxl 缺失时 csv 兜底) | cli.py export_results |
build_apply_card | 合并单条目应用参数生成批量应用卡(升级路径) | cli.py build_apply_card --items '[...]' |
详细参数、返回结构与展示规范见
capabilities/<命令名>.md;任务条目字段、op 映射、 状态机与主循环口径见 references/task-contract.md; 当前主路径(ask_user 表单 / Markdown / 逐任务单卡)与升级路径三卡契约见 references/interaction-specs.md。
任何输入(口述、上游交接、Excel/任意文件、素材文件夹)都由主 Agent 自行读取理解
后结构化为标准任务数组,再统一调用 parse_tasks --tasks '<JSON数组>';脚本不解析
任何文件,列语义/文件配对猜测交给模型。任务数组两类条目:
{"item_id":"<纯数字>","op":"<白名单项>","requirements":"<要求>","item_title":"<标题>"},可选 input_images 作参考图。item_id,必填 input_images(单值或数组),可选 source_file
标注源文件(如「model 列模特图 × scene 列场景图融合,每行一个任务」:主 Agent 读
Excel 后每行产出 {"op":"多图合成","input_images":[模特图,场景图],"requirements":...};
素材文件夹场景列目录后每图产出 {"op":"img_opt","input_images":[<图>],"source_file":<图>})。上游技能交接的结构化 JSON(商品诊断 ONE_CLICK_OPTIMIZE、店铺体检行动项:
products:[{offerId, title, optimizationPoints:[{opKey, label}]}])同样由主 Agent 转换
为上述标准数组(opKey→op 按 task-contract §2 映射,未映射项如实报告并询问用户)。
店铺名传参:宿主/上游侧(如 phoenix-pc 多店铺策略)给到当前操作店铺展示名时,
调用 parse_tasks 一并传 --store_name "<店铺展示名>"(仅用于产物文件名前缀,
避免多店铺同会话运行时产物文件名重叠;不参与鉴权);取不到就不传,产物命名
不带店铺前缀(与旧版兼容)。
解析成功的 data.warnings 必须向用户展示;new_count=0 且有跳过/告警时如实说明,
不静默;随后进入规则3 任务确认(当前主路径 ask_user 表单,data.confirm_card
暂存备升级路径用);不跳过确认直接执行。
op 为封闭白名单(解析层已拦截表外项),主 Agent 按下表把每个任务委托给对应执行技能, 委托前必须读该执行技能的 SKILL.md 并按其命令规范执行:
| op | 标签 | 执行技能 |
|---|---|---|
title_opt | 标题优化 | 1688-item-title-optimizer |
main_img_opt / img_opt / bg_change / carousel_opt / detail_img_opt / full_img_set / full_listing_set / white_img_opt | 图片类 8 项 | 1688-item-image-agent |
multi_img_merge | 多图合成(素材融合) | 1688-item-image-agent(multi_img_opt;--img_urls 按任务 input_images 顺序,--prompt 按「图1、图2…」指代改写 requirements,图号=传入顺序) |
委托要点(完整口径见 task-contract §2):商品 ID 原样传递不重选;执行技能内部交互 (如换背景先弹背景卡)按其自身规范执行。应用时机统一由本技能规则6 控制:先展示完整 优化结果,用户应用后查询 CPV,再由主 Agent 判断是否需要澄清。当前使用执行技能的 逐任务应用卡;批量应用卡提供并上线后,才将逐任务确认改为 batch-apply 单卡确认。 应用参数使用本轮最终方案;澄清后重新处理的任务须更新参数,再弹卡供用户二次确认。
标题任务按方案分别判断:CLI 报错或新标题缺失、为空、仅含空白时,该方案视为失败。 一个方案成功时保留并展示该方案,任务按生成成功落账,在 result_summary 中说明另一方案 未生成成功,不因单个方案失败把整条任务记为 failed;两个方案均失败才记录生成失败。 只有一个可用方案时仍须等待用户应用意图,再按规则6 核对 CPV,不自动应用。
parse_tasks 成功并展示 data.warnings 后,确认环节按以下顺序选择通道。
确认内容须明确为「生成优化方案」,不能把本次任务确认当作后续商品写入授权:
当前主路径(batch-task-confirm 组件未上线,勿弹 offer_select_card——未知 route 会被
组件按默认视图渲染成商品选择卡):宿主 ask_user 工具(mode=form)多选题分页确认:
每题 options 2-8 个(一题最多列 8 个任务,选项 label 用简短标识如「T001 主图优化·保温杯」), 题目数 1-4;单轮 ask_user 最多确认 32 个任务,超出分批确认。
question 限 500 字符:任务明细先在助手正文里用 Markdown 表格列清(taskId/商品/优化项/要求), ask_user 只做勾选确认,不在 question 里重复长清单。
回执落账合并为一次执行:单条 bash 串联逐任务 save_result(每任务仍是独立一次
CLI 调用;已选 --status confirmed,未选 --status skipped),再进入规则4;取消/空选:
停止执行,不把 parsed 任务默认执行。示例(; 分隔,不用 &&,单条失败不断链):
python3 "{baseDir}/cli.py" save_result --task_id T001 --status confirmed ; python3 "{baseDir}/cli.py" save_result --task_id T002 --status confirmed ; python3 "{baseDir}/cli.py" save_result --task_id T003 --status skipped
任务多时每 ~10 个任务一条 bash 串联。禁止并行发起多条写台账的 bash 命令 (台账是读改写文件,并行写会互相覆盖)。
升级路径(1688GUI batch-task-confirm 组件上线且放量后):Bash 直接执行
accio-mcp-cli call --server accio offer_select_card --json '<parse_tasks.data.confirm_card 原样>'
不加 --raw、不接管道、不包在 Python 或 cli.py 里;弹卡后立即结束本轮;回执含勾选与
跳过的 taskId 清单,同样合并进单条 bash 串联落账后进入规则4。通道可用性以宿主/端侧
放量公告为准,未确认放量前一律走主路径。
确认清单按 每批 ≤5 个任务 分批执行(批次间串行;执行技能内部并发由其自身口径控制)。
full_img_set / full_listing_set(计划含 chain/后处理条目)建议单独成批或放批尾;
title_opt 文本类任务可混批。每批固定三个阶段:
阶段一:启动 + 规划(一次迭代)
同轮发起本批每任务一条 bash tool call,单条内串联「标运行 + 委托规划」:
python3 "{baseDir}/cli.py" save_result --task_id T001 --status running ; python3 "<image-agent cli.py 路径>" img_optimize --img_url '<图>' --user_requirements '<要求>'
各任务返回 data.calls 计划后,记录归属映射(tool_call_id → task_id → call_index)。
规划命令由各执行技能 SKILL.md 定义(委托前仍必须先读其 SKILL.md)。
阶段二:生图(全局窗口调度,按轮推进)
把本批所有任务的 calls 合并为一个全局队列,跨任务统一调度:
image_generate / image_edit 合计 ≤5 并行发起;阶段三:落账(一次迭代)
单条 bash 串联逐任务 save_result(每任务独立一次调用):
--status success --result_summary ... --result_images ...(按 tool_call_id →
task 归位取产物);--status failed --error <自然语言原因>;build_result_card / Markdown 表格刷新一次进度(规则5),
不逐任务刷屏。进度提醒(每批落账后立即向用户输出):以台账 batch_stats 为准,紧跟在本批
落账 bash 之后、启动下一批之前,用一条醒目单行向用户报告整体进度,格式:
## 📊 方案生成进度:已处理 40%(4/10)—— 生成成功 3 · 生成失败 1 · 剩余 6
save_result 返回的 data.batch_stats(total / by_status),
不自行估算;skipped/cancelled 计入「已处理」;归位铁律:结果按 tool_call_id → task_id → call_index 记录归属;失败/跳过条目保留
原下标,不按返回先后、URL 或压缩成功列表匹配;单任务失败不阻断批内其他任务,
记录原因后继续。禁止并行发起多条含 save_result 的 bash 命令(台账读改写互斥)。
用户中途要求停止:已启动的调用等待返回后按实际结果落账;未启动任务落
--status cancelled,已产出如实交付。
build_result_card 返回的 data.card 先落账备用,不弹卡。data.card 原样弹 offer_select_card
(route=batch-result-view)刷新进度;弹卡仍是本轮最后一个工具调用。export_results,成功后按 data.file_path 与
data.package_path(zip 包,存在时)调用宿主 present_files 展示产物文件
(表格 + 全部产物图打包,用户可一键下载);导出失败不阻断收尾,如实告知后
按用户要求重试;不把文件路径再贴长链接给用户。1688-item-batch-opt-apply/ 目录内;台账带 store_name(parse_tasks
--store_name 传入)时,导出与归档文件名带店铺前缀
(批量任务结果_<店铺>_<批次ID>.xlsx / tasks_<店铺>_<旧批次ID>.json),
多店铺同会话运行不撞名;同批次重复导出或撞名时文件名自动加序号
(_2、_3…),多批次/多店铺同会话运行不会互相覆盖,不要手动改名或复用旧产物文件名。先展示完整优化结果,用户点击「应用」或明确要求应用后,再查询商品当前 CPV。 首次确认优化任务不触发此查询。查询结果只交给主 Agent 使用,不落账。
propertyNames 匹配词数组,例如主图
使用 ["主图","轮播图","首图","商品图","图片"]。工具内部据此生成正则,缩小返回范围。
同商品合并匹配词,唯一商品每批最多 20 个,调用
query_offer_prop --items_file "<JSON数组文件>",详见 query_offer_prop。name/label
核对模型生成的 key 是否存在、是否能明确对应到目标属性。key 未找到或对应关系有歧义时,
不能放行,也不能仅因某个属性的候选包含目标 value 就擅自替换 key;需由主 Agent 澄清。
查询经过匹配词过滤,未返回某个 key 不等于商品一定不存在该属性,必要时补充相关词查询。
key 明确后,再按该属性的 inputType 判断用户输入的 value:SINGLE_SELECT 检查单个值
是否在候选内,MULTI_SELECT 检查所选值是否都在候选内,TEXT_INPUT 不校验 value,
但仍须完成 key 核对。values 是当前值,candidates 是候选值,新旧值不同本身是正常修改。
例如“颜料改成磨砂”,返回中只有“材质”且其候选包含“磨砂”,仍需澄清是否修改“材质”,
不能因为“磨砂”属于候选就直接放行。applyParams、store_ref。success:false:先按实际返回区分参数错误、平台业务拒绝和结果未知。
参数错误可修正后重试;商品写入按下述回执规则处理,不因 success:false 自动重复提交。parse_tasks;用户在未确认/未落账状态下要求应用:如实说明先完成执行。status=failed + 原因,继续批次;批次结束在结果汇总中统一呈现失败清单。save_result --apply_status failed --apply_detail "<平台返回的失败原因>" 记录;
保留已有 status=success 和生成方案,不把应用失败改记为生成失败。apply_status=unknown,
提示用户到商家后台核对,不判定成功或失败,也不自动重试写入。.env 仅含平台占位符(SKILL_NAME/SKILL_VERSION/SKILL_CHANNEL),无 AK/Token;
登录态复用宿主 AW 会话。{baseDir} 绝对路径,读取与执行来自同一份安装,plugin_id 与宿主提供的技能来源一致parse_tasks 进台账,warnings 已展示,任务确认(当前主路径 ask_user 表单)已回执,逐任务 confirmed/skipped 已合并进单条 bash 串联落账save_result 落账accio-mcp-cli call,且是本轮最后一个工具调用export_results 并 present_files(表格 + zip 产物包);失败时已如实告知present_files 非交互式展示