{"id":"3ea375e6-0812-431e-beed-a466befaa794","entityType":"agent","slug":"clawhub-1688aiinfra-1688-item-title-optimizer","name":"1688-item-title-optimizer","canonicalUrl":"https://www.xpersona.co/agent/clawhub-1688aiinfra-1688-item-title-optimizer","canonicalPath":"/agent/clawhub-1688aiinfra-1688-item-title-optimizer","generatedAt":"2026-10-11T20:59:44.216Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-11T17:14:50.148Z","emptyReason":null},"description":"1688商品标题优化 工具能力：为商品标题添加热词优化（快速、基于规则）和 LLM 深度重写（高质量、自然流畅），支持用户输入偏好。如果用户没有选择想优化标题的商品，技能中可以出组件让用户选择； 触发词：优化标题、标题优化、改标题、重写标题、商品标题、标题改写、分析标题、我要优化标题、标题里哪些词没用、标题里应该加哪些热搜关键词、我的商品标题怎么优化？、我的标题怎么优化？、我要优化商品标题 Skill: 1688-item-title-optimizer Owner: 1688aiinfra Summary: 1688商品标题优化 工具能力：为商品标题添加热词优化（快速、基于规则）和 LLM 深度重写（高质量、自然流畅），支持用户输入偏好。如果用户没有选择想优化标题的商品，技能中可以出组件让用户选择； 触发词：优化标题、标题优化、改标题、重写标题、商品标题、标题改写、分析标题、我要优化标题、标题里哪些词没用、标题里应该加哪些热搜关键词、我的商品标题怎么优化？、我的标题怎么优化？、我要优化商品标题 Tags: latest:0.83.0 Version history: v0.83.0 | 2026-09-04T02:35:06.845Z | auto **Multi-store/shop support and command expansion:** - Added support for multi-store","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1K downloads reported by the source. Last updated 10/11/2026.","installCommand":"clawhub skill install s177df9srv6z2y0gd1kw90rern83hzxb:1688-item-title-optimizer","sourceUrl":"https://clawhub.ai/1688aiinfra/1688-item-title-optimizer","homepage":"https://clawhub.ai/1688aiinfra/skills/1688-item-title-optimizer","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/1688aiinfra/1688-item-title-optimizer","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/1688aiinfra/skills/1688-item-title-optimizer","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":60,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"1688商品标题优化 工具能力：为商品标题添加热词优化（快速、基于规则）和 LLM 深度重写（高质量、自然流畅），支持用户输入偏好。如果用户没有选择想优化标题的商品，技能中可以出组件让用户选择； 触发词：优化标题、标题优化、改标题、重写标题、商品标题、标题改写、分析标题、我要优化标题、标题里哪些词没用、标题里应该加哪些"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:14:50.148Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:14:50.148Z","emptyReason":null},"stars":null,"forks":null,"downloads":1020,"packageName":null,"latestVersion":"0.83.0","tractionLabel":"1K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-11T17:14:50.133Z","emptyReason":null},"lastUpdatedAt":"2026-10-11T17:14:50.148Z","lastCrawledAt":"2026-10-11T17:14:50.133Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-12T17:14:50.133Z","lastVerifiedAt":null,"highlights":[{"version":"0.83.0","createdAt":"2026-09-04T02:35:06.845Z","changelog":"**Multi-store/shop support and command expansion:** - Added support for multi-store scenario: all title optimization commands now accept an optional `--NEWTON_SHOP_LOGIN_ID` parameter to target a specific shop. - Introduced a new `get_bindlist` command to retrieve all shops (loginId) bound to your AK for proper shop selection and bulk operations. - Enforced default behavior: if the user does not specify a target shop, commands automatically operate on all bound shops, ensuring no shop is omitted. - Updated documentation and examples to reflect multi-store workflow and stricter operation requirements. - Multiple internal files updated to implement and consolidate shop selection flow.","fileCount":39,"zipByteSize":68084},{"version":"0.1.0","createdAt":"2026-05-12T06:51:54.430Z","changelog":"Initial release with dual optimization algorithms for 1688 product titles. - Automatically runs both hot keyword-based optimization and LLM deep rewrite in parallel for each item. - Provides structured UI interactions for product selection, batch handling (≥3 items), title comparison and selection, and confirmation before applying titles. - Supports user preference parameters (e.g., specifying keywords or style). - Enforces strict workflow: must wait for user confirmation at multi-item, title selection, and apply steps. - Output optimized results in a comparison table using advanced grouping and editing features. - Includes detailed CLI usage for all commands (configure, optimize, get keywords, get tokenizers).","fileCount":36,"zipByteSize":66268}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s177df9srv6z2y0gd1kw90rern83hzxb:1688-item-title-optimizer","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-1688aiinfra-1688-item-title-optimizer/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-1688aiinfra-1688-item-title-optimizer/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-1688aiinfra-1688-item-title-optimizer/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-1688aiinfra-1688-item-title-optimizer/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-1688aiinfra-1688-item-title-optimizer/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-1688aiinfra-1688-item-title-optimizer/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-11T20:59:44.213Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-1688aiinfra-1688-item-title-optimizer/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-1688aiinfra-1688-item-title-optimizer/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-1688aiinfra-1688-item-title-optimizer/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-1688aiinfra-1688-item-title-optimizer/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-11T17:14:50.148Z","emptyReason":null},"readme":"Skill: 1688-item-title-optimizer\n\nOwner: 1688aiinfra\n\nSummary: 1688商品标题优化 工具能力：为商品标题添加热词优化（快速、基于规则）和 LLM 深度重写（高质量、自然流畅），支持用户输入偏好。如果用户没有选择想优化标题的商品，技能中可以出组件让用户选择； 触发词：优化标题、标题优化、改标题、重写标题、商品标题、标题改写、分析标题、我要优化标题、标题里哪些词没用、标题里应该加哪些热搜关键词、我的商品标题怎么优化？、我的标题怎么优化？、我要优化商品标题\n\nTags: latest:0.83.0\n\nVersion history:\n\nv0.83.0 | 2026-09-04T02:35:06.845Z | auto\n\n**Multi-store/shop support and command expansion:**\n- Added support for multi-store scenario: all title optimization commands now accept an optional `--NEWTON_SHOP_LOGIN_ID` parameter to target a specific shop.\n- Introduced a new `get_bindlist` command to retrieve all shops (loginId) bound to your AK for proper shop selection and bulk operations.\n- Enforced default behavior: if the user does not specify a target shop, commands automatically operate on all bound shops, ensuring no shop is omitted.\n- Updated documentation and examples to reflect multi-store workflow and stricter operation requirements.\n- Multiple internal files updated to implement and consolidate shop selection flow.\n\nv0.1.0 | 2026-05-12T06:51:54.430Z | auto\n\nInitial release with dual optimization algorithms for 1688 product titles.\n\n- Automatically runs both hot keyword-based optimization and LLM deep rewrite in parallel for each item.\n- Provides structured UI interactions for product selection, batch handling (≥3 items), title comparison and selection, and confirmation before applying titles.\n- Supports user preference parameters (e.g., specifying keywords or style).\n- Enforces strict workflow: must wait for user confirmation at multi-item, title selection, and apply steps.\n- Output optimized results in a comparison table using advanced grouping and editing features.\n- Includes detailed CLI usage for all commands (configure, optimize, get keywords, get tokenizers).\n\nArchive index:\n\nArchive v0.83.0: 39 files, 68084 bytes\n\nFiles: capabilities/get_keyword_info.md (2143b), capabilities/get_tokenizers.md (1426b), capabilities/optimize_title_llm.md (4410b), capabilities/optimize_title.md (2453b), cli.py (2657b), references/interaction-specs.md (37177b), references/title_llm_SKILL.md (16809b), references/title_optimizer_qa.md (1182b), references/title_wo_llm_SKILL.md (7132b), scripts/__init__.py (0b), scripts/_auth.py (4337b), scripts/_const.py (280b), scripts/_errors.py (1217b), scripts/_http.py (4760b), scripts/_output.py (960b), scripts/_tracker.py (2437b), scripts/capabilities/__init__.py (0b), scripts/capabilities/configure/__init__.py (0b), scripts/capabilities/configure/cmd.py (1377b), scripts/capabilities/configure/service.py (896b), scripts/capabilities/get_bindlist/__init__.py (0b), scripts/capabilities/get_bindlist/cmd.py (924b), scripts/capabilities/get_bindlist/service.py (540b), scripts/capabilities/get_keyword_info/__init__.py (0b), scripts/capabilities/get_keyword_info/cmd.py (1705b), scripts/capabilities/get_keyword_info/service.py (1290b), scripts/capabilities/get_tokenizers/__init__.py (0b), scripts/capabilities/get_tokenizers/cmd.py (903b), scripts/capabilities/get_tokenizers/service.py (689b), scripts/capabilities/optimize_title_llm/__init__.py (0b), scripts/capabilities/optimize_title_llm/cmd.py (1205b), scripts/capabilities/optimize_title_llm/service.py (996b), scripts/capabilities/optimize_title/__init__.py (0b), scripts/capabilities/optimize_title/cmd.py (1026b), scripts/capabilities/optimize_title/service.py (932b), scripts/Skill 交互接入快速指南 (Quick Start).md (20008b), skill-card.md (2708b), SKILL.md (28118b), _meta.json (145b)\n\nFile v0.83.0:SKILL.md\n\n---\nname: 1688-item-title-optimizer\ndescription: |\n  1688商品标题优化\n  工具能力：为商品标题添加热词优化（快速、基于规则）和 LLM 深度重写（高质量、自然流畅），支持用户输入偏好。如果用户没有选择想优化标题的商品，技能中可以出组件让用户选择；\n  触发词：优化标题、标题优化、改标题、重写标题、商品标题、标题改写、分析标题、我要优化标题、标题里哪些词没用、标题里应该加哪些热搜关键词、我的商品标题怎么优化？、我的标题怎么优化？、我要优化商品标题\nmetadata:\n  openclaw:\n    emoji: \"✏️\"\n    requires:\n      bins:\n        - python\n  interactions:\n    - name: open_tab_select_product\n      type: open_tab\n      selectionType: shop_backend\n      description: \"当用户未提供商品ID时，直接输出该JSON唤起商品选择页面，流程结束，禁止反问用户\"\n      required_data:\n        url: \"https://air.1688.com/app/CSBC-modules/csbc-ai-component-loader/picture-optimize.html?mode=newton-select-offer&skillCode=1688-item-title-optimizer\"\n        pageTitle: \"选择商品\"\n        pageDescription: \"选择商品优化标题\"\n        icon: \"https://img.alicdn.com/imgextra/i3/O1CN01gQPY341cm5b1gzS1k_!!6000000003642-2-tps-80-80.png\"\n    - name: confirm_apply_title\n      type: card\n      selectionType: requirement\n      description: \"用户选定标题后，确认是否应用到商品\"\n      required_data:\n        questions: \"展示选定标题并询问是否应用\"\n    - name: select_items_to_optimize\n      type: table\n      selectionType: product\n      description: \"当用户传入≥3个商品ID时，在左侧弹出表格让用户筛选要优化的商品\"\n      required_data:\n        title: \"表格标题\"\n        columns: \"列定义数组：商品ID、当前标题\"\n        rows: \"商品列表，每项包含 itemId、title\"\n    - name: title_comparison_card\n      type: table\n      selectionType: title_plan\n      description: \"两种优化方案生成后，在左侧弹出表格供用户选择新标题。3列（方案+属性+内容），每个成功方案4个维度各占一行（两个都成功=8行，一个成功一个失败=仅展示成功方案的4行，两个都失败=不弹表格直接提示重试）。利用端侧 show_interaction.table v2 协议的 mergedColumns + groupBy + selectionGranularity:group + selectionMode:single 实现方案列相邻同值合并 + 组级互斥单选，用户勾选整组后点击「采用此方案」按钮\"\n      required_data:\n        title: \"表格标题：请选择新标题 + 商品名称（商品ID）\"\n        columns: \"固定3列：plan（方案标识，宽80，不传 editable）、field（属性标签，宽140，必须显式声明 editable:false 否则会被端侧误渲染为可编辑，用户实测确认）、value（内容，宽620，不传 editable，由行级 rows[i].editable 控制）。配合行级 editable：仅新标题行 rows[i] 加 editable:true 时该 cell 可编辑，其他 cell 全部只读\"\n        mergedColumns: \"[\\\"plan\\\"]。协议硬约束：列必须存在；不能含列级 editable:true 的列。本场景 value 已不开列级 editable，但仍只合并 plan，因为 value 每行内容都不同没有相邻同值\"\n        groupBy: \"\\\"plan\\\"。selectionGranularity=group 时必填，按plan相邻同值切分组\"\n        selectionGranularity: \"\\\"group\\\"。勾选粒度按组（每组组首行渲染一个checkbox，rowSpan=组大小）\"\n        selectionMode: \"\\\"single\\\"。互斥单选：选新组自动取消旧组；点已选项=清空；空选=跳过。与 selectionGranularity 正交\"\n        actions: \"[{key:adopt, label:采用此方案, variant:primary, description:...}]，覆盖默认「确认选择」\"\n        rows: \"4行或8行（rows.length≤10，超过会触发分页关闭合并）。仅填入成功方案的行，失败方案不展示。两个都成功=8行，一个成功一个失败=4行，两个都失败=不弹表格。同方案的4行 plan 必须填相同值且连续排列：方案名称、新标题（仅这行 rows[i].editable:true，可cell内编辑）、生成逻辑及优化说明、预估曝光变化\"\n        respond_contract: \"selectedRows 始终回传展开后的N行（与 multiple+row 同构），Agent 按 plan 分组、按 field=新标题 取最终value（含编辑），空选视为跳过。无论端侧是否识别行级 editable，Agent 必须软兜底：只采用「新标题」行的编辑值，其他 3 行编辑显式忽略\"\n---\n\n# 1688-item-title-optimizer — 商品标题智能优化\n\n## 技能概述\n\n1688 商品标题智能优化助手。自动并发执行两种优化算法生成结果：1) 添加热词优化（快速、基于规则）2) LLM 深度重写（高质量、自然流畅）。只需提供商品 ID，即可同时获得两种优化方案供对比选择。支持用户偏好参数（如\"加入'防潮'单词\"）。\n\n## 使用场景\n\n- 商品标题修改、改写、优化\n- 新品发布，需要高质量标题\n- 批量优化商品标题\n- 用户有特定优化偏好（如指定关键词、风格）\n\n## 多店铺支持\n\n所有操作命令均支持 `--NEWTON_SHOP_LOGIN_ID` 可选参数，用于指定目标店铺的 loginId 进行操作。\n\n**鉴权与身份说明**：\n- **AK（Access Key）**：统一从环境变量读取，用于网关签名鉴权。**所有店铺共用同一个 AK**，无需为每个店铺单独配置或传递不同的 AK。\n- **loginId**：通过 `get_bindlist` 接口获取，用于标识具体要优化哪个店铺的商品标题。在调用操作命令时，通过 `--NEWTON_SHOP_LOGIN_ID` 参数传入目标店铺的 loginId 即可切换店铺上下文。\n\n**使用方式**：\n```bash\n# 优化指定店铺的商品标题（规则版）\npython3 {baseDir}/cli.py optimize_title --item_id <商品ID> --NEWTON_SHOP_LOGIN_ID \"店铺loginId\"\n\n# 优化指定店铺的商品标题（LLM版）\npython3 {baseDir}/cli.py optimize_title_llm --item_id <商品ID> --NEWTON_SHOP_LOGIN_ID \"店铺loginId\"\n```\n\n**多店铺操作流程（⚠️ 强制执行，禁止跳过）**：\n\n> 🔥 **核心原则：用户未明确指定店铺时，默认必须对所有绑定店铺执行标题优化操作，严禁遗漏任何一个店铺。**\n\n1. 调用 `get_bindlist` 获取当前 AK 绑定的所有店铺列表（含各店铺 loginId）\n2. **默认遍历所有店铺**：对每个店铺传 `--NEWTON_SHOP_LOGIN_ID <该店铺loginId>` 分别执行操作（可并行执行）\n3. 仅当用户**明确指定了某个店铺名**时，才匹配对应的 loginId 仅操作该店铺\n4. 最终结果按店铺分组展示\n\n> 🚫 **禁止**：绑定了多个店铺时，如果用户没有明确说\"只优化某个店铺的标题\"，禁止只操作一个店铺就结束。**必须遍历所有店铺，确保优化完整无遗漏**。\n\n## CLI 命令\n\n### get_bindlist — 获取店铺绑定列表\n\n```bash\npython3 {baseDir}/cli.py get_bindlist\n```\n\n获取当前 AK 绑定的所有店铺列表（含各店铺 loginId），用于多店铺场景。\n\n### configure — 配置 AK\n\n```bash\n# 查看 AK 状态\npython3 {baseDir}/cli.py configure\n# 设置 AK\npython3 {baseDir}/cli.py configure YOUR_AK\n```\n\n配置网关鉴权所需的 AK。所有操作命令都依赖 AK，首次使用前需先配置。\n\n### optimize_title — 添加热词优化（方式A）\n\n```bash\npython3 {baseDir}/cli.py optimize_title --item_id <商品ID>\n```\n\n基于规则和统计的标题优化，保留原标题结构，快速添加高价值热搜词。\n\n### optimize_title_llm — LLM 深度重写（方式B）\n\n```bash\n# 基础调用\npython3 {baseDir}/cli.py optimize_title_llm --item_id <商品ID>\n\n# 带用户偏好\npython3 {baseDir}/cli.py optimize_title_llm --item_id <商品ID> --preference \"加入防潮单词\"\n```\n\n基于大语言模型的智能标题重写，全面改写标题，支持用户偏好定制。\n\n### get_keyword_info — 获取关键词信息\n\n```bash\n# 基础调用\npython3 {baseDir}/cli.py get_keyword_info --item_id <商品ID>\n\n# 添加自定义关键词\npython3 {baseDir}/cli.py get_keyword_info --item_id <商品ID> --custom_keywords \"保温杯;不锈钢;便携\"\n```\n\n获取标题优化所需的全部关键词数据（热搜词、曝光词、类目信息）。\n\n### get_tokenizers — 获取分词器列表\n\n```bash\npython3 {baseDir}/cli.py get_tokenizers\n```\n\n获取所有可用的分词器列表及说明。\n\n## ⚠️ 重要：技能skill 使用规范\n\n### 规则2：获取到商品ID后，自动并发执行两种优化\n\n当用户请求标题优化时，**必须按以下步骤执行，关键节点需等待用户确认后再继续**：\n\n1. **⏸️ 参数要求（硬性阻断点）**：如果用户未提供商品 ID，**严禁**弹 card 询问，必须按规则1输出JSON\n\n2. **⏸️ 多商品澄清（≥3 个商品时必须触发）**：\n   - 如果用户一次传入 **3 个及以上商品 ID**，**必须先触发** `select_items_to_optimize` 交互，让用户筛选需要优化的商品\n   - 展示所有商品 ID 及其当前标题（如能获取），让用户选择要优化的商品\n   - **必须等待用户选择后再继续**，禁止自动对所有商品执行优化\n   - 如果用户传入 1-2 个商品，可直接跳过此步骤进入下一步\n\n3. **自动执行**：收到用户的优化请求后（或用户在澄清点选定商品后），**必须自动并发调用**两种优化命令\n\n4. **并发调用**：在同一个消息中同时发起两个工具调用：\n   - `optimize_title`（方式A：添加热词优化）\n   - `optimize_title_llm`（方式B：AI深度重写）\n\n5. **提取偏好**：如果用户在请求中提到特殊要求（如\"加入'防潮'单词\"），提取偏好并传入 `optimize_title_llm` 的 `--preference` 参数\n\n6. **展示结果：触发 `title_comparison_card`**（`type: table`，在左侧弹出表格）\n   - 3 列（方案 + 属性 + 内容），每个方案 4 行（方案名称、新标题、生成逻辑及优化说明、预估曝光变化）\n   - 利用 `mergedColumns: [\"plan\"]` + `selectionGranularity: \"group\"` + `groupBy: \"plan\"` + `selectionMode: \"single\"` 实现方案列合并单元格 + 组级单选勾选\n   - 通过 `actions` 配置一个 `key: \"adopt\"` / `label: \"采用此方案\"` / `variant: \"primary\"` 的按钮替代默认\"确认选择\"\n   - **rows 的 `plan` 字段：同组所有 4 行都填相同方案名**（如全部填\"方案A\"或全部填\"方案B\"），端侧依靠相同值进行合并和分组\n\n7. **⏸️ 应用确认**\n   - 向用户展示选定的新标题，与原标题对比\n   - 触发 `confirm_apply_title` 交互，让用户选择：\n     - ✅ 确认，应用到商品标题\n     - ✏️ 我想手动微调后再应用（用户可输入修改后的标题）\n     - 💾 仅记录，暂不应用\n   - **必须等待用户确认后再继续**，禁止自动跳过\n\n8. **应用到商品**：\n   - 如果用户确认应用，且存在技能 `1688-item-one-click`，则调用技能更新商品标题\n   - 如果用户手动微调了标题，使用微调后的版本应用\n\n**具体的交互组件数据结构请查阅 [`references/interaction-specs.md`](./references/interaction-specs.md) 中对应交互的章节。**\n\n### 规则3：结果展示规范（左侧 Table 表格）\n\n展示时必须使用 `title_comparison_card`（**`type: table`**）交互组件，在左侧弹出表格，3 列（方案 + 属性 + 内容），每个方案 4 行，方案列合并为大单元格，组级互斥单选勾选。\n\n> ⚠️ **端侧版本依赖（v2 协议）**：本交互依赖 `mergedColumns` / `selectionGranularity` / `selectionMode` / `groupBy` 4 个 v2 字段，**仅在已升级到 v2 的客户端**才会生效。当前 1688 工作台 / 找工厂客户端尚未升级，会**忽略**这 4 个字段，退化为默认的 `row + multiple`（每行一个 checkbox、可任意多勾、无方案列合并）。\n>\n> **Agent 必须知道**：\n> - **payload 不要为兼容降级而修改**——协议字段写法是正确的，等客户端升级即可自动生效\n> - **看到「每行一个 checkbox」不是 payload 错了**，是端侧降级渲染\n> - 处理 `selectedRows` 时**必须用下方\"用户回传后处理\"统一兼容算法**，不能假设回传一定是同一方案的 4 行\n> - 完整端侧能力对比与降级表见 `references/interaction-specs.md` 中\"端侧版本依赖\"小节\n\n**展示规范**（`title_comparison_card`）：\n\n1. **`title`**：格式为\"请选择新标题 — 商品名称（商品ID）\"\n2. **`columns` 固定 3 列**：\n   - `plan`（方案标识列，宽 80px，**不传** `editable`）\n   - `field`（属性标签列，宽 140px，**必须显式声明** `editable: false`）—— ⚠️ 用户实测：省略 `editable` 字段会让端侧把该列误渲染为可编辑，**显式写 `false`** 才能保证只读\n   - `value`（内容列，宽 620px，**列级不传** `editable`，由行级 `rows[i].editable: true` 仅在\"新标题\"行开启）\n\n   ⚠️ **行级 editable 协议（2026-05 用户实测有效）**：1688 端侧官方曾答复\"列级 editable 不支持行级控制\"，但**用户实测确认**端侧已支持 `rows[i].editable: true` 行级控制。本场景配合\"`field` 列显式 `editable: false` + `value` 列不传 + 仅新标题行 `rows[i].editable: true`\"的组合写法，达到\"仅新标题行可编辑、其他所有 cell 都只读\"的预期效果。\n   \n   **双层保护（防御性设计）**：即使端侧某天回退、行级 editable 失效，Agent 在读取回传时**仍必须**软兜底：只采用「新标题」行的编辑值，其他 3 行编辑显式忽略（详见下方\"用户回传后处理\"第 6 步），保证业务正确性不依赖于端侧能力\n3. **v2 协议合并/勾选字段（4 个，缺一不可）**：\n   - `mergedColumns: [\"plan\"]`：方案列按**相邻同值**合并为大 rowSpan 单元格\n   - `groupBy: \"plan\"`：按方案字段切分相邻分组（`selectionGranularity:\"group\"` 时必填）\n   - `selectionGranularity: \"group\"`：勾选**单位**为组（每组组首行渲染一个 checkbox，整组共用）\n   - `selectionMode: \"single\"`：勾选**数量**为单选（方案 A / B 互斥；选新组自动取消旧组；点已选项 = 清空；空选 = 跳过）\n4. **协议硬约束**（违反会被主进程 validator 拒绝 / 端侧渲染异常）：\n   - `mergedColumns` 中的列**不能是列级 `editable: true`** —— 本场景 `value` 列已改为不开启列级 editable（用行级 `rows[i].editable` 替代），所以约束自动满足；仍只合并 `plan`，因为 `value` 每行内容不同没有相邻同值可合并\n   - **`field` 列必须显式 `editable: false`**（不可省略）—— 用户实测：省略时端侧会把该列误渲染为可编辑\n   - `rows.length ≤ 10` —— 超过会触发端侧分页并自动关闭合并；本场景最多 8 行（仅成功方案入表），安全\n   - 同方案的所有行 `plan` 字段必须**填相同值且连续排列**（不能\"方案A、方案B、方案A\"这样交错），否则相邻同值合并失效\n5. **`actions` 自定义按钮**：配置 `[{ key: \"adopt\", label: \"采用此方案\", variant: \"primary\", description: \"...\" }]` 替代默认\"确认选择\"\n6. **`rows` 仅填入成功方案的行（4 行或 8 行，严禁填入失败方案的行）**：两个都成功 = 方案 A 4 行 + 方案 B 4 行共 8 行；一个成功一个失败 = 仅成功方案的 4 行（**禁止**为失败方案填占位行）；两个都失败 = 不弹表格。每方案 4 个属性维度，**行级 editable 配置**（仅\"新标题\"行设 `editable: true`，端侧识别后这 3 行渲染只读）：\n   - 方案名称（**不设** `editable`，端侧默认只读；即使端侧不识别行级 editable，Agent 也忽略此行编辑值）\n   - **新标题**（**设** `\"editable\": true`，可 cell 内编辑；**用户编辑会被采用**为最终标题）\n   - 生成逻辑及优化说明（**不设** `editable`，端侧默认只读；Agent 完全不读此行编辑值）\n   - 预估曝光变化（**不设** `editable`，端侧默认只读；Agent 完全不读此行编辑值）\n7. **生成逻辑维度构造**（写入\"生成逻辑及优化说明\"行的 `value`，按热度 `weight` 标注）：\n   - 🔥 热词（tag=`热词`）：词名(热度:weight值)\n   - 📈 流量获取（tag=`时间词`/`修饰词`）\n   - ✨ 吸引力（tag=`场景词`/`风格词`）\n   - 👀 买家关注（tag=`属性词`/`材质词`/`品类词`/`功能词`）\n8. **📈 曝光量变化预测（必须）**：基于热词数据给出\"+X% ~ +Y%\"区间，写入\"预估曝光变化\"行的 `value`，必须附带\"实际效果受类目竞争、商品权重、市场环境等多因素影响，仅供参考\"免责说明（具体规则见 `references/interaction-specs.md` 中\"曝光量变化预测规则\"小节）\n9. **部分失败处理（严禁展示失败方案）**：若任一方案 CLI 返回 `success: false` 或异常，**直接跳过该方案**，rows 中**仅填入成功方案的 4 行**，**禁止**为失败方案填入任何占位行/兜底行。具体规则：\n   - **一个成功一个失败** → `title_comparison_card` 只展示成功方案的 4 行（`rows.length = 4`）；由于只有 1 个方案可选，用户直接勾选该方案即可；在对话中简要告知用户另一方案本次未生成成功\n   - **两个都失败** → **不弹** `title_comparison_card` 表格；直接在对话中告知用户\"两种优化方案均未生成成功，建议稍后重试\"，并提示可重新触发优化\n   - **两个都成功** → 正常展示 8 行（不变）\n\n**用户回传后处理**（统一兼容 v2 客户端 与 未升级客户端，**无需事先判断端侧版本**，按此顺序执行）：\n\n> **前置要求**：触发本交互之前，Agent 必须确保 `optimize_title`（方案A）和 `optimize_title_llm`（方案B）的 CLI 完整返回 JSON **仍可在当前对话上下文中访问**（用于降级场景下重新弹窗时重构 payload，**禁止**为此重新调用 CLI）。\n\n1. **空选判定**：`selectedRows.length === 0` → 视为跳过，**禁止**进入 `confirm_apply_title`，应回退询问\"是否重新生成 / 结束优化\"\n\n2. **按 `plan` 字段分组聚合**：`groups = group_by(selectedRows, row => row.plan)`\n\n3. **跨方案混勾的兜底**（分组数 ≥ 2，仅未升级客户端可能出现）：**严禁**用\"取行数最多的方案\"等启发式猜测算法。必须：\n   1. 给用户对话提示：\"检测到您勾选了多个方案的行（方案 A：N₁ 行 / 方案 B：N₂ 行），由于本次只能采用一个方案，请在重新弹出的表格中**仅勾选您想采用的那一个方案**，再点「采用此方案」\"\n   2. **重新触发 `title_comparison_card`**，用前置小节提到的成功方案的原始 CLI 返回值**重新构造 payload**（仅填入成功方案的行；**禁止**重新调用 `optimize_title` / `optimize_title_llm`）\n   3. 等待新一轮回传，从第 1 步重新走\n\n4. **缺字段的兜底**（分组数 = 1 但唯一方案的行集合中缺少 `\"方案名称\"` 或 `\"新标题\"`，仅未升级客户端可能出现）：\n   1. 给用户对话提示：\"您勾选的行不完整（缺少 `<缺失的 field 列表>`），请在重新弹出的表格中**勾选包含「方案名称」和「新标题」的完整行集合**\"\n   2. **重新触发 `title_comparison_card`**（同第 3 步：用原始 CLI 返回值重构 payload，**禁止**重调 CLI）\n   3. 等待新一轮回传，从第 1 步重新走\n\n5. **（已移除）**：由于失败方案不再进入表格，无需在回传后识别失败方案。直接进入第 6 步\n\n6. **读取最终新标题（仅采用「新标题」行的编辑值）**：在唯一选中方案的行集合里找 `field === \"新标题\"` 的行（第 4 步已保证此行存在），取其 `value`（**可能已被用户在 cell 内编辑**，以此为准，**禁止**回退读 CLI 原始 `new_title`，**禁止**用其他 field 的 value 当标题）。\n   - ⚠️ **关于其他 3 行的用户编辑**：协议层已通过**不在这 3 行设置** `editable: true` 让端侧渲染为只读。但万一端侧暂不识别 `rows[i].editable` 退化为\"全部 cell 可编辑\"，Agent 仍须**显式忽略**这些行的编辑值（双层保护）：\n     - 方案名称行的 value 仅用于\"识别选中方案\"，**不参与最终标题构造**\n     - 生成逻辑 / 预估曝光变化 行的 value **完全不读**，仅作 UI 展示\n     - **严禁**因用户改了其他行就把它当成新标题写入 `confirm_apply_title`\n\n7. **进入应用确认**：携带\"方案标识（来自分组的唯一 key）+ 最终新标题（仅来自「新标题」行的编辑值）+ 商品 ID + 商品原标题\"触发 `confirm_apply_title`\n\n> **设计原则**：上述算法只依赖 `selectedRows` 的扁平结构 + `plan`/`field` 字段语义，不依赖端侧\"组\"/\"单选\"实现细节。在 v2 客户端上第 3、4 步的兜底永不触发（端侧已保证完整性），算法退化为\"取 `groups` 唯一 key + 找新标题行\"的极简路径；在未升级客户端上兜底按需启用，依靠 context 中已有的 CLI 原始返回值重构 payload 重新弹窗，**不再调用任何 CLI**。**待 1688 客户端升级到 v2 后无需任何回滚**。完整算法说明见 `references/interaction-specs.md` 中\"Agent 处理逻辑\"小节。\n\n### 规则4：用户偏好提取\n\n如果用户在优化请求中提到特殊要求，需要提取并传入 `--preference` 参数：\n\n**识别偏好的关键词**：\n\n- \"加入xxx\"、\"添加xxx\"、\"包含xxx\" → 提取关键词\n- \"突出xxx\"、\"强调xxx\"、\"体现xxx\" → 提取特点要求\n- \"要xxx风格\"、\"面向xxx\" → 提取风格要求\n\n**示例**：\n\n```\n用户：\"优化商品831034165952的标题，加入'防潮'这个词\"\n  ↓\n提取：preference = \"加入'防潮'单词\"\n  ↓\n调用：cli.py optimize_title_llm --item_id 831034165952 --preference \"加入'防潮'单词\"\n```\n\n## 安全声明\n\n| 风险级别 | 命令 | Agent 行为 |\n|---------|------|----------|\n| 只读 | configure | 可直接执行，无需确认 |\n| 只读 | optimize_title | 可直接执行，无需确认 |\n| 只读 | optimize_title_llm | 可直接执行，无需确认 |\n| 只读 | get_keyword_info | 可直接执行，无需确认 |\n| 只读 | get_tokenizers | 可直接执行，无需确认 |\n\n> 所有命令均为只读操作，不会修改商品标题。优化结果仅供参考，需用户确认后手动应用。\n\n## 异常处理\n\n任何命令输出 `success: false` 时：\n\n1. **先输出 `markdown` 字段**（已包含用户可读的错误描述）\n2. **再根据关键词追加引导**：\n\n| markdown 关键词 | Agent 额外动作 |\n|----------------|--------------|\n| \"AK 未配置\" 或 \"AK 无效或已过期\" | 提示用户当前发送能力所需鉴权未就绪，请补充有效 AK 或检查鉴权配置后重试 |\n| \"请求被限流\" | 建议用户等待 1-2 分钟后重试 |\n| 其他 | 仅输出 markdown 即可 |\n\n## 环境变量（.env）\n\n项目根目录的 `.env` 文件存储 skill 基础信息，供埋点上报等模块读取。发布到不同环境时可直接替换该文件中的变量值。\n\n| 变量 | 默认值 | 说明 |\n|------|--------|------|\n| `SKILL_NAME` | `1688-item-title-optimizer` | skill 名称 |\n| `SKILL_VERSION` | `1.0.0` | skill 版本号 |\n| `SKILL_CHANNEL` | `clawhubai` | 发布渠道 |\n\n> 已存在的系统环境变量优先级高于 `.env`，CI/CD 注入的变量不会被覆盖。\n\n## 埋点上报\n\n每次 CLI 命令执行时，自动向 skill 网关上报一次调用记录，用于统计 skill 调用次数。\n\n- **实现位置**：`scripts/_tracker.py` → `report_skill_usage()`，在 `cli.py` 的 `main()` 中每次命令执行后自动调用\n- **上报接口**：`POST /api/alibaba.1688.report.skills.usage/1.0.0`\n- **上报参数**：\n\n  | 参数 | 值来源 | 说明 |\n  |------|--------|------|\n  | `apiName` | 固定 `null` | 固定传 null |\n  | `skillsName` | `.env` `SKILL_NAME` | skill 名称 |\n  | `version` | `.env` `SKILL_VERSION` | skill 版本号 |\n  | `scene` | 固定 `CLI` | 固定值 |\n  | `channel` | `.env` `SKILL_CHANNEL` | 发布渠道 |\n\n- **失败处理**：上报失败静默忽略，不影响主流程\n\n## 输出格式\n\n采用标准 JSON 输出：\n\n```json\n{\n  \"success\": true,\n  \"markdown\": \"✅ 标题优化完成\",\n  \"data\": {\n    \"item_id\": 831034165952,\n    \"old_title\": \"304不锈钢水杯\",\n    \"new_title\": \"304不锈钢保温杯便携大容量\",\n    \"optimize_reason\": \"添加热词:保温杯,便携,大容量\",\n    \"new_title_words\": [...],\n    \"other_words\": [...]\n  }\n}\n```\n\n## 两种优化方式对比\n\n| 特性 | optimize_title（方式A） | optimize_title_llm（方式B） |\n|------|----------------------|--------------------------|\n| 优化方式 | 规则 + 统计 | LLM 深度重写 |\n| 优化质量 | ★★★★☆ | ★★★★★ |\n| 优化速度 | < 1 秒 | 2-5 秒 |\n| 标题自然度 | 较自然 | 非常自然 |\n| 成本 | 低 | 较高 |\n| 偏好支持 | ❌ | ✅ |\n| 适用场景 | 快速优化、批量处理 | 深度优化、新品发布 |\n\n### 规则5：曝光量变化预测\n\n展示优化结果时，**必须**对每种方案给出曝光量变化预估。预估规则如下：\n\n1. **热词数量变化**：新标题相比原标题每新增 1 个类目热搜词（tag=`热词`），预估曝光提升 5%-15%\n2. **热词权重参考**：`new_title_words` 和 `other_words` 中的 `weight`（权重值）、`min_rnk`（搜索排名）可辅助判断词的流量价值——权重越高、排名越靠前，预估提升越大\n3. **年份更新加成**：如果新标题包含当前年份词（如\"2026新款\"），预估额外提升 3%-8% 曝光\n4. **综合预估**：给出一个保守区间（如 \"+10% ~ +25%\"），并标注免责说明\n\n**免责说明（必须展示）**：\n> ⚠️ 曝光预估基于关键词热度数据，实际效果受类目竞争、商品权重、市场环境等多因素影响，仅供参考。\n\n**示例**：\n\n| 方案 | 新增热词数 | 年份更新 | 预估曝光变化 |\n|------|----------|---------|------------|\n| 方式A | +3 个热词 | 无 | +15% ~ +25% |\n| 方式B | +4 个热词 | 含\"2026新款\" | +20% ~ +35% |\n\n## 使用原则\n\n1. 所有命令均为只读操作，不会修改商品标题\n2. 优化结果仅供参考，需用户确认后手动应用\n3. 收到优化请求后，应同时调用两种方式并展示结果\n4. 如果用户有特殊偏好，应提取并传入 `--preference` 参数\n5. 传入 ≥3 个商品时，必须先触发 `select_items_to_optimize` 交互让用户筛选\n6. 结果展示必须使用 `title_comparison_card` 表格（3列×每方案4行，方案列合并单元格 + 组级单选），标注生成逻辑及优化说明（含热度）和曝光预估\n\n## 执行前置（首次命中能力时必须）\n\n- 如果用户没有提供商品ID（上下文里没有商品ID），直接按 [`references/interaction-specs.md`](./references/interaction-specs.md) 中 `open_tab_select_product` 的数据结构输出 JSON，流程结束，**不允许反问用户，不允许输出其他内容**\n- 首次执行 `optimize_title` 前：先完整阅读 `capabilities/optimize_title.md`\n- 首次执行 `optimize_title_llm` 前：先完整阅读 `capabilities/optimize_title_llm.md`\n- 首次执行 `get_keyword_info` 前：先完整阅读 `capabilities/get_keyword_info.md`\n- 首次执行 `get_tokenizers` 前：先完整阅读 `capabilities/get_tokenizers.md`\n\n## Agent 执行检查清单\n在执行优化时，请确认：\n- [ ] 提取商品ID\n- [ ] 若商品数 ≥ 3，已触发 `select_items_to_optimize` 交互并等待用户选择\n- [ ] 已识别并提取用户偏好（如果有）\n- [ ] 并发调用 `optimize_title` 和 `optimize_title_llm` 命令\n- [ ] 等待两个结果都返回\n- [ ] 使用 `title_comparison_card` 表格展示两个结果（含生成逻辑 + 曝光预估）\n- [ ] 已给出每种方案的曝光量变化预估及免责说明\n\nFile v0.83.0:_meta.json\n\n{\n  \"ownerId\": \"kn76msg8cwkep3b08z7zffx9fx82p5wj\",\n  \"slug\": \"1688-item-title-optimizer\",\n  \"version\": \"0.83.0\",\n  \"publishedAt\": 1788489306845\n}\n\nFile v0.83.0:references/interaction-specs.md\n\n# 交互组件详细规范\n\n本文档定义了 1688-item-title-optimizer Skill 中所有交互组件的具体数据结构与映射规则。大模型在调用 `show_interaction` 前需查阅本文档，确保数据结构正确。\n\n---\n\n## 1. confirm_apply_title (Card 组件)\n\n### 组件类型\n\n`type: card` — 用户选定标题后，确认是否将新标题应用到商品。\n\n### 数据槽位定义\n\n- **`questions`**:\n  - 类型: `Array<Object>`\n  - 说明: 问题列表，每项包含 `question`（问题文本）和 `options`（选项数组）\n\n### 构造规则\n\n- `question` 中应展示原标题和选定的新标题，让用户做最终确认\n- 明确说明\"应用\"操作的含义（会替换当前商品标题）\n\n### 完整数据示例\n\n```json\n{\n  \"questions\": [\n    {\n      \"question\": \"确认将以下标题应用到商品？\\n\\n原标题：304不锈钢水杯\\n新标题：2026新款304不锈钢保温杯 大容量便携户外水杯 男女通用\\n\\n应用后将替换当前的商品标题。\",\n      \"options\": [\n        \"✅ 确认，应用到商品标题\",\n        \"✏️ 我想手动微调后再应用\",\n        \"💾 仅记录，暂不应用到商品\"\n      ],\n      \"required\": true\n    },\n    {\n      \"question\": \"**如需微调标题**，请在下方输入修改后的完整标题：\\n\\n> 当前推荐标题：2026新款304不锈钢保温杯 大容量便携户外水杯 男女通用\",\n      \"options\": [],\n      \"required\": false\n    }\n  ]\n}\n```\n\n> **说明**：第二个 question 的 `options` 为空数组，端侧会渲染为**大输入框**（而非小的\"输入其他\"框），方便用户输入完整的商品标题（通常 30-60 字）。`required: false` 表示仅当用户选择\"手动微调\"时才需要填写。\n\n### 用户选择后的处理\n\n| 用户选择 | Agent 行为 |\n|---------|-----------|\n| 确认应用 | 调用 `1688-item-one-click` 将选定标题更新到商品，完成后输出成功提示 |\n| 手动微调 | 使用第二个 question 中用户输入的标题，调用 `1688-item-one-click` 应用微调版本 |\n| 仅记录 | 结束流程，提示用户可后续手动应用 |\n\n---\n\n## 2. select_items_to_optimize (Card 组件)\n\n### 组件类型\n\n`type: card` — 当用户传入 3 个及以上商品 ID 时，展示商品列表让用户筛选需要优化的商品，缩小分析范围。\n\n### 触发条件\n\n- 用户在一次请求中传入 **≥ 3 个商品 ID**\n- Agent 必须在执行优化前触发此交互，不得自动全部执行\n\n### 数据槽位定义\n\n- **`questions`**:\n  - 类型: `Array<Object>`\n  - 说明: 问题列表，每项包含 `question`（问题文本）和 `options`（选项数组）\n  - 端侧会自动追加\"输入其他\"选项\n\n### 构造规则\n\n- `question` 中应列出所有传入的商品 ID 及其当前标题，方便用户辨识\n- 选项中应包含每个商品的 ID + 标题摘要（截取前 20 字），以及\"全部优化\"和\"取消\"选项\n- 如果无法预先获取标题，可仅展示商品 ID\n\n### 完整数据示例\n\n```json\n{\n  \"questions\": [\n    {\n      \"question\": \"您提供了 4 个商品，一次优化过多可能影响效率和结果质量。请选择需要优化的商品（建议不超过 3 个）：\\n\\n1. 商品 831034165952：304不锈钢水杯大容量...\\n2. 商品 742091827364：儿童书包男生小学生...\\n3. 商品 653928174051：夏季短袖T恤男纯棉...\\n4. 商品 590817263940：办公椅电脑椅家用舒适...\",\n      \"options\": [\n        \"优化商品1：831034165952\",\n        \"优化商品2：742091827364\",\n        \"优化商品3：653928174051\",\n        \"优化商品4：590817263940\",\n        \"全部优化（可能耗时较长）\",\n        \"❌ 取消，暂不优化\"\n      ]\n    }\n  ]\n}\n```\n\n### 用户选择后的处理\n\n| 用户选择 | Agent 行为 |\n|---------|-----------|\n| 选择特定商品（可多选） | 仅对选中的商品执行并发优化流程 |\n| 全部优化 | 对所有商品逐个执行优化流程，按顺序展示结果 |\n| 取消 | 结束流程，输出友好的结束语 |\n| 输入其他（端侧追加） | 用户可手动输入要优化的商品 ID 列表 |\n\n---\n\n## 3. title_comparison_card (Table 组件 — 相邻同值合并 + 组级单选)\n\n> ### ⚠️ 端侧版本依赖（v2 协议）\n>\n> 本交互依赖 `show_interaction.table` 的 **v2 协议扩展字段**：`mergedColumns` / `selectionGranularity` / `selectionMode` / `groupBy`。这 4 个字段**仅在已升级到 v2 的客户端**（如 newton-desktop v2 及以上）才会生效。\n>\n> **当前 1688 工作台 / 找工厂客户端尚未升级到 v2**，该客户端会**忽略**这 4 个字段，把 payload 退化为默认的 `row + multiple`（行级多选）模式渲染：\n>\n> | 现象 | v2 客户端（期望） | 未升级客户端（当前实际）|\n> |------|------------------|----------------------|\n> | 勾选框数量 | 2 个（每组组首行 1 个，rowSpan=4）| 8 个（每行 1 个）|\n> | 方案列单元格 | 「方案A」「方案B」各合并为 1 个大 cell | 8 行各显示一次「方案A」/「方案B」|\n> | 勾选语义 | 整组互斥单选（A↔B 二选一）| 行级多选，可任意勾 N 行 |\n> | 已选计数 | 0/8 或 4/8 | 0/8 ~ 8/8 任意 |\n>\n> **重要原则**：\n> 1. **payload 不要为兼容降级而修改** —— 协议字段写法是正确的，问题在端侧未实现，等客户端升级即可自动生效\n> 2. **Agent 不要因为看到「每行一个 checkbox」而判断 payload 错了** —— 这是端侧降级渲染的预期表现\n> 3. 在未升级客户端上，Agent 收到的 `selectedRows` 可能是用户跨方案勾选的若干行（不一定是同一方案的 4 行）；处理算法已在下方\"Agent 处理逻辑\"小节做了**统一兜底**（按 `plan` 分组、跨方案时重新弹窗、未勾新标题时重新弹窗），**禁止**自行启发式猜测用户意图\n\n### 组件类型\n\n`type: table` — 两种优化方案生成后，在左侧弹出表格。3 列（方案 + 属性标签 + 内容），每个**成功**方案的 4 个维度各占一行（两个都成功 = 8 行，一个成功一个失败 = 仅展示成功方案的 4 行，两个都失败 = 不弹表格）。利用端侧 `show_interaction.table` v2 协议的**相邻同值合并**能力（`mergedColumns` + `groupBy`），方案列连续同值的行在视觉上合并为一个 rowSpan 大单元格；勾选粒度为**组**（`selectionGranularity: \"group\"`），数量为**单选**（`selectionMode: \"single\"`），方案 A / 方案 B 互斥，整组共用一个勾选框（渲染在组首行）。新标题行的内容列可直接编辑。\n\n### 端侧能力依赖（v2 协议 4 个字段）\n\n| 字段 | 维度 | 本场景取值 | 语义 |\n|------|------|-----------|------|\n| `mergedColumns` | 视觉合并 | `[\"plan\"]` | 该列**相邻同值**的连续行自动合并为 rowSpan 大单元格；不做全局聚合，不跨 `groupBy` 边界 |\n| `groupBy` | 分组依据 | `\"plan\"` | 按 `plan` 字段切分相邻分组（`selectionGranularity:\"group\"` 时**必填**）|\n| `selectionGranularity` | 勾选**单位** | `\"group\"` | 每组一个 checkbox（渲染在组首行），点击即整组勾选 |\n| `selectionMode` | 勾选**数量** | `\"single\"` | 互斥单选；选中新组自动取消旧组；点击已选项 → 清空（视为取消，等价于跳过）|\n\n> **正交设计**：`selectionGranularity × selectionMode` 是两个正交维度，本场景使用 `group + single`（方案互斥）。其余 3 种组合（`row+multiple` 默认 / `row+single` / `group+multiple`）由端侧统一支持。\n\n### 协议硬约束（违反会被主进程 validator 拒绝 / 端侧渲染异常）\n\n1. **`mergedColumns` 中的列不能是 `editable: true` 的列** —— 合并后编辑态语义歧义。本场景虽然 `value` 列已不开启列级 editable（改为行级 `rows[i].editable: true` 仅作用于\"新标题\"行，详见下方\"行级 editable 协议\"小节），但本场景仍**只合并 `plan` 列**，原因变成了\"`value` 列每行内容都不同，没有相邻同值可合并\"，而非 editable 冲突\n2. **`field` 列必须显式声明 `editable: false`**（不可省略）—— 用户实测发现：省略 `editable` 字段时端侧可能把该列误渲染为可编辑；显式写 `false` 才能保证该列稳定只读\n3. **`selectionGranularity: \"group\"` 时必须同时传 `groupBy`**\n4. **`mergedColumns` / `groupBy` 的 key 必须存在于 `columns`**\n5. **行数 ≤ 10**：超过端侧分页阈值后会**自动关闭合并**（防止一组被拆到两页导致 rowSpan 跨页错乱）。本场景最多 8 行（仅成功方案入表），安全\n6. 这 4 个字段（`mergedColumns` / `groupBy` / `selectionGranularity` / `selectionMode`）是 `table` 专有，不允许出现在 `card` / `input` / `open_tab` 类型下\n\n### 触发条件\n\n- 两种优化方式（方式A `optimize_title` + 方式B `optimize_title_llm`）**均执行结束**后触发\n- **仅展示成功方案**：失败方案（CLI 返回 `success: false` 或异常）**不进入 rows**，直接跳过。rows 中仅填入成功方案的 4 行\n- **一个成功一个失败** → 触发本交互，`rows.length = 4`（仅成功方案）；在对话中简要告知用户另一方案未生成成功\n- **两个都成功** → 触发本交互，`rows.length = 8`（两个方案各 4 行）\n- **两个都失败** → **不触发**本交互；直接在对话中告知用户\"两种优化方案均未生成成功，建议稍后重试\"，并提示可重新触发优化\n\n### 失败方案处理（严禁展示）\n\n> ⚠️ **核心规则**：失败方案**不进入表格 rows**，不要为失败方案填入任何占位行、兜底行、提示行。用户在表格中只能看到成功生成的方案。如果某方案 CLI 返回 `success: false` 或异常，在对话文本中简要说明该方案未成功即可，**禁止**在 `title_comparison_card` 的 rows 里塞入失败信息。\n\n### 数据槽位定义\n\n- **`title`**:\n  - 类型: `String`\n  - 说明: 表单标题，格式为\"请选择新标题 — 商品名称（商品ID）\"\n\n- **`columns`**:\n  - 类型: `Array<Object>`\n  - 说明: 固定 3 列\n\n  | key | label | width | editable | 说明 |\n  |-----|-------|-------|----------|------|\n  | `plan` | 方案 | 80 | — | 方案标识列，端侧根据 `mergedColumns` 自动合并相同值 |\n  | `field` | 属性 | 140 | **`false`**（必须显式声明）| 属性标签列：方案名称 / 新标题 / 生成逻辑及优化说明 / 预估曝光变化。⚠️ **必须显式写 `editable: false`**，省略字段会让端侧把整列误渲染为可编辑（用户实测确认，2026-05）|\n  | `value` | 内容 | 620 | — | 对应属性的具体内容；**列级不传 editable**，由 `rows[i].editable: true` 行级控制（仅\"新标题\"行开启）|\n\n- **`mergedColumns`** ⭐ 关键字段:\n  - 类型: `Array<String>`\n  - 值: `[\"plan\"]`\n  - 说明: 指定 `plan` 列做**相邻同值合并** —— 连续同值的行在该列自动合并为一个 rowSpan 大单元格。**该列不能是列级 `editable: true`**（行级 `rows[i].editable` 不受此约束限制，但若把 `value` 加入 `mergedColumns` 同样无意义，因为 `value` 每行内容都不同）\n\n- **`groupBy`** ⭐ 关键字段:\n  - 类型: `String`\n  - 值: `\"plan\"`\n  - 说明: 按 `plan` 字段切分相邻分组，相同 `plan` 值的**连续行**属于同一组（`selectionGranularity:\"group\"` 时必填）\n\n- **`selectionGranularity`** ⭐ 关键字段:\n  - 类型: `String`\n  - 枚举: `\"row\"` / `\"group\"`\n  - 值: `\"group\"`\n  - 说明: 勾选**单位**为\"组\"，每组一个 checkbox（渲染在组首行），整组共用，勾选时整组同时选中\n\n- **`selectionMode`** ⭐ 关键字段:\n  - 类型: `String`\n  - 枚举: `\"single\"` / `\"multiple\"`（缺省 = `\"multiple\"`，向后兼容）\n  - 值: `\"single\"`\n  - 说明: 勾选**数量**为单选，方案 A / 方案 B 互斥；选中新组自动取消旧组；再次点击已选项 → 清空（落到空选，等价于跳过）。**与 `selectionGranularity` 正交**，4 种组合都合法\n\n- **`actions`**:\n  - 类型: `Array<Object>`\n  - 数组长度: **固定 1 项**（仅 `adopt`）；端侧会自动在 actions 之外额外渲染\"跳过/关闭\"按钮，**禁止**在 actions 里再追加 `skip` / `cancel` 等元素\n  - 说明: 自定义主按钮，覆盖端侧默认的\"确认选择\"标签，明确语义为\"采用此方案\"\n\n  | key | label | description | variant |\n  |-----|-------|-------------|---------|\n  | `adopt` | 采用此方案 | 用户采用该方案下的新标题（以 value 列的最终编辑值为准），后续流程基于选中方案继续 | `primary` |\n\n- **`rows`**:\n  - 类型: `Array<Object>`\n  - 说明: 每个**成功**方案占 4 行（方案名称、新标题、生成逻辑及优化说明、预估曝光变化）。两个都成功 = 8 行，一个成功一个失败 = 4 行（失败方案不进入 rows）\n\n  | 字段 | 类型 | 说明 |\n  |------|------|------|\n  | `plan` | String | 方案标识，**同组所有行都填相同值**（如\"方案A\"或\"方案B\"），端侧依靠相邻同值进行合并和分组。**方案 A 的 4 行必须连续在前，方案 B 的 4 行必须连续在后**，不能交错（端侧只合并相邻同值，不做全局聚合）|\n  | `field` | String | 属性标签名，固定枚举：`方案名称` / `新标题` / `生成逻辑及优化说明` / `预估曝光变化` |\n  | `value` | String | 属性值；`field === \"新标题\"` 那行的 value 在 UI 上可被用户直接编辑（依赖**行级** `rows[i].editable: true`，**仅在新标题行设置**）|\n  | `editable` | Boolean? | **可选，行级 editable 开关**。仅 `field === \"新标题\"` 的行设置 `editable: true`，其他 3 行不设置（端侧默认只读）。**取代列级 `columns[].editable`**，让方案名称 / 生成逻辑 / 预估曝光变化 这 3 行物理只读，从根上避免用户误编辑（详见下方\"行级 editable 协议\"小节）|\n\n  **总行数硬上限**：`rows.length ≤ 10`。本场景最多 8 行（2 方案均成功 × 4 维度）、一方失败时仅 4 行，永不触达上限；超过 10 行端侧会触发分页并**自动关闭合并**，破坏视觉效果。如需扩展第 3 个方案，先评估是否需要改用其他展示形态。\n\n- **`totalCount`**:\n  - 类型: `Integer`\n  - 值: 等于 `rows.length`（本场景为 `4` 或 `8`，取决于成功方案数）\n  - 说明: 与 `rows.length` 一致；用于端侧分页判定\n\n### 为什么\"只能合并 plan 列、不能合并 value 列\"\n\n- `mergedColumns` **只能包含 `[\"plan\"]`**\n- 不需要加入 `value`：`value` 列每行内容都不同，没有相邻同值可合并，加了也无效果\n- 不需要加入 `field`：每行 `field` 不同，没有可合并的相邻同值\n\n### 行级 editable 协议（2026-05 用户实测确认有效）\n\n> **背景**：1688 端侧官方曾答复（2026-05 钉钉）\"列级 editable 是当前能力，不支持行级控制\"。但用户后续**实测确认**端侧已支持 `rows[i].editable: true` 行级控制，且本场景配合下述 columns 写法可达到\"仅新标题行可编辑、其他行只读\"的预期效果。\n>\n> **关键事实（用户实测，与官方初步答复不一致 → 以实测为准）**：\n> - 端侧识别 `rows[i].editable: true`（行级开启编辑）\n> - 端侧对 `columns[i].editable` **省略字段** vs **显式写 `false`** 的处理不同：省略时部分列会被误渲染为可编辑，**必须显式声明 `editable: false`** 才能确保该列只读\n\n#### 协议写法（实测有效形态）\n\n```json\n\"columns\": [\n  { \"key\": \"plan\",  \"label\": \"方案\", \"width\":  80 },                          // 不传 editable（端侧合并列默认只读）\n  { \"key\": \"field\", \"label\": \"属性\", \"width\": 140, \"editable\": false },       // ⚠️ 必须显式 false\n  { \"key\": \"value\", \"label\": \"内容\", \"width\": 620 }                           // 不传 editable，由行级控制\n],\n\"rows\": [\n  { \"plan\": \"方案A\", \"field\": \"方案名称\",     \"value\": \"...\" },                   // 默认只读\n  { \"plan\": \"方案A\", \"field\": \"新标题\",       \"value\": \"...\", \"editable\": true }, // 行级开启\n  { \"plan\": \"方案A\", \"field\": \"生成逻辑...\",  \"value\": \"...\" },                   // 默认只读\n  { \"plan\": \"方案A\", \"field\": \"预估曝光变化\", \"value\": \"...\" }                    // 默认只读\n]\n```\n\n#### 端侧识别行为（用户实测）\n\n| 字段 | 写法 | 端侧行为 |\n|------|------|---------|\n| `columns[].editable` | **省略** | 该列可能被误渲染为可编辑（已观察到现象，原因未深查）|\n| `columns[].editable` | **显式 `false`** | 该列稳定渲染为只读 ✅ |\n| `columns[].editable` | **显式 `true`** | 该列所有 cell 都渲染为可编辑输入框（列级开关）|\n| `rows[i].editable` | **省略** | 该行 cell 受所在列的列级 editable 控制 |\n| `rows[i].editable` | **显式 `true`** | 该行 cell 强制渲染为可编辑输入框（行级覆盖列级） ✅ |\n\n> **本场景的具体配置**：`field` 列显式 `editable: false`、`value` 列省略（不开启列级），仅\"新标题\"行的 `rows[i].editable: true` 让该 cell 可编辑 —— 综合起来达到\"仅新标题行可编辑、其他 7 个 value cell + 全部 8 个 field cell 都只读\"的效果。\n\n#### 业务侧软兜底（防御性，不依赖端侧识别）\n\n无论端侧是否识别行级 editable，Agent 在读取回传 `selectedRows` 时**必须始终遵守**：\n\n| 行 (`field`) | 用户编辑的处理 |\n|--------------|---------------|\n| `新标题` | **采用编辑后值**（作为最终标题写入 `confirm_apply_title`）|\n| `方案名称` | **显式忽略**用户编辑，回传值仅用于\"识别选中方案\"，不参与最终标题构造 |\n| `生成逻辑及优化说明` | **完全忽略**用户编辑，仅作为 UI 展示用途 |\n| `预估曝光变化` | **完全忽略**用户编辑，仅作为 UI 展示用途 |\n\n> **双层保护设计**：\n> - 第一层：协议层 `rows[i].editable` 让端侧物理只读其他 3 行（最理想）\n> - 第二层：Agent 软兜底确保即使第一层失效（端侧不识别），其他 3 行的用户编辑也不会污染最终标题\n>\n> 这样无论端侧版本如何演进，业务正确性都有保障。\n\n### 布局示意（合并单元格 + 组级单选效果）\n\n```\n┌──────┬───────┬────────────────────┬────────────────────────────────────┐\n│  ☐   │ 方案  │ 属性                │ 内容                                │\n├──────┼───────┼────────────────────┼────────────────────────────────────┤\n│      │       │ 方案名称            │ 添加热词优化（规则版）              │\n│      │       ├────────────────────┼────────────────────────────────────┤\n│      │       │ 新标题              │ 304不锈钢保温杯便携大容量 ✎         │\n│  ☐   │ 方案A ├────────────────────┼────────────────────────────────────┤\n│      │       │ 生成逻辑及优化说明   │ 👀 304、不锈钢 / 🔥 保温杯(8500)…   │\n│      │       ├────────────────────┼────────────────────────────────────┤\n│      │       │ 预估曝光变化        │ +15% ~ +25%                        │\n├──────┼───────┼────────────────────┼────────────────────────────────────┤\n│      │       │ 方案名称            │ AI深度重写                          │\n│      │       ├────────────────────┼────────────────────────────────────┤\n│      │       │ 新标题              │ 2026新款304不锈钢保温杯… ✎          │\n│  ☐   │ 方案B ├────────────────────┼────────────────────────────────────┤\n│      │       │ 生成逻辑及优化说明   │ 📈 2026、新款 / 🔥 保温杯(8500)…    │\n│      │       ├────────────────────┼────────────────────────────────────┤\n│      │       │ 预估曝光变化        │ +20% ~ +35%（含年份更新加成）       │\n└──────┴───────┴────────────────────┴────────────────────────────────────┘\n\n图例：\n  ☐  = 整组共用的 checkbox，仅在每组「组首行」渲染（rowSpan = 4）；\n       组内非首行不渲染勾选 td。\n  ✎  = 仅\"新标题\"行可编辑（依靠行级 rows[i].editable: true，详见\n       「行级 editable 协议」小节）；其他 3 行端侧渲染为纯文本只读。\n       即使端侧暂不识别行级 editable，Agent 也会软兜底只采用新标题行的\n       编辑值，其他 3 行编辑被显式忽略。\n  方案A / 方案B 单元格 = plan 列 mergedColumns 自动合并，rowSpan = 4。\n```\n\n> **设计目的**：依靠端侧 `mergedColumns: [\"plan\"]` 实现 plan 列相邻同值的视觉合并；依靠 `selectionGranularity: \"group\"` 让每组共用一个组首 checkbox；依靠 `selectionMode: \"single\"` 让方案 A / 方案 B **互斥**（选 A 后再选 B，A 自动取消）。三者正交叠加，达到\"行 × 列双向合并 + 方案二选一\"的最终效果。\n\n### 构造规则\n\n**\"生成逻辑及优化说明\"行的 `value`** 按四大维度分类词并标注热度，维度之间用 ` / ` 分隔，每个维度内多个词用顿号 `、` 分隔，最后附优化说明：\n\n| 维度 | 对应 tag | 格式示例 |\n|------|---------|---------|\n| 🔥 热词 | `热词` | `🔥 保温杯(热度:8500)、便携(热度:6200)` |\n| 📈 流量获取 | `时间词`、`修饰词` | `📈 2026、新款` |\n| ✨ 吸引力 | `场景词`、`风格词` | `✨ 户外、男女通用` |\n| 👀 买家关注 | `属性词`、`材质词`、`品类词`、`功能词` | `👀 304、不锈钢` |\n\n构造规则：\n\n- **维度间分隔符**：` / `（前后各一个空格）\n- **维度内词间分隔符**：`、`（中文顿号）\n- 如某维度无对应词则**整段省略**（不要保留空的 emoji + 分隔符）\n- `weight` 字段不存在时省略 `(热度:xxxx)` 标注，仅保留词名\n- 最后追加 ` / 优化说明：<optimize_reason 或亮点描述>`，作为最末一段\n\n### 曝光量变化预测规则\n\n1. 新标题每新增 1 个热搜词，预估曝光提升 5%-15%\n2. 含当前年份词（如\"2026新款\"），额外提升 3%-8%\n3. 给出保守区间（如 \"+10% ~ +25%\"）\n\n### 完整数据示例\n\n```json\n{\n  \"type\": \"table\",\n  \"selectionType\": \"title_plan\",\n  \"title\": \"请选择新标题 — 304不锈钢水杯（831034165952）\",\n  \"columns\": [\n    { \"key\": \"plan\", \"label\": \"方案\", \"width\": 80 },\n    { \"key\": \"field\", \"label\": \"属性\", \"width\": 140, \"editable\": false },\n    { \"key\": \"value\", \"label\": \"内容\", \"width\": 620 }\n  ],\n  \"mergedColumns\": [\"plan\"],\n  \"selectionGranularity\": \"group\",\n  \"selectionMode\": \"single\",\n  \"groupBy\": \"plan\",\n  \"actions\": [\n    {\n      \"key\": \"adopt\",\n      \"label\": \"采用此方案\",\n      \"description\": \"用户采用该方案下的新标题（以「新标题」行的最终编辑值为准），后续流程基于选中方案继续落库或上线。\",\n      \"variant\": \"primary\"\n    }\n  ],\n  \"rows\": [\n    { \"plan\": \"方案A\", \"field\": \"方案名称\", \"value\": \"添加热词优化（规则版）\" },\n    { \"plan\": \"方案A\", \"field\": \"新标题\", \"value\": \"304不锈钢保温杯便携大容量\", \"editable\": true },\n    { \"plan\": \"方案A\", \"field\": \"生成逻辑及优化说明\", \"value\": \"👀 304、不锈钢 / 🔥 保温杯(热度:8500)、便携(热度:6200)、大容量(热度:5100) / 优化说明：添加热词保温杯、便携、大容量\" },\n    { \"plan\": \"方案A\", \"field\": \"预估曝光变化\", \"value\": \"+15% ~ +25%；实际效果受商品权重、类目竞争、市场环境等多因素影响，仅供参考\" },\n    { \"plan\": \"方案B\", \"field\": \"方案名称\", \"value\": \"AI深度重写\" },\n    { \"plan\": \"方案B\", \"field\": \"新标题\", \"value\": \"2026新款304不锈钢保温杯 大容量便携户外水杯 男女通用\", \"editable\": true },\n    { \"plan\": \"方案B\", \"field\": \"生成逻辑及优化说明\", \"value\": \"📈 2026、新款 / 👀 304、不锈钢、水杯 / 🔥 保温杯(热度:8500)、便携(热度:6200)、大容量(热度:5100) / ✨ 户外、男女通用 / 优化说明：AI深度重写，融合热词与场景描述\" },\n    { \"plan\": \"方案B\", \"field\": \"预估曝光变化\", \"value\": \"+20% ~ +35%（含年份更新加成）；实际效果受商品权重、类目竞争、市场环境等多因素影响，仅供参考\" }\n  ],\n  \"totalCount\": 8  // 两个方案都成功时为 8；若一方失败则为 4（仅成功方案入表）\n}\n```\n\n> ⚠️ 曝光预估基于关键词热度数据，实际效果受类目竞争、商品权重等多因素影响，仅供参考。\n\n### 回传契约（关键：respond 始终回传展开 rows）\n\n> **核心保证**：无论是 `group` 还是 `single` 模式，端侧 respond 给 Agent 的 `selectedRows` 始终是**展开后的原始行数组**（与 `multiple+row` 模式同构），后端 / 大模型对\"组\"和\"单选\"完全无感。\n\n| 用户操作 | 回传 `selectedRows` | 说明 |\n|---------|----------------------|------|\n| 勾选方案 A 整组并点\"采用此方案\" | 方案 A 对应的 **4 行展开数据**（按原顺序，含 cell 内编辑后的最新 value） | 协议契约：组级勾选 → 展开 4 行回传 |\n| 勾选方案 A 后改勾方案 B 再点\"采用此方案\" | 方案 B 对应的 **4 行展开数据**（A 已被自动取消，不出现在回传中） | `selectionMode: \"single\"` 互斥归一化的结果 |\n| 勾选方案 A 后再次点击方案 A 取消，再点\"采用此方案\" | `[]`（空选 = 跳过，合理语义） | 点击已选项 = 取消 |\n| 不勾选任何方案直接点\"采用此方案\" | `[]`（空选 = 跳过） | 与\"全部取消\"等价 |\n\n> 跳过 / 关闭 弹窗的回传形态由端侧通用机制决定（不属于本交互的协议层定义），Agent 侧只需按下方\"处理逻辑\"判断 `selectedRows` 是否为空即可，无需关心具体跳过形态。\n\n### Agent 处理逻辑（统一兼容 v2 客户端 与 未升级客户端）\n\n收到 `selectedRows` 后，**无需事先判断端侧版本**，按以下统一算法处理。该算法在 v2 客户端上等价于\"读 `selectedRows[0].plan`\"的简单路径，在未升级客户端上自动启用兜底分支。\n\n#### 前置：触发本交互前必须保留的上下文\n\n在触发 `title_comparison_card` 之前，Agent 必须确保以下两份数据**仍可在当前对话上下文中访问**（无需独立缓存模块，依靠 prompt context 中保留的工具调用结果即可）：\n\n- `optimize_title`（方案A）的 CLI 完整返回 JSON\n- `optimize_title_llm`（方案B）的 CLI 完整返回 JSON\n\n> **为什么需要这两份数据**：未升级客户端可能让用户勾选不完整（缺新标题行）或跨方案混选，此时 Agent 需要\"重新触发 `title_comparison_card`\" 来让用户重选 —— 重新触发时 Agent 必须用成功方案的原始返回**重新构造 payload**（仅填入成功方案的行；不能重新调用 CLI，会浪费配额且 LLM 结果不可重现）。在 v2 客户端上这两份数据虽然不会被用到，但保留无开销。\n\n#### Step 1 — 空选判定\n\n- `selectedRows.length === 0` → 视为用户放弃选择\n- 立即回退提示用户：\"是否需要重新生成方案 / 结束本轮优化\"，等待用户回复\n- **禁止**进入 `confirm_apply_title`，**禁止**自行编造标题继续流程\n\n#### Step 2 — 按 `plan` 分组聚合\n\n```\ngroups = group_by(selectedRows, row => row.plan)\n// v2 客户端典型形态：{ \"方案A\": [4 行] }\n// 未升级客户端可能形态：\n//   { \"方案A\": [1 行] }                       — 用户只勾了 1 行\n//   { \"方案A\": [3 行], \"方案B\": [2 行] }       — 跨方案混勾\n//   { \"方案B\": [4 行] }                       — 与 v2 同形态\n```\n\n#### Step 3 — 根据分组数分支处理\n\n| `groups` 的 key 数 | 含义 | 处理 |\n|-------------------|------|------|\n| `1` | v2 客户端正常路径 / 未升级客户端用户只勾了一个方案的若干行 | 进入 Step 4 |\n| `≥ 2` | **仅在未升级客户端可能出现**（v2 互斥单选会拦截）：用户跨方案勾了行 | 走 **Step 3a 重新弹窗** |\n\n##### Step 3a — 跨方案混勾的重新弹窗流程（仅 ≥2 分支）\n\n**严禁**用\"取行数最多的方案\"等启发式猜测算法（用户在未升级客户端的勾选行为可能是任意组合，Agent 没有依据猜测意图，强行猜测会导致采用了用户实际不想要的方案 → 数据污染风险）。\n\n具体执行：\n\n1. 给用户一句对话提示（明文消息，不要塞进 table）：\n   > \"检测到您勾选了多个方案的行（方案 A：N₁ 行 / 方案 B：N₂ 行）。由于本次只能采用一个方案，请在重新弹出的表格中**仅勾选您想采用的那一个方案**，再点「采用此方案」。\"\n2. **重新触发** `title_comparison_card`，**用前置小节提到的成功方案的原始 CLI 返回值重新构造 payload**（仅填入成功方案的行，payload 字段与首次触发相同，包括 4 个 v2 协议字段；**禁止**重新调用 `optimize_title` / `optimize_title_llm`）\n3. 重新等待用户回传，回到 Step 1 重新走一遍\n\n> 在 v2 客户端上 Step 3a 永远不会被执行（互斥单选拦截在端侧），所以这段逻辑只在降级场景下活。\n\n#### Step 4 — 选中行集合完整性校验\n\n设 `selectedFields = selectedRows.map(r => r.field)` 是用户实际勾选了哪些 field（仅唯一方案下的那些行）。\n\n- **必须包含 `\"方案名称\"` 与 `\"新标题\"` 两个 field 中的全部** —— 否则后续的\"读取最终新标题\"会因数据缺失而失效\n- **缺失任一时**：执行 **Step 4a 缺字段重新弹窗**\n\n##### Step 4a — 缺字段时的重新弹窗流程\n\n1. 给用户对话提示：\n   > \"您勾选的行不完整（缺少 `<缺失的 field 列表>`）。为了正确采用方案，请在重新弹出的表格中**勾选包含「方案名称」和「新标题」的完整行集合**。\"\n2. **重新触发** `title_comparison_card`（同 Step 3a 第 2 点：用原始 CLI 返回值重构 payload，禁止重调 CLI）\n3. 重新等待用户回传，回到 Step 1\n\n> 在 v2 客户端上，组级勾选保证整组 4 行齐全，Step 4a 永远不会被执行。\n\n#### Step 5 — （已移除：失败方案不再进入表格）\n\n> 由于失败方案不再进入 rows，表格中所有方案均为成功方案，无需在回传后识别失败方案。直接进入 Step 6。\n\n#### Step 6 — 读取最终新标题（仅采用「新标题」行的编辑值）\n\n在唯一选中方案的所有行里，找 `field === \"新标题\"` 的行（Step 4 已保证此行必然存在）：\n\n- 取该行的 `value` 作为最终新标题\n- **该值可能已被用户在 cell 内编辑过**（依靠行级 `editable: true`），必须以此回传值为准\n- **禁止**回退读 CLI 原始返回里的 `new_title`（用户编辑会被覆盖丢失）\n- **禁止**用其他 field 的 value 当标题\n\n> ⚠️ **关于其他 3 行（方案名称 / 生成逻辑及优化说明 / 预估曝光变化）的用户编辑**：\n> 协议层已通过**不在这 3 行设置** `editable: true` 让端侧渲染为只读（详见「行级 editable 协议」小节）。但万一端侧暂不识别 `rows[i].editable` 退化为\"全部 cell 可编辑\"或\"全部 cell 不可编辑\"，Agent 仍须按以下软兜底处理：\n> - `方案名称` 行的 value 仅用于\"识别选中方案\"，即便被用户改过也不影响判断逻辑，但**不参与最终标题构造**\n> - `生成逻辑及优化说明` 行 / `预估曝光变化` 行的 value **完全不读**，仅作 UI 展示\n> - **严禁**因用户改了其他行就把它当成新标题写入 `confirm_apply_title`\n\n#### Step 7 — 进入应用确认\n\n携带以下参数触发 `confirm_apply_title`：\n\n- 选中方案标识（来自 `groups` 的唯一 key）\n- 最终新标题（Step 6 取到的 `value`，可能含用户编辑）\n- 商品 ID\n- 商品原标题\n\n> **设计原则总结**：\n> - 算法只依赖 `selectedRows` 的扁平结构 + `plan`/`field` 字段语义，不依赖端侧\"组\"/\"单选\"等实现细节\n> - 在 v2 客户端上：Step 3 的 `≥2` 分支与 Step 4 的\"缺字段\"分支永不触发（端侧已保证完整性），算法等价于\"取 `selectedRows[0].plan` + 找新标题行\"的极简路径\n> - 在未升级客户端上：Step 3a / Step 4a 兜底按需启用，依靠 Agent 用 context 中已有的 CLI 原始返回值重构 payload 重新弹窗，**不再调用任何 CLI**，确保不浪费配额、结果可重现\n> - 待 1688 客户端升级到 v2 后：**无需任何文档 / 逻辑回滚**，兜底分支自动失效\n\n### 未升级客户端兜底处理（v2 协议未生效时）\n\n在未升级到 v2 协议的客户端（如当前 1688 工作台 / 找工厂客户端）上，端侧不会做 group 展开和 single 互斥归一化，Agent 收到的 `selectedRows` 形态可能与 v2 不同：\n\n| 场景 | v2 客户端回传 | 未升级客户端回传 |\n|------|--------------|-----------------|\n| 用户勾\"方案A 的 4 行\" | 方案A 的 4 行（自动整组展开）| 方案A 的 4 行（同结果）|\n| 用户只勾\"方案A 的新标题\"行 | 方案A 的 4 行（整组展开）| **只有 1 行**（无展开）|\n| 用户同时勾\"方案A 的 1 行 + 方案B 的 2 行\" | 不可能（互斥单选拦截）| **3 行混合，含两个 plan**（无互斥拦截）|\n| 用户全勾 8 行 | 不可能（互斥单选拦截）| **8 行，含两个 plan** |\n\n**Agent 兜底处理算法**（同时兼容 v2 / 未升级两种端侧）：\n\n1. 按 `plan` 字段对 `selectedRows` 分组，得到 `Map<plan, rows[]>`\n2. 若分组数 = 0 → 视为跳过，与 v2 空选处理一致\n3. 若分组数 = 1 → 直接进入\"识别选中方案 + 读取最终新标题\"流程（与 v2 路径一致）\n4. 若分组数 ≥ 2（仅在未升级客户端可能出现）→ **取行数最多的方案**作为用户意图；行数相同时优先取方案 A；处理后**显式提示用户**：\"检测到您勾选了多个方案的行，已按 `<选中方案>` 处理；如需选择另一方案，请重新勾选并仅保留该方案对应的行\"\n5. 在选定方案的行集合中，找 `field === \"新标题\"` 的行 → 取 `value`；若该 `field` 未被用户勾选 → **回退到原始优化结果中该方案的 `new_title`**（不是编造，而是 CLI 已返回的真实值），并提示用户\"未勾选新标题行，已使用方案默认标题\"\n\n> 本兜底逻辑确保：哪怕端侧暂未升级，Skill 仍然可用；待端侧升级到 v2 后，分组数恒为 0 或 1，兜底分支自动失效，行为与原 v2 设计一致，**无需任何代码 / 文档回滚**。\n\n---\n\n## 4. open_tab_select_product (Open Tab 组件)\n\n### 组件类型\n\n`type: open_tab` — 当用户未提供商品 ID 时，直接输出该 JSON 唤起商品选择页面，**流程到此结束，不允许反问用户，不允许输出其他内容**。\n\n### 触发条件\n\n- 用户触发标题优化意图，但**上下文中没有商品 ID**\n- **禁止反问用户是否要提供商品 ID，禁止询问用户任何问题**\n- 直接输出以下 JSON，流程结束\n\n### 完整数据示例\n\n```json\n{\n  \"type\": \"open_tab\",\n  \"selectionType\": \"shop_backend\",\n  \"url\": \"https://air.1688.com/app/CSBC-modules/csbc-ai-component-loader/picture-optimize.html?mode=newton-select-offer&skillCode=1688-item-title-optimizer\",\n  \"pageTitle\": \"选择商品\",\n  \"pageDescription\": \"选择商品优化标题\",\n  \"icon\": \"https://img.alicdn.com/imgextra/i3/O1CN01gQPY341cm5b1gzS1k_!!6000000003642-2-tps-80-80.png\"\n}\n```\n\n### 行为说明\n\n- 该交互为 **fire-and-forget** 模式，输出 JSON 后流程即结束\n- 聊天区会同步出现一张\"已为你打开商品选择\"的只读气泡卡片\n- **不再执行后续的优化步骤**\n\n---\n\nFile v0.83.0:references/title_llm_SKILL.md\n\n---\nname: title_llm\ndescription: 1688商品标题智能优化助手，基于LLM深度优化标题。只需提供商品ID，一键调用TPP推理服务，自动完成标题的智能重写、年份更新、热词标注和推荐词生成。使用场景：需要深度优化的商品标题、新品发布、标题全面改写。\n---\n\n# 标题智能优化助手 (Title LLM Optimization Assistant)\n\n为 1688 商品提供基于大语言模型的智能标题优化服务。只需提供商品ID，一键调用 TPP 推理服务完成深度优化，无需额外操作。\n\n## ⚠️ 重要：Agent 展示规范\n\n**在展示优化结果时，必须遵守以下规则：**\n\n1. **必须同时显示**：优化结果中必须同时显示原标题（old_title）和新标题（new_title）\n2. **禁止只显示新标题**：不能只显示 new_title，用户需要对比查看\n3. **清晰对比**：建议使用对比格式展示，例如：\n   ```\n   原标题：[old_title]\n   新标题：[new_title]\n   ```\n\n## 快速参考\n\n```python\n# 最简单的调用方式\nfrom interface import optimize_title_llm\n\nresult = optimize_title_llm({\"item_id\": 831034165952})\n\n# 带用户偏好的调用方式\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'单词\"\n})\n```\n\n```bash\n# 命令行调用\npython3 interface.py --function optimize_title_llm --item_id 831034165952\n\n# 带用户偏好的命令行调用\npython3 interface.py --function optimize_title_llm --item_id 831034165952 --preference \"加入防潮单词\"\n```\n\n**核心特点**：\n- ✅ 只需提供 item_id，无需其他参数\n- ✅ 支持用户偏好定制（可选）\n- ✅ 自动完成所有优化步骤\n- ✅ 返回优化后的标题和详细分析\n- ✅ 无需手动获取关键词信息\n- ✅ 无需配置分词器\n\n## 用户偏好参数 (preference)\n\n### 什么是用户偏好参数？\n\n`preference` 参数允许用户通过自然语言指定优化偏好，LLM会在优化标题时考虑这些偏好。\n\n### 如何使用？\n\n**Agent 使用指南**：\n1. **识别用户意图**：当用户在优化请求中提到特定要求时，提取这些要求\n2. **提取偏好**：将用户的自然语言要求整理成简洁的偏好描述\n3. **传入参数**：将偏好作为 `preference` 字段传入 `optimize_title_llm` 函数\n\n### 支持的偏好类型\n\n**关键词偏好**：\n- \"加入'防潮'单词\"\n- \"添加'防摔'和'耐用'关键词\"\n- \"必须包含'304不锈钢'\"\n\n**特点强调**：\n- \"突出材质特点\"\n- \"强调便携性\"\n- \"体现性价比\"\n- \"突出新款和时尚感\"\n\n**风格偏好**：\n- \"标题要简洁\"\n- \"标题要详细\"\n- \"使用专业术语\"\n- \"面向年轻消费者\"\n\n**组合偏好**：\n- \"加入'防潮'单词，同时突出材质特点\"\n- \"强调便携性和大容量，使用简洁风格\"\n\n### 使用示例\n\n#### 示例1：添加特定关键词\n```python\n# 用户说：\"优化这个商品标题，加入'防潮'这个词\"\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'单词\"\n})\n```\n\n#### 示例2：强调特点\n```python\n# 用户说：\"优化标题，要突出材质特点\"\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"突出材质特点\"\n})\n```\n\n#### 示例3：组合要求\n```python\n# 用户说：\"优化标题，加入防潮和防摔，还要强调便携性\"\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'和'防摔'关键词，强调便携性\"\n})\n```\n\n#### 示例4：命令行使用\n```bash\n# 带偏好的命令行调用\npython3 interface.py --function optimize_title_llm \\\n  --item_id 831034165952 \\\n  --preference \"加入防潮单词，突出材质特点\"\n```\n\n### Agent 实现建议\n\n当 Agent 处理用户请求时，应该：\n\n1. **解析用户指令**：识别用户是否有特殊要求\n   ```\n   用户：\"优化商品831034165952的标题，加入'防潮'这个词\"\n   ↓\n   提取：item_id=831034165952, preference=\"加入'防潮'单词\"\n   ```\n\n2. **整理偏好描述**：将用户的要求转换为简洁的偏好描述\n   ```\n   用户：\"这个标题要突出是防水防潮的，还要体现出材质很好\"\n   ↓\n   整理：preference=\"突出防水防潮特点，强调材质优质\"\n   ```\n\n3. **调用接口**：将整理后的偏好传入接口\n   ```python\n   result = optimize_title_llm({\n       \"item_id\": item_id,\n       \"preference\": preference_text\n   })\n   ```\n\n### 注意事项\n\n1. **偏好是可选的**：如果用户没有特殊要求，可以不传 `preference` 参数\n2. **使用自然语言**：偏好描述使用自然语言即可，不需要特殊格式\n3. **保持简洁**：偏好描述应该简洁明了，一般1-2句话即可\n4. **避免冲突**：避免提出互相矛盾的偏好（如\"简洁\"和\"详细\"）\n\n## 核心优势\n\n### LLM 驱动的智能优化\n- 使用大语言模型深度理解商品信息\n- 智能重写标题，而非简单的关键词拼接\n- 自动理解类目特征和用户搜索习惯\n- 生成更自然、更符合用户搜索习惯的标题\n\n### 自动化处理\n- 自动获取商品信息（标题、类目、属性、图片、热搜词）\n- 自动调用 TPP 推理服务进行优化\n- 自动更新年份信息（2023/2024/2025 → 当前年份）\n- 自动标注热词类型\n\n### 智能推荐\n- 提供优化后的标题\n- 标注每个词的类型（热词、属性词等）\n- 推荐其他可添加的高价值热词\n- 展示热词权重和排名信息\n\n## 快速开始\n\n### 命令行调用\n\n使用 interface.py 直接调用，只需提供商品ID：\n\n```bash\npython3 interface.py --function optimize_title_llm --item_id 831034165952\n```\n\n或使用测试脚本：\n\n```bash\ncd scripts\n./test_title_llm.sh\n```\n\n### python3 代码调用\n\n```python\nfrom interface import optimize_title_llm\n\n# 只需传入商品ID\nresult = optimize_title_llm({\"item_id\": 831034165952})\n\n# 带用户偏好的调用\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'单词\"\n})\n\n# 多个偏好\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'和'防摔'单词，突出材质特点\"\n})\n\nif result[\"success\"]:\n    data = result[\"data\"]\n    print(f\"原标题: {data['old_title']}\")\n    print(f\"新标题: {data['new_title']}\")\nelse:\n    print(f\"优化失败: {result['error']}\")\n```\n\n### 返回结果示例\n\n```json\n{\n  \"success\": true,\n  \"error\": null,\n  \"data\": {\n    \"item_id\": 831034165952,\n    \"old_title\": \"304不锈钢水杯\",\n    \"new_title\": \"2026新款304不锈钢保温杯便携大容量运动水杯\",\n    \"new_title_words\": [\n      {\"word\": \"2026\", \"tag\": \"时间词\", \"type\": null, \"description\": \"自动更新至当前年份\"},\n      {\"word\": \"新款\", \"tag\": \"修饰词\", \"type\": null},\n      {\"word\": \"304\", \"tag\": \"属性词\", \"type\": null},\n      {\"word\": \"不锈钢\", \"tag\": \"材质词\", \"type\": null},\n      {\"word\": \"保温杯\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"便携\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"大容量\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"运动\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"水杯\", \"tag\": \"品类词\", \"type\": null}\n    ],\n    \"other_words\": [\n      {\"word\": \"户外\", \"tag\": \"热词\", \"weight\": 8.5, \"min_rnk\": 12, \"description\": \"类目热搜词，排名12，建议添加\"},\n      {\"word\": \"旅行\", \"tag\": \"热词\", \"weight\": 7.2, \"min_rnk\": 18, \"description\": \"类目热搜词，排名18\"}\n    ]\n  }\n}\n```\n\n### 参数说明\n\n**输入参数**：\n- `item_id` (必需): 商品ID，整数类型\n- `preference` (可选): 用户偏好，字符串类型\n  - 从用户指令中提取的优化偏好\n  - 例如：\"加入'防潮'单词\"、\"突出材质特点\"、\"强调便携性\"等\n  - Agent 应从用户的自然语言指令中提取偏好并传入此字段\n\n**返回字段**：\n- `success`: 是否成功，布尔类型\n- `error`: 错误信息，失败时提供\n- `data`: 优化结果数据\n  - `item_id`: 商品ID\n  - `old_title`: 原标题（⚠️ 必须展示）\n  - `new_title`: 优化后的标题（⚠️ 必须展示）\n  - `new_title_words`: 标题词列表，包含每个词的标签和描述\n  - `other_words`: 推荐词列表，未使用的高价值热词\n\n---\n\n## 📋 结果展示规范\n\n### 基本展示格式\n\n**最简格式**（必须包含）：\n```\n原标题：304不锈钢水杯\n新标题：2026新款304不锈钢保温杯便携大容量运动水杯\n```\n\n### 完整展示格式\n\n**推荐格式**（包含详细分析）：\n```\n✅ 优化完成！\n\n原标题：304不锈钢水杯\n新标题：2026新款304不锈钢保温杯便携大容量运动水杯\n\n优化亮点：\n• 自动添加\"2026新款\"，突出时效性\n• 补充\"便携\"、\"大容量\"等高价值热词\n• 标题结构更自然，符合用户搜索习惯\n\n未使用的推荐热词：\n• 户外（权重8.5，排名12）\n• 旅行（权重7.2，排名18）\n```\n\n### ⚠️ 错误示例\n\n**❌ 只显示新标题（禁止）**：\n```\n新标题：2026新款304不锈钢保温杯便携大容量运动水杯\n```\n\n**✅ 正确示例（必须包含原标题）**：\n```\n原标题：304不锈钢水杯\n新标题：2026新款304不锈钢保温杯便携大容量运动水杯\n```\n\n## 功能特点\n\n### 1. 智能标题重写\n\n基于 LLM 的深度优化：\n- **理解商品特征**：自动分析商品类目、属性、图片等信息\n- **智能词序排列**：符合用户搜索习惯的词序\n- **自然语言生成**：生成流畅、自然的标题，避免关键词堆砌\n- **语义相关性**：确保添加的关键词与商品强相关\n\n### 2. 自动年份更新\n\n标题中的年份自动更新为当前年份：\n- 自动识别标题中的 2023、2024、2025 等年份\n- 替换为当前年份（2026）\n- 保持标题时效性，提升用户信任度\n\n### 3. 热词智能标注\n\n自动标注和分析热词：\n- **自动识别**：识别标题中的类目热搜词\n- **类型标注**：区分热词、属性词、修饰词等类型\n- **来源说明**：标注热词来源（类目热搜词）\n- **权重计算**：计算未使用热词的权重和排名\n\n### 4. 推荐词列表\n\n提供高价值的推荐词：\n- **未使用热词**：类目热搜词中未出现在优化后标题的词\n- **权重排序**：按权重和排名排序\n- **详细信息**：展示词的权重、排名、描述\n- **添加建议**：帮助商家进一步优化标题\n\n## 工作原理\n\n### 一键调用流程\n\n`optimize_title_llm` 函数自动完成以下所有步骤：\n\n1. **接收商品ID**：只需提供商品ID参数\n2. **调用TPP服务**：自动发送请求到TPP推理服务（scene: \"title_llm\"）\n3. **TPP后端处理**：\n   - 自动获取商品信息（标题、类目、属性、图片）\n   - 自动获取类目热搜词\n   - 调用LLM模型生成优化标题\n   - 自动更新年份信息\n   - 自动标注热词类型\n   - 自动生成推荐词列表\n4. **返回结果**：获取完整的优化结果\n\n## 使用场景\n\n### 场景1：新品发布\n\n为新上架商品生成高质量标题：\n\n```python\nfrom interface import optimize_title_llm\n\n# 为新品生成优化标题\nresult = optimize_title_llm({\"item_id\": 831034165952})\n\n# 带用户偏好\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"突出新款和材质特点\"\n})\n\nif result[\"success\"]:\n    data = result[\"data\"]\n    print(f\"原标题: {data['old_title']}\")\n    print(f\"新标题: {data['new_title']}\")\n```\n\n**优势**：\n- 一键调用，无需多步操作\n- LLM 深度理解商品特征\n- 生成符合类目特点的标题\n- 自动包含高价值热搜词\n- 支持用户偏好定制\n- 标题更自然、更吸引用户\n\n**展示格式示例**：\n```\n原标题：304不锈钢水杯\n新标题：2026新款304不锈钢保温杯便携大容量运动水杯\n```\n\n### 场景2：标题全面改写\n\n对现有标题进行全面优化改写：\n\n```bash\npython3 interface.py --function optimize_title_llm --item_id 987654321\n```\n\n**适用情况**：\n- 标题质量较差，需要重写\n- 标题过时，需要更新\n- 标题关键词堆砌，需要优化\n- 需要提升标题吸引力\n\n**展示结果时必须包含**：\n```\n原标题：[显示原标题]\n新标题：[显示优化后的标题]\n```\n\n### 场景3：批量优化\n\n批量处理多个商品标题：\n\n```python\nfrom interface import optimize_title_llm\nimport json\n\nitem_ids = [831034165952, 987654321, 555666777]\n\nfor item_id in item_ids:\n    result = optimize_title_llm({\"item_id\": item_id})\n\n    if result[\"success\"]:\n        data = result[\"data\"]\n        print(f\"商品 {item_id}:\")\n        print(f\"  原标题: {data['old_title']}\")\n        print(f\"  新标题: {data['new_title']}\")\n        print()\n    else:\n        print(f\"商品 {item_id} 优化失败: {result['error']}\")\n```\n\n## 自动优化策略\n\nTPP 服务自动执行以下优化策略（无需手动干预）：\n\n### LLM 智能重写\n\n1. **语义理解**：深度理解商品特征和用户需求\n2. **自然表达**：生成流畅、自然的标题文本\n3. **热词融入**：智能融入类目热搜词\n4. **避免堆砌**：避免简单的关键词堆砌\n\n### 年份自动更新\n\n- 自动识别标题中的年份（2023、2024、2025）\n- 统一替换为当前年份（2026）\n- 保持标题时效性和新鲜感\n- 提升用户对新品的感知\n\n### 热词自动标注\n\n- 自动分词并对比类目热搜词列表\n- 自动为每个词添加标签（热词、属性词等）\n- 自动提供词的来源说明\n\n### 推荐词自动生成\n\n- 自动提取未使用的高价值热词\n- 自动计算权重和排名\n- 自动过滤低权重词\n- 自动按权重排序\n\n## 性能特点\n\n### 优化速度\n- **调用耗时**：约 2-5 秒（取决于网络和模型）\n- **处理速度**：比纯规则方法慢，但质量更高\n- **适用场景**：重要商品、新品发布、深度优化\n\n### 优化质量\n- **标题自然度**：★★★★★（LLM 生成，非常自然）\n- **关键词相关性**：★★★★★（语义理解，高度相关）\n- **热词覆盖率**：★★★★☆（智能融入热词）\n- **用户体验**：★★★★★（符合搜索习惯）\n\n### 成本考虑\n- **计算成本**：较高（调用 TPP LLM 服务）\n- **网络依赖**：需要稳定的网络连接\n- **适用规模**：适合中小规模优化或重点商品\n\n## 与 optimize_title 的对比\n\n| 特性 | optimize_title_llm (LLM版本) | optimize_title (规则版本) |\n|------|------------------------------|--------------------------|\n| **调用方式** | 一键调用，只需item_id | 多参数配置 |\n| **优化方式** | LLM 深度重写 | 规则 + 统计 |\n| **优化质量** | ★★★★★ | ★★★★☆ |\n| **优化速度** | 2-5 秒 | < 1 秒 |\n| **标题自然度** | 非常自然 | 较自然 |\n| **操作复杂度** | 极简（一键） | 需要配置多个参数 |\n| **成本** | 较高 | 低 |\n| **适用场景** | 深度优化、新品发布 | 快速优化、批量处理 |\n| **自定义能力** | 有限（模型决定） | 高（支持自定义关键词） |\n\n### 选择建议\n\n**选择 optimize_title_llm 的情况：**\n- 需要一键快速调用\n- 需要高质量的标题优化\n- 新品发布，需要吸引眼球\n- 标题需要全面改写\n- 不想处理复杂的参数配置\n\n**选择 optimize_title 的情况：**\n- 需要快速批量优化\n- 有明确的自定义关键词\n- 对成本敏感\n- 需要精细控制优化策略\n- 需要传入 keyword_info 等额外信息\n\n## 注意事项\n\n### 服务依赖\n- 依赖 TPP 推理服务的可用性\n- 需要稳定的网络连接\n- 服务超时时间为 60 秒\n\n### 结果验证\n- 建议人工审核优化后的标题\n- 检查标题是否符合平台规范\n- 确认标题与商品的相关性\n- 避免违禁词和敏感词\n\n### 使用限制\n- 受 TPP 服务调用频率限制\n- 不支持自定义关键词输入\n- 优化结果由模型决定，可能需要多次尝试\n\n## 技术支持\n\n### 代码位置\n\n- **函数实现**：`src/skills/title_opt/scripts/interface.py::optimize_title_llm`\n- **测试脚本**：`src/skills/title_opt/scripts/test_title_llm.sh`\n- **文档位置**：`src/skills/title_opt/references/title_llm_SKILL.md`\n\n### 配置信息\n\n- **TPP服务URL**：在 `interface.py` 的 `URL` 变量中配置\n- **应用ID**：在 `interface.py` 的 `APP_ID` 变量中配置（当前：51522）\n- **场景标识**：`title_llm`\n\n## 未来优化方向\n\n1. **模型迭代**：持续优化 LLM 模型质量\n2. **自定义能力**：支持用户自定义关键词提示\n3. **批量优化**：支持批量调用和异步处理\n4. **A/B 测试**：对比不同优化策略的效果\n5. **用户反馈**：收集用户反馈，持续改进模型\n\nFile v0.83.0:references/title_optimizer_qa.md\n\n```\n## 常见问题\n\n### Q1: 为什么要并发执行两种方式？\n\n**A**:\n\n- 让用户直接看到两种优化风格的对比\n- 方式A保留原结构，方式B全面改写，各有优势\n- 用户可以根据实际需求选择最合适的标题\n- 并发执行节省时间，两个结果几乎同时返回\n\n### Q2: 用户偏好只对方式B生效吗？\n\n**A**:\n\n- 是的，`preference` 参数只传给 `optimize_title_llm`（方式B）\n- 方式A基于规则和系统推荐，不支持自定义偏好\n- 如果用户有特殊要求，通常方式B的结果会更符合需求\n\n### Q3: 如果两个结果都不满意怎么办？\n\n**A**:\n\n- 可以调整偏好参数，重新优化\n- 可以基于推荐词列表手动调整\n- 可以尝试不同的偏好描述\n\n### Q4: 并发调用会增加成本吗？\n\n**A**:\n\n- 方式A成本很低（规则计算）\n- 方式B成本较高（调用LLM）\n- 总成本主要取决于方式B\n- 但能让用户一次看到两种风格，提升选择效率\n\n### Q5: 会自动应用优化后的标题吗？\n\n**A**:\n\n- 不会自动应用\n- 只提供优化建议和新标题\n- 需要用户选择后确认应用\n- 确保用户完全掌控标题修改\n\n---\n\n```\n\nFile v0.83.0:references/title_wo_llm_SKILL.md\n\n---\nname: title_wo_llm\ndescription: 1688商品标题优化助手，无需LLM即可智能优化标题。通过三步流程（获取关键词信息 → 获取分词器列表并选择 → 使用选定分词器优化标题）提升标题质量。支持自定义关键词、选择分词器。使用场景：优化商品标题、自定义关键词优化。\n---\n\n# 标题优化助手 (Title Optimization Assistant)\n\n为 1688 商品提供智能标题优化服务，基于规则和统计方法（无需 LLM），帮助商家快速提升标题质量、增加曝光和转化。\n\n## 核心优化流程\n\n标题优化采用三步流程，确保优化质量和效率：\n\n### 步骤1：获取关键词信息\n使用 `get_keyword_info` 获取优化所需的所有数据：\n- 类目热搜词（基于真实搜索数据）\n- 高曝光词（该商品的历史曝光关键词）\n- 类目信息和商品属性\n\n### 步骤2：获取分词器列表并选择\n使用 `get_tokenizers` 获取所有可用的分词器：\n- 获取所有预定义的分词器类型和说明\n- 根据用户需求或prompt选择合适的分词器\n- 如果用户没有指定，选择默认分词器（列表第一个）\n\n### 步骤3：调用优化服务\n使用 `optimize_title` 生成优化后的标题：\n- 删除重复词和低频词\n- 添加高相关性热搜词\n- 生成优化说明和推荐词\n\n## 快速开始\n\n### 完整优化流程示例\n\n```bash\n# 步骤1：获取关键词信息\npython3 scripts/interface.py --function get_keyword_info --item_id 123456789\n\n# 步骤2：获取分词器列表\npython3 scripts/interface.py --function get_tokenizers\n\n# 步骤3：优化标题\npython3 scripts/interface.py --function optimize_title --item_id 123456789 --use_llm\n```\n\n### 一键优化（跳过步骤1-2）\n\n如果不需要查看中间结果，可直接调用优化服务：\n\n```bash\npython3 scripts/interface.py --function optimize_title --item_id 123456789\n```\n\n## 功能详解\n\n### 1. get_keyword_info - 获取关键词信息\n\n获取标题优化所需的全部关键词数据。**支持用户自定义关键词输入。**\n\n**命令行：**\n```bash\npython3 scripts/interface.py --function get_keyword_info --item_id <商品ID> [--include_expo_words] [--include_hot_words] [--custom_keywords \"关键词1;关键词2;关键词3\"]\n```\n\n**参数：**\n- `--item_id` (必需): 商品ID\n- `--include_expo_words`: 包含高曝光词（默认True）\n- `--include_hot_words`: 包含类目热搜词（默认True）\n- `--custom_keywords` (可选): 用户自定义关键词，**使用分号分隔**，例如：\"保温杯;不锈钢;便携\"\n\n**使用示例：**\n```bash\n# 基础用法：获取系统推荐的关键词\npython3 scripts/interface.py --function get_keyword_info --item_id 123456789\n\n# 添加自定义关键词\npython3 scripts/interface.py --function get_keyword_info --item_id 123456789 --custom_keywords \"保温杯;不锈钢;大容量;便携\"\n\n# 只使用自定义关键词（不获取系统推荐）\npython3 scripts/interface.py --function get_keyword_info --item_id 123456789 --custom_keywords \"保温杯;不锈钢\" --no-include_hot_words\n```\n\n**返回结果：**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"item_id\": 123456789,\n    \"cate_id\": 50000001,\n    \"cate_name\": \"保温杯/保温瓶\",\n    \"hot_words\": [\"不锈钢\", \"保温杯\", \"便携\", \"大容量\"],\n    \"expo_words\": {\"保温\": 150, \"水杯\": 120},\n    \"custom_keywords\": [\"保温杯\", \"不锈钢\", \"大容量\", \"便携\"],\n    \"cpv\": \"材质:不锈钢;容量:500ml\",\n    \"original_title\": \"304不锈钢水杯\"\n  }\n}\n```\n\n### 2. get_tokenizers - 选择分词器\n\n获取所有分词器列表，并根据用户prompt选择分词器。如果用户没有对分词器进行描述，则选择默认分词器（第一个分词器）。\n\n**命令行：**\n```bash\npython3 scripts/interface.py --function get_tokenizers\n```\n\n**参数：**\n（空）\n\n**返回结果：**\n[{\"tokenizer\": \"qwen-flash\", \"desc\": \"使用qwen-flash模型进行分词\"}]\n\n获取上述结果后，按照用户prompt选择最匹配的分词器。\n\n### 3. optimize_title - 优化标题\n\n执行标题优化，生成优化后的标题。\n\n**命令行：**\n```bash\npython3 scripts/interface.py --function optimize_title --item_id <商品ID> [--use_llm]\n```\n\n**参数：**\n- `--item_id` (必需): 商品ID\n- `--use_llm`: 使用LLM进行热词相关性判断（可选，提升准确性但增加耗时）\n\n**返回结果：**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"item_id\": 123456789,\n    \"old_title\": \"304不锈钢水杯\",\n    \"new_title\": \"304不锈钢保温杯便携\",\n    \"optimize_reason\": \"添加热词:保温杯,便携\",\n    \"new_title_words\": [\n      {\"word\": \"304\", \"tag\": \"属性词\", \"type\": null},\n      {\"word\": \"不锈钢\", \"tag\": \"属性词\", \"type\": null},\n      {\"word\": \"保温杯\", \"tag\": \"热词\", \"type\": \"add\"}\n    ],\n    \"other_words\": [\n      {\"word\": \"大容量\", \"tag\": \"热词\", \"description\": \"类目热搜词，排名5\"}\n    ]\n  }\n}\n```\n\n## 使用场景\n\n### 场景1：新商品发布\n为新上架商品生成优质标题\n\n```bash\n# 步骤1：获取关键词信息\npython3 scripts/interface.py --function get_keyword_info --item_id 123456789\n\n# 步骤2：获取分词器列表\npython3 scripts/interface.py --function get_tokenizers\n# 假设返回: [{\"tokenizer\": \"qwen-flash\", \"desc\": \"...\"}, {\"tokenizer\": \"jieba\", \"desc\": \"...\"}]\n# 用户根据描述选择分词器，例如选择 \"qwen-flash\"\n\n# 步骤3：使用选定的分词器优化标题\npython3 scripts/interface.py --function optimize_title --item_id 123456789 --tokenizer_type qwen-flash --use_llm\n```\n\n### 场景2：自定义关键词优化\n商家想使用特定的关键词优化标题（例如品牌词、活动词等）\n\n```bash\n# 使用自定义关键词\npython3 scripts/interface.py --function get_keyword_info --item_id 123456789 \\\n  --custom_keywords \"双十一;爆款;旗舰店;限时特惠\"\n\n# 然后进行优化\npython3 scripts/interface.py --function optimize_title --item_id 123456789\n```\n\n**使用自定义关键词的优势：**\n- 可以添加品牌词、活动词等特殊关键词\n- 适合有特定营销需求的场景\n- 结合系统推荐词和自定义词，实现精准优化\n\n## 优化策略\n\n### 删除策略\n- **重复词**：标题中出现多次的词\n- **低频词**：类目中搜索量极低的词\n- **无效词**：对搜索无帮助的词\n\n### 添加策略\n- **高热度词**：类目热搜词，排名靠前\n- **高曝光词**：该商品历史高曝光的词\n- **高相关性**：与商品强相关的词（使用LLM判断）\n- **自定义词**：用户指定的关键词（品牌词、活动词等）\n\n### 长度控制\n优化后标题长度不超过 60 个字符（中文按2计，英文按1计）\n\n## 技术特点\n\n### 无需LLM的快速优化\n- 基于规则和统计的方法\n- 优化速度快（< 1秒）\n- 成本低，适合大规模应用\n\n### 可选LLM增强\n- 使用 `--use_llm` 参数启用\n- 提升热词相关性判断准确率\n- 耗时增加约0.5-1秒\n\n### 数据驱动\n- IGrpah图数据库：类目热搜词、词频统计\n- Hologres数据仓库：商品曝光数据\n- 实时计算：相似度分析、权重计算\n\nFile v0.83.0:scripts/Skill 交互接入快速指南 (Quick Start).md\n\n# Skill 交互接入快速指南 (Quick Start)\n\n本指南旨在帮助 Skill 开发者**快速接入** Newton Agent 的客户端交互能力。只需两步：**声明 Metadata** 和 **正文引导**。\n\n---\n\n## 1. 第一步：在 Metadata 中声明交互 (必选)\n\n在 `SKILL.md` 的 YAML Frontmatter 中添加 `interactions` 列表。这是框架识别和大模型发现交互能力的**唯一入口**。\n\n### 核心字段速查\n\n| 字段 | 说明 | 示例值 |\n| --- | --- | --- |\n| `name` | **交互唯一 ID**，大模型调用时使用 | `select_products` |\n| `type` | **组件类型**：`table` (表格), `card` (卡片), `input` (问答) | `table` |\n| `selectionType` | **数据类型标识**，决定云端存哪里 | `product`, `merchant` |\n| `description` | **业务语义**，告诉大模型何时用 | \"从结果中选择商品\" |\n| `required_data` | **数据槽位**，简要描述需要的数据 | `{ products: \"商品列表\" }` |\n\n### 快速复制模板\n\n```yaml\n---\nmetadata:\n  interactions:\n    - name: select_products_for_inquiry\n      type: table\n      selectionType: product\n      description: \"从搜索结果中选择要询盘的商品\"\n      required_data:\n        products: \"商品列表数组，每项包含 id, title, price\"\n---\n\n```\n---\n\n## 2. 第二步：在正文中引导大模型 (可选但推荐)\n\n在 `SKILL.md` 正文中，用自然语言告诉大模型**何时触发**、**如何填数**，以及**去哪里查规范**。\n\n### 引导话术示例\n\n> **触发时机**： 在执行 `text_search` 获得商品列表后，若用户表现出挑选意向，请调用 `show_interaction` 并设置 `name='select_products_for_inquiry'`。**数据填充**： 将 `text_search` 返回的 `items` 数组赋值给 `products` 槽位。**具体的字段映射规则与组件渲染数据结构请查阅** [`**references/interaction-specs.md**`](./references/interaction-specs.md) **中对应交互的章节。**\n\n#### 📌 完整引导案例（推荐直接复制）\n\n以下是一个完整的 Skill 正文引导示例，展示了如何严格遵循\"先查 specs、再构造参数\"的流程：\n\n⚠️ **交互渲染（必须执行）**：当此命令返回的 `data.data.products` 包含 ≥2 个商品时，禁止直接用 Markdown 表格输出商品数据，必须通过交互组件渲染：\n\n1.  **先读取** `{baseDir}/references/interaction-specs.md` 中的 `select_products_from_scoring` 章节，获取交互组件的完整数据结构定义\n    \n2.  **再触发** metadata.interactions 中声明的 `select_products_from_scoring` 交互，严格按 specs 中的字段映射构造参数\n    \n3.  **调用示例**：\n    \n\n### ⚠️ 关键约定\n\n---\n\n## 3. 三种组件的快速参考\n\n根据你的业务场景，选择对应的 `type`：\n\n### A. Table (表格选择) - 适合结构化数据多选\n\n*   **场景**：商品列表、订单筛选。\n    \n*   **Metadata 示例**：\n    \n\n### B. Card (选项卡片) - 适合快速偏好选择\n\n*   **场景**：风格选择、平台确认。端侧会自动追加“输入其他”。\n    \n*   **Metadata 示例**：\n    \n\n### C. Input (澄清问答) - 适合细节确认与自由输入\n\n*   **场景**：预算确认、备注填写。\n    \n*   **Metadata 示例**：\n    \n    ### D 打开 Tab 标签页 - 适合页面跳转与外部资源展示\n    \n    输出 type='open\\_tab' 时，客户端立即在工作区右侧新开一个 webview Tab，加载指定 URL 并渲染指定页面名称；工具不等用户操作即返回（fire-and-forget），聊天区同步出现一张\"已为你打开 xxx\"的只读气泡卡片\n    \n    ---\n    \n    ## 3.5 真实交互 Case 速查\n    \n    以下是三种组件在实际场景中的**完整可拷贝示例**，可直接作为 `show_interaction` 的入参参考。\n    \n    ### 通用字段速查（所有 case 通用）\n    \n    | 字段 | 适用类型 | 说明 |\n    | --- | --- | --- |\n    | `type` | 必填 | `card` / `table` / `input` |\n    | `selectionType` | 可选 | 数据类型标识（`product` / `merchant` / `style` / `requirement` 等），影响 UI 标签和云端分类 |\n    \n    #### card / input 专属（`questions[ ]` 内字段）\n    \n    | 字段 | 类型 | 默认 | 说明 |\n    | --- | --- | --- | --- |\n    | `question` | string | — | 问题文本，**支持 Markdown 渲染**（加粗、链接、列表、行内代码、`\\n` 换行） |\n    \n    | `options`\n    \n*   [ ] | — | 候选选项，2~6 个；不传或传 \n    \n\n`[ ]` 表示纯自由输入题 |\n\n| `allowMultiple` | boolean | `false` | 是否多选；多选题端侧自动出现「全选 / 取消全选」按钮（选项 ≥2 时） | | `required` | boolean | `false` | 是否必填；**默认可跳过**，端侧会显示「跳过此题」按钮，跳过的题回传 `{ answer: null, skipped: true }` |\n\n#### table 专属\n\n| 字段 | 类型 | 说明 |\n| --- | --- | --- |\n| `title` | string | 表格标题，**支持 Markdown 渲染** |\n\n| `columns[ ].editable` | boolean | 该列是否可在表格中直接编辑 |\n\n| `columns[ ].width` | number | 列宽（像素），不传自适应 |\n\n| `totalCount` | number | 总数据量提示（与 `rows.length` 可不一致，用于分页场景） | | `actions` | array | **自定义按钮**，配置后追加在「确认选择」右侧；点击后会把选中行 + 该按钮的 `description` 一起回传给大模型；不配置时仅展示「跳过」+「确认选择」 |\n\n#### open\\_tab 组件\n\n### 数据字段定义\n\n*   `**url**` (必填)\n    \n    *   类型: `string`\n        \n    *   约束: 必须以 `http://\\` 或 `https://\\` 开头\n        \n    *   映射规则: 从 `shop_query_tool` 的 `backend_url` 字段取值，拼接业务 query 参数\n        \n*   `**pageTitle**` (必填)\n    \n    *   类型: `string`\n        \n    *   建议长度: ≤ 20 字符（超出会在 Tab 上被 `...` 截断）\n        \n    *   映射规则: `${platformName} ${pageSubject}`，如 `\"Ozon 订单管理\"`\n        \n*   `**pageDescription**` (可选)\n    \n    *   类型: `string`\n        \n    *   长度: ≤ 80 字符\n        \n    *   用途: 在气泡卡片第二行展示，告诉用户页面做了哪些\n        \n*   `**iconUrl**` (可选)\n    \n    *   类型: `string`（http/https URL）\n        \n    *   用途: 卡片左侧的 18×18 方形图标；不传则显示默认 🌐\n        \n\n### 完整数据示例\n\n```json\n{\n  \"type\": \"open_tab\",\n  \"selectionType\": \"shop_backend\",\n  \"url\": \"https://seller.ozon.ru/app/orders\",\n  \"pageTitle\": \"Ozon 店铺订单\",\n  \"pageDescription\": \"查看今日待发货订单\"\n}\n\n```\n> **端侧默认能力**（无需在参数里声明，自动可用）：\n\n---\n\n### Case 1：Input 多步澄清（含必填、可跳过、Markdown 渲染、纯自由输入混合）\n\n典型场景：在启动一个新需求前，连续向用户确认项目类型、模块、规模、上线时间等多维度信息。`questions` 是有序数组，端侧会按顺序逐题展示。\n\n**本 case 演示**：\n\n*   通过 `required: true` 把「项目类型」「团队规模」标为必填，其余题可跳过\n    \n*   通过 `allowMultiple: true` + `required: false` 让多选题既能多选也能跳过\n    \n*   通过 Markdown 在 question 文本里加 `**加粗**`、`\\n` 换行、行内代码 ``code`` 来增强可读性\n    \n*   通过 `options: [ ]` 表示纯自由输入题\n    \n\n**回传结构**（同时演示已答 + 跳过的回传形态）：\n\n```json\n[\n  { \"question\": \"...\", \"answer\": \"电商系统\" },\n  { \"question\": \"...\", \"answer\": [\"用户管理\", \"订单系统\"] },\n  { \"question\": \"...\", \"answer\": null, \"skipped\": true }\n]\n\n```\n\n**调用入参**：\n\n```json\n{\n    \"type\": \"input\",\n    \"selectionType\": \"project_info\",\n    \"questions\": [\n        {\n            \"question\": \"**第一步**：您的项目类型是？\\n\\n> 不同类型对应不同的技术栈推荐。\",\n            \"options\": [\"电商系统\", \"社交平台\", \"企业管理系统\", \"其他\"],\n            \"allowMultiple\": false,\n            \"required\": true\n        },\n        {\n            \"question\": \"**第二步**：您需要哪些功能模块？（可多选，可跳过）\",\n            \"options\": [\"用户管理\", \"订单系统\", \"支付集成\", \"数据分析\", \"消息通知\", \"文件存储\"],\n            \"allowMultiple\": true,\n            \"required\": false\n        },\n        {\n            \"question\": \"**第三步**：您的团队规模是？\",\n            \"options\": [\"1-5人\", \"6-20人\", \"21-50人\", \"50人以上\"],\n            \"required\": true\n        },\n        {\n            \"question\": \"**第四步**：预期的上线时间？\\n\\n（如不确定可跳过此题，我们后续再讨论）\",\n            \"options\": [\"1个月内\", \"3个月内\", \"半年内\", \"1年内\"],\n            \"allowMultiple\": false,\n            \"required\": false\n        },\n        {\n            \"question\": \"**第五步**：您关注哪些非功能性指标？（可多选）\",\n            \"options\": [\"性能\", \"安全\", \"可扩展性\", \"可维护性\", \"合规性\"],\n            \"allowMultiple\": true,\n            \"required\": false\n        },\n        {\n            \"question\": \"**第六步**：目标用户群体？\",\n            \"options\": [\"个人消费者\", \"中小企业\", \"大型企业\", \"政府机构\"],\n            \"required\": false\n        },\n        {\n            \"question\": \"**第七步**：是否有其他特殊需求？请用一句话描述。\\n\\n例如：`需要对接钉钉` / `必须支持私有化部署`\",\n\n            \"options\": [ ],\n\n            \"required\": false\n        }\n    ]\n}\n\n```\n---\n\n### Case 2：Card 选项卡片（风格偏好收集，全部可跳过 + 多选全选）\n\n典型场景：在生图 / 生文等创意类任务前，快速收集用户的风格偏好。所有题目均设为可跳过，让用户对没强偏好的维度直接放过；多选题端侧会自动出现「全选」按钮。\n\n**本 case 演示**：\n\n*   全部题目 `required` 省略（即默认 false，可跳过）\n    \n*   多选题（颜色偏好、风格关键词）端侧自动出现「全选 / 取消全选」按钮\n    \n*   Markdown 在 question 中说明每个维度的语义\n    \n\n**调用入参**：\n\n```json\n{\n    \"type\": \"card\",\n    \"selectionType\": \"style\",\n    \"questions\": [\n        {\n            \"question\": \"**整体风格**：你希望作品偏向哪种基调？\",\n            \"options\": [\"简约\", \"复古\", \"科技感\", \"国潮\", \"暗黑\"],\n            \"allowMultiple\": false\n        },\n        {\n            \"question\": \"**主色调**：可选多个，端侧会出现「全选」按钮，方便你一键选齐。\",\n            \"options\": [\"黑白灰\", \"暖色系\", \"冷色系\", \"莫兰迪\", \"高饱和\", \"霓虹\"],\n            \"allowMultiple\": true\n        },\n        {\n            \"question\": \"**风格关键词**（可多选，可跳过）\",\n            \"options\": [\"极简\", \"繁复\", \"写实\", \"插画\", \"抽象\", \"故事感\"],\n            \"allowMultiple\": true\n        },\n        {\n            \"question\": \"**目标受众**：作品主要给谁看？\",\n            \"options\": [\"Z世代\", \"都市白领\", \"亲子家庭\", \"高净值人群\", \"通用\"],\n            \"allowMultiple\": false\n        }\n    ]\n}\n\n```\n---\n\n### Case 3：Table 表格选择（含可编辑列 + Markdown 标题）\n\n典型场景：商品列表批量选择，部分列允许用户在表格内直接修改（如名称、价格、类目）。\n\n**本 case 演示**：\n\n*   `columns[ ].editable: true` 让指定列可编辑\n    \n*   `title` 使用 Markdown 加粗 + 行内代码强调操作要点\n    \n*   端侧表头自动出现「全选 / 取消全选」按钮（行数 ≥2 时）\n    \n\n**调用入参**：\n\n```json\n{\n    \"type\": \"table\",\n    \"selectionType\": \"product\",\n    \"title\": \"请选择并修改商品信息 — **可直接在表格内编辑** `名称 / 价格 / 类目`\",\n    \"columns\": [\n        { \"key\": \"id\", \"label\": \"商品ID\", \"width\": 100 },\n        { \"key\": \"name\", \"label\": \"商品名称\", \"width\": 200, \"editable\": true },\n        { \"key\": \"price\", \"label\": \"价格(元)\", \"width\": 120, \"editable\": true },\n        { \"key\": \"stock\", \"label\": \"库存\", \"width\": 80 },\n        { \"key\": \"category\", \"label\": \"类目\", \"width\": 120, \"editable\": true },\n        { \"key\": \"status\", \"label\": \"状态\", \"width\": 100 }\n    ],\n    \"rows\": [\n        { \"id\": \"1001\", \"name\": \"无线蓝牙耳机 Pro\", \"price\": \"299\", \"stock\": 156, \"category\": \"电子产品\", \"status\": \"在售\" },\n        { \"id\": \"1002\", \"name\": \"机械键盘 RGB版\", \"price\": \"599\", \"stock\": 42, \"category\": \"电脑配件\", \"status\": \"在售\" },\n        { \"id\": \"1003\", \"name\": \"人体工学椅\", \"price\": \"1299\", \"stock\": 8, \"category\": \"办公家具\", \"status\": \"库存紧张\" },\n        { \"id\": \"1004\", \"name\": \"4K显示器 27寸\", \"price\": \"2499\", \"stock\": 23, \"category\": \"电脑配件\", \"status\": \"在售\" },\n        { \"id\": \"1005\", \"name\": \"智能手表\", \"price\": \"899\", \"stock\": 67, \"category\": \"穿戴设备\", \"status\": \"新品\" }\n    ],\n    \"totalCount\": 5\n}\n\n```\n---\n\n### Case 4：Table + 自定义 Actions（落库 / 下单 / 重新搜索）\n\n典型场景：选完商品后，用户可以选择不同的「下一步动作」。每个按钮都会把选中行 + 自己的 `description` 一起回传给大模型，让大模型在确认数据的同时直接得到「该做什么」的指令。\n\n**本 case 演示**：\n\n*   `actions` 数组配置 3 个自定义按钮，覆盖 `primary` / `default` / `destructive` 三种 variant\n    \n*   每个按钮的 `description` 是给大模型的\"附加任务指令\"，**不会展示给用户**（用户看到的只是 `label`）\n    \n*   「跳过」+「确认选择」按钮始终保留（端侧默认行为，无需声明）\n    \n\n**回传结构**：\n\n用户点了自定义按钮（以「落库」为例）时：\n\n```json\n{\n  \"selectionType\": \"product\",\n  \"data\": {\n    \"selectedRows\": [ { \"id\": \"1001\", \"name\": \"...\", ... } ],\n    \"action\": {\n      \"key\": \"store_to_db\",\n      \"label\": \"落库\",\n      \"description\": \"把选中的商品数据直接写入到 ods_product_pool 表，跳过人工确认环节\"\n    }\n  }\n}\n\n```\n\n用户点了默认「确认选择」时（兼容老逻辑）：\n\n```json\n{\n  \"selectionType\": \"product\",\n  \"data\": { \"selectedRows\": [ ... ], \"action\": \"confirm\" }\n}\n\n```\n\n用户点了「跳过」时：\n\n```json\n{\n  \"selectionType\": \"product\",\n\n  \"data\": { \"selectedRows\": [ ], \"action\": \"skip\" }\n\n}\n\n```\n\n**调用入参**：\n\n```json\n{\n    \"type\": \"table\",\n    \"selectionType\": \"product\",\n    \"title\": \"请选择目标商品，并通过下方按钮告诉我要执行哪一种后续操作\",\n    \"columns\": [\n        { \"key\": \"id\", \"label\": \"商品ID\", \"width\": 100 },\n        { \"key\": \"name\", \"label\": \"商品名称\", \"width\": 220 },\n        { \"key\": \"price\", \"label\": \"价格\", \"width\": 100 },\n        { \"key\": \"stock\", \"label\": \"库存\", \"width\": 80 }\n    ],\n    \"rows\": [\n        { \"id\": \"1001\", \"name\": \"无线蓝牙耳机 Pro\", \"price\": \"¥299\", \"stock\": 156 },\n        { \"id\": \"1002\", \"name\": \"机械键盘 RGB版\",   \"price\": \"¥599\", \"stock\": 42  },\n        { \"id\": \"1003\", \"name\": \"人体工学椅\",       \"price\": \"¥1299\",\"stock\": 8   }\n    ],\n    \"totalCount\": 3,\n    \"actions\": [\n        {\n            \"key\": \"store_to_db\",\n            \"label\": \"落库\",\n            \"description\": \"把选中的商品数据直接写入到 ods_product_pool 表，跳过人工确认环节\",\n            \"variant\": \"primary\"\n        },\n        {\n            \"key\": \"create_order\",\n            \"label\": \"立即下单\",\n            \"description\": \"对选中的商品创建采购订单，使用默认收货地址，订单状态置为待支付\",\n            \"variant\": \"primary\"\n        },\n        {\n            \"key\": \"research_again\",\n            \"label\": \"重新搜索\",\n            \"description\": \"用户对当前结果不满意，请放大搜索范围（去掉品牌限定、扩大价格区间到 ±50%）后重新调用 text_search\",\n            \"variant\": \"default\"\n        },\n        {\n            \"key\": \"blacklist\",\n            \"label\": \"加入黑名单\",\n            \"description\": \"把选中的商品 ID 加入用户黑名单，后续搜索结果中永不出现\",\n            \"variant\": \"destructive\"\n        }\n    ]\n}\n\n```\n> `**variant**` **视觉效果速查**：\n\n---\n\n### Case 5：open\\_tab 打开店铺后台\n\n```markdown\n典型场景：用户问\"我店铺今天有多少待发货订单\"，大模型判断需要跳转到后台页面时，直接打开对应页面，并继续往下回答或\n执行下一步（fire-and-forget 的关键优势）。\n{\n  \"type\": \"open_tab\",\n  \"selectionType\": \"shop_backend\",\n  \"url\": \"https://work.1688.com/home/page/index.htm\",\n  \"pageTitle\": \"Ozon 店铺订单\",\n  \"pageDescription\": \"查看今日待发货订单\"\n}\n```\n\n## 4. \n\n## 关键注意事项 (避坑指南)\n\n1.  `**selectionType**` **必须准**：填 `product` 还是 `merchant` 直接决定数据存入哪张表，请勿随意填写。\n    \n2.  **Table 不能为空**：调用 `table` 类型交互前，务必确保 `rows` 有真实数据，否则前端会报错。\n    \n3.  **细节下沉**：Metadata 中只写**槽位名**和**简要描述**。复杂的 JSON 结构、Props 定义和数据映射规则应写入 `references/interaction-specs.md`，实现声明与实现的解耦。\n    \n\n**推荐目录结构**：\n\n```text\nmy-skill/\n├── SKILL.md                      # 轻量级声明与业务逻辑\n└── references/\n    └── interaction-specs.md      # 详细的组件 Props 与数据格式定义\n\n```\n---\n\n## 5. `references/interaction-specs.md` 编写规范\n\n该文档是 Skill 内部的**交互详细说明书**，供大模型在调用 `show_interaction` 前查阅，确保数据结构正确。\n\n### 编写原则\n\n1.  **一个交互一节**：每个在 Metadata 中声明的 `interactions` 条目，对应文档中的一个章节，标题与 `name` 一致。\n    \n2.  **聚焦数据结构**：只写**渲染数据结构**和**字段映射规则**，不要重复 Metadata 中已有的业务描述。\n    \n3.  **给出真实示例**：提供一段可直接拷贝的 JSON 示例，便于大模型对照填充。\n    \n\n### 标准模板\n\n```markdown\n# 交互组件详细规范\n\n本文档定义了本 Skill 中所有交互组件的具体数据结构与映射规则。\n\n## 1. <交互 name> (<组件类型> 组件)\n\n### 组件类型\n`type: table` | `card` | `input`\n\n### 数据槽位定义\n- **`<槽位名>`**:\n  - 类型: `Array<Object>` / `String` / ...\n  - 映射规则: 描述该槽位的数据从哪个 Tool 的哪个字段转换而来。\n  - 必须字段: 列出对象内必须包含的 key。\n\n### 框架自动填充的字段（如有）\n说明框架会根据 `selectionType` 自动注入哪些默认值（如 Table 的 `columns`），Skill 无需手动指定。\n\n```json\n[\n  { \"key\": \"imageUrl\", \"label\": \"图片\", \"width\": 80 },\n  { \"key\": \"title\", \"label\": \"商品标题\" },\n  { \"key\": \"price\", \"label\": \"价格\" }\n]\n\n```\n\n### 完整数据示例\n\n```json\n{\n  \"products\": [\n    { \"id\": \"p1\", \"title\": \"示例商品\", \"price\": 99, \"imageUrl\": \"https://...\" }\n  ]\n}\n\n```\n```plaintext\n\n### 编写要点速查\n\n| 章节 | 必须包含 | 说明 |\n| :--- | :--- | :--- |\n| 组件类型 | ✅ | 与 Metadata 的 `type` 保持一致 |\n| 数据槽位定义 | ✅ | 每个 `required_data` 槽位都要展开 |\n| 映射规则 | ✅ | 明确指出数据来源的 Tool 与字段路径 |\n| 框架自动填充 | ⭕ | 仅 `selectionType` 有内置模板时需要写 |\n| 完整数据示例 | ✅ | 一段可直接拷贝的 JSON |\n\n---\n\n\n*更多详细技术实现请参考：[SIMPLE_INTERACTION_PROTOCOL.md](./SIMPLE_INTERACTION_PROTOCOL.md)*\n\n\n```\n\nFile v0.83.0:capabilities/get_keyword_info.md\n\n# get_keyword_info — 获取关键词信息\n\n## 功能说明\n\n获取标题优化所需的全部关键词数据，包括类目热搜词、高曝光词、类目信息和商品属性。支持用户自定义关键词输入。\n\n## 前置条件\n\n- 已配置 AK（通过 `cli.py configure YOUR_AK` 或设置环境变量 `ALI_1688_AK`）\n\n## CLI 调用\n\n```bash\n# 基础调用\npython3 {baseDir}/cli.py get_keyword_info --item_id <商品ID>\n\n# 添加自定义关键词\npython3 {baseDir}/cli.py get_keyword_info --item_id <商品ID> --custom_keywords \"保温杯;不锈钢;便携\"\n```\n\n**参数说明**：\n\n| 参数 | 类型 | 必需 | 说明 |\n|------|------|------|------|\n| `--item_id` | int | 是 | 商品ID |\n| `--include_expo_words` | flag | 否 | 包含高曝光词（默认 True） |\n| `--include_hot_words` | flag | 否 | 包含类目热搜词（默认 True） |\n| `--custom_keywords` | str | 否 | 自定义关键词，分号分隔 |\n\n## 返回数据说明\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| item_id | int | 商品ID |\n| cate_id | int | 类目ID |\n| cate_name | String | 类目名称 |\n| hot_words | Array | 类目热搜词列表 |\n| expo_words | Object | 高曝光词及曝光量 |\n| custom_keywords | Array | 用户自定义关键词 |\n| cpv | String | 商品属性 |\n| original_title | String | 原标题 |\n\n## 输出格式\n\n### 成功输出\n\n```json\n{\n  \"success\": true,\n  \"markdown\": \"✅ 关键词信息获取成功\",\n  \"data\": {\n    \"item_id\": 123456789,\n    \"cate_id\": 50000001,\n    \"cate_name\": \"保温杯/保温瓶\",\n    \"hot_words\": [\"不锈钢\", \"保温杯\", \"便携\", \"大容量\"],\n    \"expo_words\": {\"保温\": 150, \"水杯\": 120},\n    \"custom_keywords\": [\"保温杯\", \"不锈钢\", \"大容量\", \"便携\"],\n    \"cpv\": \"材质:不锈钢;容量:500ml\",\n    \"original_title\": \"304不锈钢水杯\"\n  }\n}\n```\n\n## 异常处理\n\n| 异常场景 | 处理方式 |\n|---------|---------|\n| AK 未配置 | 提示用户配置 AK |\n| 商品ID 未提供 | 提示用户提供 --item_id 参数 |\n| 签名无效（401） | 提示用户检查 AK 是否有效 |\n| 请求被限流（429） | 建议用户等待 1-2 分钟后重试 |\n\nFile v0.83.0:capabilities/get_tokenizers.md\n\n# get_tokenizers — 获取分词器列表\n\n## 功能说明\n\n获取所有可用的分词器列表及说明。根据用户需求或 prompt 选择合适的分词器。如果用户没有指定，选择默认分词器（列表第一个）。\n\n## 前置条件\n\n- 已配置 AK（通过 `cli.py configure YOUR_AK` 或设置环境变量 `ALI_1688_AK`）\n\n## CLI 调用\n\n```bash\npython3 {baseDir}/cli.py get_tokenizers\n```\n\n**无参数**，返回所有可用分词器列表。\n\n## 返回数据说明\n\n成功时返回 `data` 对象，包含 `tokenizers` 数组：\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| tokenizer | String | 分词器类型标识 |\n| desc | String | 分词器描述 |\n\n## 输出格式\n\n### 成功输出\n\n```json\n{\n  \"success\": true,\n  \"markdown\": \"✅ 分词器列表获取成功\",\n  \"data\": {\n    \"tokenizers\": [\n      {\"tokenizer\": \"qwen-flash\", \"desc\": \"使用qwen-flash模型进行分词\"}\n    ]\n  }\n}\n```\n\n## 异常处理\n\n| 异常场景 | 处理方式 |\n|---------|---------|\n| AK 未配置 | 提示用户配置 AK |\n| 签名无效（401） | 提示用户检查 AK 是否有效 |\n| 请求被限流（429） | 建议用户等待 1-2 分钟后重试 |\n\n## 使用说明\n\n1. 获取分词器列表后，根据用户需求选择合适的分词器\n2. 如果用户没有指定，默认使用列表中的第一个分词器\n3. 选定的分词器类型可传入 `optimize_title` 的 `--tokenizer_type` 参数\n\nFile v0.83.0:capabilities/optimize_title_llm.md\n\n# optimize_title_llm — LLM 深度重写\n\n## 功能说明\n\n基于大语言模型的智能标题重写方式。LLM 深度理解商品特征后全面改写标题，生成更自然流畅的标题，自动更新年份、融入热词。支持用户偏好定制（如\"加入'防潮'单词\"）。\n\n## 前置条件\n\n- 已配置 AK（通过 `cli.py configure YOUR_AK` 或设置环境变量 `ALI_1688_AK`）\n\n## CLI 调用\n\n```bash\n# 基础调用\npython3 {baseDir}/cli.py optimize_title_llm --item_id <商品ID>\n\n# 带用户偏好\npython3 {baseDir}/cli.py optimize_title_llm --item_id <商品ID> --preference \"加入防潮单词\"\n```\n\n**参数说明**：\n\n| 参数 | 类型 | 必需 | 说明 |\n|------|------|------|------|\n| `--item_id` | int | 是 | 商品ID |\n| `--preference` | str | 否 | 用户偏好，自然语言描述优化偏好 |\n\n## 用户偏好参数 (preference)\n\n`preference` 参数允许用户通过自然语言指定优化偏好，LLM 会在优化标题时考虑这些偏好。\n\n**支持的偏好类型**：\n\n- **关键词偏好**：\"加入'防潮'单词\"、\"添加'防摔'和'耐用'关键词\"\n- **特点强调**：\"突出材质特点\"、\"强调便携性\"、\"体现性价比\"\n- **风格偏好**：\"标题要简洁\"、\"面向年轻消费者\"\n- **组合偏好**：\"加入'防潮'单词，同时突出材质特点\"\n\n**Agent 偏好提取关键词**：\n\n| 用户表述 | 偏好类型 |\n|---------|---------|\n| \"加入xxx\"、\"添加xxx\"、\"包含xxx\" | 关键词偏好 |\n| \"突出xxx\"、\"强调xxx\"、\"体现xxx\" | 特点强调 |\n| \"要xxx风格\"、\"面向xxx\" | 风格偏好 |\n\n## 返回数据说明\n\n成功时返回 `data` 对象，包含以下字段：\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| item_id | int | 商品ID |\n| old_title | String | 原标题（⚠️ 必须展示） |\n| new_title | String | 优化后的标题（⚠️ 必须展示） |\n| new_title_words | Array | 标题词列表，包含每个词的标签和描述 |\n| other_words | Array | 推荐词列表，未使用的高价值热词 |\n\n## 输出格式\n\n### 成功输出\n\n```json\n{\n  \"success\": true,\n  \"markdown\": \"✅ 标题优化完成（LLM深度重写）\",\n  \"data\": {\n    \"item_id\": 831034165952,\n    \"old_title\": \"304不锈钢水杯\",\n    \"new_title\": \"2026新款304不锈钢保温杯便携大容量运动水杯\",\n    \"new_title_words\": [\n      {\"word\": \"2026\", \"tag\": \"时间词\", \"type\": null, \"description\": \"自动更新至当前年份\"},\n      {\"word\": \"新款\", \"tag\": \"修饰词\", \"type\": null},\n      {\"word\": \"304\", \"tag\": \"属性词\", \"type\": null},\n      {\"word\": \"不锈钢\", \"tag\": \"材质词\", \"type\": null},\n      {\"word\": \"保温杯\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"便携\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"大容量\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"运动\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"水杯\", \"tag\": \"品类词\", \"type\": null}\n    ],\n    \"other_words\": [\n      {\"word\": \"户外\", \"tag\": \"热词\", \"weight\": 8.5, \"min_rnk\": 12, \"description\": \"类目热搜词，排名12，建议添加\"}\n    ]\n  }\n}\n```\n\n### 失败输出\n\n```json\n{\n  \"success\": false,\n  \"markdown\": \"❌ AK 未配置\\n\\n运行: `cli.py configure YOUR_AK`\",\n  \"data\": {}\n}\n```\n\n## 异常处理\n\n| 异常场景 | 处理方式 |\n|---------|---------|\n| AK 未配置 | 提示用户配置 AK |\n| 商品ID 未提供 | 提示用户提供 --item_id 参数 |\n| 签名无效（401） | 提示用户检查 AK 是否有效 |\n| 请求被限流（429） | 建议用户等待 1-2 分钟后重试 |\n| 服务异常（500） | 提示用户稍后重试 |\n\n## 展示规范\n\n展示时必须：\n1. **必须同时显示**原标题（old_title）和新标题（new_title）\n2. **禁止只显示新标题**\n3. 如有推荐词（other_words），可一并展示供参考\n4. 如用户提供了偏好，需在展示中标注\"已考虑您的偏好\"\n\n## 与 optimize_title 的对比\n\n| 特性 | optimize_title_llm | optimize_title |\n|------|-------------------|---------------|\n| 优化方式 | LLM 深度重写 | 规则 + 统计 |\n| 优化质量 | ★★★★★ | ★★★★☆ |\n| 优化速度 | 2-5 秒 | < 1 秒 |\n| 标题自然度 | 非常自然 | 较自然 |\n| 成本 | 较高 | 低 |\n| 偏好支持 | ✅ 支持 preference | ❌ 不支持 |\n\nFile v0.83.0:capabilities/optimize_title.md\n\n# optimize_title — 添加热词优化（规则版）\n\n## 功能说明\n\n基于规则和统计的标题优化方式。保留原标题结构，通过删除低效词和添加高价值热搜词来优化标题。成本低、速度快，适合快速批量处理。\n\n## 前置条件\n\n- 已配置 AK（通过 `cli.py configure YOUR_AK` 或设置环境变量 `ALI_1688_AK`）\n\n## CLI 调用\n\n```bash\npython3 {baseDir}/cli.py optimize_title --item_id <商品ID>\n```\n\n**参数说明**：\n\n| 参数 | 类型 | 必需 | 说明 |\n|------|------|------|------|\n| `--item_id` | int | 是 | 商品ID |\n\n## 返回数据说明\n\n成功时返回 `data` 对象，包含以下字段：\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| item_id | int | 商品ID |\n| old_title | String | 原标题（⚠️ 必须展示） |\n| new_title | String | 优化后的标题（⚠️ 必须展示） |\n| optimize_reason | String | 优化说明 |\n| new_title_words | Array | 标题词列表，包含每个词的标签和类型 |\n| other_words | Array | 推荐词列表，未使用的高价值热词 |\n\n## 输出格式\n\n### 成功输出\n\n```json\n{\n  \"success\": true,\n  \"markdown\": \"✅ 标题优化完成（添加热词方式）\",\n  \"data\": {\n    \"item_id\": 831034165952,\n    \"old_title\": \"304不锈钢水杯\",\n    \"new_title\": \"304不锈钢保温杯便携大容量\",\n    \"optimize_reason\": \"添加热词:保温杯,便携,大容量\",\n    \"new_title_words\": [\n      {\"word\": \"304\", \"tag\": \"属性词\", \"type\": null},\n      {\"word\": \"不锈钢\", \"tag\": \"属性词\", \"type\": null},\n      {\"word\": \"保温杯\", \"tag\": \"热词\", \"type\": \"add\"}\n    ],\n    \"other_words\": [\n      {\"word\": \"大容量\", \"tag\": \"热词\", \"description\": \"类目热搜词，排名5\"}\n    ]\n  }\n}\n```\n\n### 失败输出\n\n```json\n{\n  \"success\": false,\n  \"markdown\": \"❌ AK 未配置\\n\\n运行: `cli.py configure YOUR_AK`\",\n  \"data\": {}\n}\n```\n\n## 异常处理\n\n| 异常场景 | 处理方式 |\n|---------|---------|\n| AK 未配置 | 提示用户配置 AK |\n| 商品ID 未提供 | 提示用户提供 --item_id 参数 |\n| 签名无效（401） | 提示用户检查 AK 是否有效 |\n| 请求被限流（429） | 建议用户等待 1-2 分钟后重试 |\n| 服务异常（500） | 提示用户稍后重试 |\n\n## 展示规范\n\n展示时必须：\n1. 同时显示原标题（old_title）和新标题（new_title）\n2. 显示优化说明（optimize_reason）\n3. 如有推荐词（other_words），可一并展示供参考\n\nFile v0.83.0:skill-card.md\n\n## Description:\n\nOptimizes 1688 product titles by generating rule-based hot-keyword suggestions and LLM-based rewrites with optional user preferences.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[1688aiinfra](https://clawhub.ai/user/1688aiinfra)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\n1688 merchants and commerce operators use this skill to compare rule-based and LLM-generated product title improvements, inspect keyword rationale, and confirm a selected title before applying it.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill uses a 1688 merchant access key for live product-title operations.\n\nMitigation: Install it only for workflows where that credential use is expected, and review access-key handling before deployment.\n\nRisk: When no shop is specified, the skill defaults to running title optimization across every bound shop.\n\nMitigation: Scope requests to a named shop or loginId when broad multi-shop changes are not intended.\n\nRisk: Generated titles may be applied externally after user confirmation.\n\nMitigation: Review the selected title and confirm carefully before allowing any one-click title update.\n\nRisk: The skill contacts gateway.1688.com and retrieves bound-shop metadata.\n\nMitigation: Confirm that these network and telemetry expectations match the deployment environment.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/1688aiinfra/skills/1688-item-title-optimizer)\n- [1688AiInfra publisher profile](https://clawhub.ai/user/1688aiinfra)\n- [Product selection interaction](https://air.1688.com/app/CSBC-modules/csbc-ai-component-loader/picture-optimize.html?mode=newton-select-offer&skillCode=1688-item-title-optimizer)\n- [interaction-specs.md](artifact/references/interaction-specs.md)\n- [title_llm_SKILL.md](artifact/references/title_llm_SKILL.md)\n- [title_wo_llm_SKILL.md](artifact/references/title_wo_llm_SKILL.md)\n- [title_optimizer_qa.md](artifact/references/title_optimizer_qa.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [JSON command results with Markdown summaries and interactive selection payloads]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires Python and a configured 1688 merchant access key for live title and keyword operations.]\n\n## Skill Version(s):\n\n0.83.0 (source: server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v0.1.0: 36 files, 66268 bytes\n\nFiles: capabilities/get_keyword_info.md (2143b), capabilities/get_tokenizers.md (1426b), capabilities/optimize_title_llm.md (4410b), capabilities/optimize_title.md (2453b), cli.py (2657b), references/interaction-specs.md (37177b), references/title_llm_SKILL.md (16809b), references/title_optimizer_qa.md (1182b), references/title_wo_llm_SKILL.md (7132b), scripts/__init__.py (0b), scripts/_auth.py (5003b), scripts/_const.py (701b), scripts/_errors.py (1217b), scripts/_http.py (4665b), scripts/_output.py (960b), scripts/_tracker.py (2418b), scripts/capabilities/__init__.py (0b), scripts/capabilities/configure/__init__.py (0b), scripts/capabilities/configure/cmd.py (2144b), scripts/capabilities/configure/service.py (3211b), scripts/capabilities/get_keyword_info/__init__.py (0b), scripts/capabilities/get_keyword_info/cmd.py (1482b), scripts/capabilities/get_keyword_info/service.py (1237b), scripts/capabilities/get_tokenizers/__init__.py (0b), scripts/capabilities/get_tokenizers/cmd.py (583b), scripts/capabilities/get_tokenizers/service.py (556b), scripts/capabilities/optimize_title_llm/__init__.py (0b), scripts/capabilities/optimize_title_llm/cmd.py (994b), scripts/capabilities/optimize_title_llm/service.py (947b), scripts/capabilities/optimize_title/__init__.py (0b), scripts/capabilities/optimize_title/cmd.py (815b), scripts/capabilities/optimize_title/service.py (808b), scripts/Skill 交互接入快速指南 (Quick Start).md (20008b), skill-card.md (2855b), SKILL.md (25742b), _meta.json (144b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: 1688-item-title-optimizer\ndescription: |\n  1688 商品标题智能优化助手 —— 自动并发执行两种优化算法生成结果。\n  工具能力：添加热词优化（快速、基于规则）和 LLM 深度重写（高质量、自然流畅），支持用户偏好参数。\n  触发词：优化标题、标题优化、改标题、重写标题、商品标题、标题改写。\nmetadata:\n  openclaw:\n    emoji: \"✏️\"\n    requires:\n      bins:\n        - python\n  interactions:\n    - name: open_tab_select_product\n      type: open_tab\n      selectionType: shop_backend\n      description: \"当用户未提供商品ID时，直接输出该JSON唤起商品选择页面，流程结束，禁止反问用户\"\n      required_data:\n        url: \"商品选择页面URL\"\n        pageTitle: \"选择商品\"\n        pageDescription: \"选择商品优化标题\"\n        icon: \"图标URL\"\n    - name: confirm_apply_title\n      type: card\n      selectionType: requirement\n      description: \"用户选定标题后，确认是否应用到商品\"\n      required_data:\n        questions: \"展示选定标题并询问是否应用\"\n    - name: select_items_to_optimize\n      type: table\n      selectionType: product\n      description: \"当用户传入≥3个商品ID时，在左侧弹出表格让用户筛选要优化的商品\"\n      required_data:\n        title: \"表格标题\"\n        columns: \"列定义数组：商品ID、当前标题\"\n        rows: \"商品列表，每项包含 itemId、title\"\n    - name: title_comparison_card\n      type: table\n      selectionType: title_plan\n      description: \"两种优化方案生成后，在左侧弹出表格供用户选择新标题。3列（方案+属性+内容），每个成功方案4个维度各占一行（两个都成功=8行，一个成功一个失败=仅展示成功方案的4行，两个都失败=不弹表格直接提示重试）。利用端侧 show_interaction.table v2 协议的 mergedColumns + groupBy + selectionGranularity:group + selectionMode:single 实现方案列相邻同值合并 + 组级互斥单选，用户勾选整组后点击「采用此方案」按钮\"\n      required_data:\n        title: \"表格标题：请选择新标题 + 商品名称（商品ID）\"\n        columns: \"固定3列：plan（方案标识，宽80，不传 editable）、field（属性标签，宽140，必须显式声明 editable:false 否则会被端侧误渲染为可编辑，用户实测确认）、value（内容，宽620，不传 editable，由行级 rows[i].editable 控制）。配合行级 editable：仅新标题行 rows[i] 加 editable:true 时该 cell 可编辑，其他 cell 全部只读\"\n        mergedColumns: \"[\\\"plan\\\"]。协议硬约束：列必须存在；不能含列级 editable:true 的列。本场景 value 已不开列级 editable，但仍只合并 plan，因为 value 每行内容都不同没有相邻同值\"\n        groupBy: \"\\\"plan\\\"。selectionGranularity=group 时必填，按plan相邻同值切分组\"\n        selectionGranularity: \"\\\"group\\\"。勾选粒度按组（每组组首行渲染一个checkbox，rowSpan=组大小）\"\n        selectionMode: \"\\\"single\\\"。互斥单选：选新组自动取消旧组；点已选项=清空；空选=跳过。与 selectionGranularity 正交\"\n        actions: \"[{key:adopt, label:采用此方案, variant:primary, description:...}]，覆盖默认「确认选择」\"\n        rows: \"4行或8行（rows.length≤10，超过会触发分页关闭合并）。仅填入成功方案的行，失败方案不展示。两个都成功=8行，一个成功一个失败=4行，两个都失败=不弹表格。同方案的4行 plan 必须填相同值且连续排列：方案名称、新标题（仅这行 rows[i].editable:true，可cell内编辑）、生成逻辑及优化说明、预估曝光变化\"\n        respond_contract: \"selectedRows 始终回传展开后的N行（与 multiple+row 同构），Agent 按 plan 分组、按 field=新标题 取最终value（含编辑），空选视为跳过。无论端侧是否识别行级 editable，Agent 必须软兜底：只采用「新标题」行的编辑值，其他 3 行编辑显式忽略\"\n---\n\n# 1688-item-title-optimizer — 商品标题智能优化\n\n## 技能概述\n\n1688 商品标题智能优化助手。自动并发执行两种优化算法生成结果：1) 添加热词优化（快速、基于规则）2) LLM 深度重写（高质量、自然流畅）。只需提供商品 ID，即可同时获得两种优化方案供对比选择。支持用户偏好参数（如\"加入'防潮'单词\"）。\n\n## 使用场景\n\n- 商品标题修改、改写、优化\n- 新品发布，需要高质量标题\n- 批量优化商品标题\n- 用户有特定优化偏好（如指定关键词、风格）\n\n## CLI 命令\n\n### configure — 配置 AK\n\n```bash\n# 查看 AK 状态\npython3 {baseDir}/cli.py configure\n# 设置 AK\npython3 {baseDir}/cli.py configure YOUR_AK\n```\n\n配置网关鉴权所需的 AK。所有操作命令都依赖 AK，首次使用前需先配置。\n\n### optimize_title — 添加热词优化（方式A）\n\n```bash\npython3 {baseDir}/cli.py optimize_title --item_id <商品ID>\n```\n\n基于规则和统计的标题优化，保留原标题结构，快速添加高价值热搜词。\n\n### optimize_title_llm — LLM 深度重写（方式B）\n\n```bash\n# 基础调用\npython3 {baseDir}/cli.py optimize_title_llm --item_id <商品ID>\n\n# 带用户偏好\npython3 {baseDir}/cli.py optimize_title_llm --item_id <商品ID> --preference \"加入防潮单词\"\n```\n\n基于大语言模型的智能标题重写，全面改写标题，支持用户偏好定制。\n\n### get_keyword_info — 获取关键词信息\n\n```bash\n# 基础调用\npython3 {baseDir}/cli.py get_keyword_info --item_id <商品ID>\n\n# 添加自定义关键词\npython3 {baseDir}/cli.py get_keyword_info --item_id <商品ID> --custom_keywords \"保温杯;不锈钢;便携\"\n```\n\n获取标题优化所需的全部关键词数据（热搜词、曝光词、类目信息）。\n\n### get_tokenizers — 获取分词器列表\n\n```bash\npython3 {baseDir}/cli.py get_tokenizers\n```\n\n获取所有可用的分词器列表及说明。\n\n## ⚠️ 重要：技能skill 使用规范\n\n### 规则2：获取到商品ID后，自动并发执行两种优化\n\n当用户请求标题优化时，**必须按以下步骤执行，关键节点需等待用户确认后再继续**：\n\n1. **⏸️ 参数要求（硬性阻断点）**：如果用户未提供商品 ID，**严禁**弹 card 询问，必须按规则1输出JSON\n\n2. **⏸️ 多商品澄清（≥3 个商品时必须触发）**：\n   - 如果用户一次传入 **3 个及以上商品 ID**，**必须先触发** `select_items_to_optimize` 交互，让用户筛选需要优化的商品\n   - 展示所有商品 ID 及其当前标题（如能获取），让用户选择要优化的商品\n   - **必须等待用户选择后再继续**，禁止自动对所有商品执行优化\n   - 如果用户传入 1-2 个商品，可直接跳过此步骤进入下一步\n\n3. **自动执行**：收到用户的优化请求后（或用户在澄清点选定商品后），**必须自动并发调用**两种优化命令\n\n4. **并发调用**：在同一个消息中同时发起两个工具调用：\n   - `optimize_title`（方式A：添加热词优化）\n   - `optimize_title_llm`（方式B：AI深度重写）\n\n5. **提取偏好**：如果用户在请求中提到特殊要求（如\"加入'防潮'单词\"），提取偏好并传入 `optimize_title_llm` 的 `--preference` 参数\n\n6. **展示结果：触发 `title_comparison_card`**（`type: table`，在左侧弹出表格）\n   - 3 列（方案 + 属性 + 内容），每个方案 4 行（方案名称、新标题、生成逻辑及优化说明、预估曝光变化）\n   - 利用 `mergedColumns: [\"plan\"]` + `selectionGranularity: \"group\"` + `groupBy: \"plan\"` + `selectionMode: \"single\"` 实现方案列合并单元格 + 组级单选勾选\n   - 通过 `actions` 配置一个 `key: \"adopt\"` / `label: \"采用此方案\"` / `variant: \"primary\"` 的按钮替代默认\"确认选择\"\n   - **rows 的 `plan` 字段：同组所有 4 行都填相同方案名**（如全部填\"方案A\"或全部填\"方案B\"），端侧依靠相同值进行合并和分组\n\n7. **⏸️ 应用确认**\n   - 向用户展示选定的新标题，与原标题对比\n   - 触发 `confirm_apply_title` 交互，让用户选择：\n     - ✅ 确认，应用到商品标题\n     - ✏️ 我想手动微调后再应用（用户可输入修改后的标题）\n     - 💾 仅记录，暂不应用\n   - **必须等待用户确认后再继续**，禁止自动跳过\n\n8. **应用到商品**：\n   - 如果用户确认应用，且存在技能 `1688-item-one-click`，则调用技能更新商品标题\n   - 如果用户手动微调了标题，使用微调后的版本应用\n\n**具体的交互组件数据结构请查阅 [`references/interaction-specs.md`](./references/interaction-specs.md) 中对应交互的章节。**\n\n### 规则3：结果展示规范（左侧 Table 表格）\n\n展示时必须使用 `title_comparison_card`（**`type: table`**）交互组件，在左侧弹出表格，3 列（方案 + 属性 + 内容），每个方案 4 行，方案列合并为大单元格，组级互斥单选勾选。\n\n> ⚠️ **端侧版本依赖（v2 协议）**：本交互依赖 `mergedColumns` / `selectionGranularity` / `selectionMode` / `groupBy` 4 个 v2 字段，**仅在已升级到 v2 的客户端**才会生效。当前 1688 工作台 / 找工厂客户端尚未升级，会**忽略**这 4 个字段，退化为默认的 `row + multiple`（每行一个 checkbox、可任意多勾、无方案列合并）。\n>\n> **Agent 必须知道**：\n> - **payload 不要为兼容降级而修改**——协议字段写法是正确的，等客户端升级即可自动生效\n> - **看到「每行一个 checkbox」不是 payload 错了**，是端侧降级渲染\n> - 处理 `selectedRows` 时**必须用下方\"用户回传后处理\"统一兼容算法**，不能假设回传一定是同一方案的 4 行\n> - 完整端侧能力对比与降级表见 `references/interaction-specs.md` 中\"端侧版本依赖\"小节\n\n**展示规范**（`title_comparison_card`）：\n\n1. **`title`**：格式为\"请选择新标题 — 商品名称（商品ID）\"\n2. **`columns` 固定 3 列**：\n   - `plan`（方案标识列，宽 80px，**不传** `editable`）\n   - `field`（属性标签列，宽 140px，**必须显式声明** `editable: false`）—— ⚠️ 用户实测：省略 `editable` 字段会让端侧把该列误渲染为可编辑，**显式写 `false`** 才能保证只读\n   - `value`（内容列，宽 620px，**列级不传** `editable`，由行级 `rows[i].editable: true` 仅在\"新标题\"行开启）\n\n   ⚠️ **行级 editable 协议（2026-05 用户实测有效）**：1688 端侧官方曾答复\"列级 editable 不支持行级控制\"，但**用户实测确认**端侧已支持 `rows[i].editable: true` 行级控制。本场景配合\"`field` 列显式 `editable: false` + `value` 列不传 + 仅新标题行 `rows[i].editable: true`\"的组合写法，达到\"仅新标题行可编辑、其他所有 cell 都只读\"的预期效果。\n   \n   **双层保护（防御性设计）**：即使端侧某天回退、行级 editable 失效，Agent 在读取回传时**仍必须**软兜底：只采用「新标题」行的编辑值，其他 3 行编辑显式忽略（详见下方\"用户回传后处理\"第 6 步），保证业务正确性不依赖于端侧能力\n3. **v2 协议合并/勾选字段（4 个，缺一不可）**：\n   - `mergedColumns: [\"plan\"]`：方案列按**相邻同值**合并为大 rowSpan 单元格\n   - `groupBy: \"plan\"`：按方案字段切分相邻分组（`selectionGranularity:\"group\"` 时必填）\n   - `selectionGranularity: \"group\"`：勾选**单位**为组（每组组首行渲染一个 checkbox，整组共用）\n   - `selectionMode: \"single\"`：勾选**数量**为单选（方案 A / B 互斥；选新组自动取消旧组；点已选项 = 清空；空选 = 跳过）\n4. **协议硬约束**（违反会被主进程 validator 拒绝 / 端侧渲染异常）：\n   - `mergedColumns` 中的列**不能是列级 `editable: true`** —— 本场景 `value` 列已改为不开启列级 editable（用行级 `rows[i].editable` 替代），所以约束自动满足；仍只合并 `plan`，因为 `value` 每行内容不同没有相邻同值可合并\n   - **`field` 列必须显式 `editable: false`**（不可省略）—— 用户实测：省略时端侧会把该列误渲染为可编辑\n   - `rows.length ≤ 10` —— 超过会触发端侧分页并自动关闭合并；本场景最多 8 行（仅成功方案入表），安全\n   - 同方案的所有行 `plan` 字段必须**填相同值且连续排列**（不能\"方案A、方案B、方案A\"这样交错），否则相邻同值合并失效\n5. **`actions` 自定义按钮**：配置 `[{ key: \"adopt\", label: \"采用此方案\", variant: \"primary\", description: \"...\" }]` 替代默认\"确认选择\"\n6. **`rows` 仅填入成功方案的行（4 行或 8 行，严禁填入失败方案的行）**：两个都成功 = 方案 A 4 行 + 方案 B 4 行共 8 行；一个成功一个失败 = 仅成功方案的 4 行（**禁止**为失败方案填占位行）；两个都失败 = 不弹表格。每方案 4 个属性维度，**行级 editable 配置**（仅\"新标题\"行设 `editable: true`，端侧识别后这 3 行渲染只读）：\n   - 方案名称（**不设** `editable`，端侧默认只读；即使端侧不识别行级 editable，Agent 也忽略此行编辑值）\n   - **新标题**（**设** `\"editable\": true`，可 cell 内编辑；**用户编辑会被采用**为最终标题）\n   - 生成逻辑及优化说明（**不设** `editable`，端侧默认只读；Agent 完全不读此行编辑值）\n   - 预估曝光变化（**不设** `editable`，端侧默认只读；Agent 完全不读此行编辑值）\n7. **生成逻辑维度构造**（写入\"生成逻辑及优化说明\"行的 `value`，按热度 `weight` 标注）：\n   - 🔥 热词（tag=`热词`）：词名(热度:weight值)\n   - 📈 流量获取（tag=`时间词`/`修饰词`）\n   - ✨ 吸引力（tag=`场景词`/`风格词`）\n   - 👀 买家关注（tag=`属性词`/`材质词`/`品类词`/`功能词`）\n8. **📈 曝光量变化预测（必须）**：基于热词数据给出\"+X% ~ +Y%\"区间，写入\"预估曝光变化\"行的 `value`，必须附带\"实际效果受类目竞争、商品权重、市场环境等多因素影响，仅供参考\"免责说明（具体规则见 `references/interaction-specs.md` 中\"曝光量变化预测规则\"小节）\n9. **部分失败处理（严禁展示失败方案）**：若任一方案 CLI 返回 `success: false` 或异常，**直接跳过该方案**，rows 中**仅填入成功方案的 4 行**，**禁止**为失败方案填入任何占位行/兜底行。具体规则：\n   - **一个成功一个失败** → `title_comparison_card` 只展示成功方案的 4 行（`rows.length = 4`）；由于只有 1 个方案可选，用户直接勾选该方案即可；在对话中简要告知用户另一方案本次未生成成功\n   - **两个都失败** → **不弹** `title_comparison_card` 表格；直接在对话中告知用户\"两种优化方案均未生成成功，建议稍后重试\"，并提示可重新触发优化\n   - **两个都成功** → 正常展示 8 行（不变）\n\n**用户回传后处理**（统一兼容 v2 客户端 与 未升级客户端，**无需事先判断端侧版本**，按此顺序执行）：\n\n> **前置要求**：触发本交互之前，Agent 必须确保 `optimize_title`（方案A）和 `optimize_title_llm`（方案B）的 CLI 完整返回 JSON **仍可在当前对话上下文中访问**（用于降级场景下重新弹窗时重构 payload，**禁止**为此重新调用 CLI）。\n\n1. **空选判定**：`selectedRows.length === 0` → 视为跳过，**禁止**进入 `confirm_apply_title`，应回退询问\"是否重新生成 / 结束优化\"\n\n2. **按 `plan` 字段分组聚合**：`groups = group_by(selectedRows, row => row.plan)`\n\n3. **跨方案混勾的兜底**（分组数 ≥ 2，仅未升级客户端可能出现）：**严禁**用\"取行数最多的方案\"等启发式猜测算法。必须：\n   1. 给用户对话提示：\"检测到您勾选了多个方案的行（方案 A：N₁ 行 / 方案 B：N₂ 行），由于本次只能采用一个方案，请在重新弹出的表格中**仅勾选您想采用的那一个方案**，再点「采用此方案」\"\n   2. **重新触发 `title_comparison_card`**，用前置小节提到的成功方案的原始 CLI 返回值**重新构造 payload**（仅填入成功方案的行；**禁止**重新调用 `optimize_title` / `optimize_title_llm`）\n   3. 等待新一轮回传，从第 1 步重新走\n\n4. **缺字段的兜底**（分组数 = 1 但唯一方案的行集合中缺少 `\"方案名称\"` 或 `\"新标题\"`，仅未升级客户端可能出现）：\n   1. 给用户对话提示：\"您勾选的行不完整（缺少 `<缺失的 field 列表>`），请在重新弹出的表格中**勾选包含「方案名称」和「新标题」的完整行集合**\"\n   2. **重新触发 `title_comparison_card`**（同第 3 步：用原始 CLI 返回值重构 payload，**禁止**重调 CLI）\n   3. 等待新一轮回传，从第 1 步重新走\n\n5. **（已移除）**：由于失败方案不再进入表格，无需在回传后识别失败方案。直接进入第 6 步\n\n6. **读取最终新标题（仅采用「新标题」行的编辑值）**：在唯一选中方案的行集合里找 `field === \"新标题\"` 的行（第 4 步已保证此行存在），取其 `value`（**可能已被用户在 cell 内编辑**，以此为准，**禁止**回退读 CLI 原始 `new_title`，**禁止**用其他 field 的 value 当标题）。\n   - ⚠️ **关于其他 3 行的用户编辑**：协议层已通过**不在这 3 行设置** `editable: true` 让端侧渲染为只读。但万一端侧暂不识别 `rows[i].editable` 退化为\"全部 cell 可编辑\"，Agent 仍须**显式忽略**这些行的编辑值（双层保护）：\n     - 方案名称行的 value 仅用于\"识别选中方案\"，**不参与最终标题构造**\n     - 生成逻辑 / 预估曝光变化 行的 value **完全不读**，仅作 UI 展示\n     - **严禁**因用户改了其他行就把它当成新标题写入 `confirm_apply_title`\n\n7. **进入应用确认**：携带\"方案标识（来自分组的唯一 key）+ 最终新标题（仅来自「新标题」行的编辑值）+ 商品 ID + 商品原标题\"触发 `confirm_apply_title`\n\n> **设计原则**：上述算法只依赖 `selectedRows` 的扁平结构 + `plan`/`field` 字段语义，不依赖端侧\"组\"/\"单选\"实现细节。在 v2 客户端上第 3、4 步的兜底永不触发（端侧已保证完整性），算法退化为\"取 `groups` 唯一 key + 找新标题行\"的极简路径；在未升级客户端上兜底按需启用，依靠 context 中已有的 CLI 原始返回值重构 payload 重新弹窗，**不再调用任何 CLI**。**待 1688 客户端升级到 v2 后无需任何回滚**。完整算法说明见 `references/interaction-specs.md` 中\"Agent 处理逻辑\"小节。\n\n### 规则4：用户偏好提取\n\n如果用户在优化请求中提到特殊要求，需要提取并传入 `--preference` 参数：\n\n**识别偏好的关键词**：\n\n- \"加入xxx\"、\"添加xxx\"、\"包含xxx\" → 提取关键词\n- \"突出xxx\"、\"强调xxx\"、\"体现xxx\" → 提取特点要求\n- \"要xxx风格\"、\"面向xxx\" → 提取风格要求\n\n**示例**：\n\n```\n用户：\"优化商品831034165952的标题，加入'防潮'这个词\"\n  ↓\n提取：preference = \"加入'防潮'单词\"\n  ↓\n调用：cli.py optimize_title_llm --item_id 831034165952 --preference \"加入'防潮'单词\"\n```\n\n## 安全声明\n\n| 风险级别 | 命令 | Agent 行为 |\n|---------|------|----------|\n| 只读 | configure | 可直接执行，无需确认 |\n| 只读 | optimize_title | 可直接执行，无需确认 |\n| 只读 | optimize_title_llm | 可直接执行，无需确认 |\n| 只读 | get_keyword_info | 可直接执行，无需确认 |\n| 只读 | get_tokenizers | 可直接执行，无需确认 |\n\n> 所有命令均为只读操作，不会修改商品标题。优化结果仅供参考，需用户确认后手动应用。\n\n## 异常处理\n\n任何命令输出 `success: false` 时：\n\n1. **先输出 `markdown` 字段**（已包含用户可读的错误描述）\n2. **再根据关键词追加引导**：\n\n| markdown 关键词 | Agent 额外动作 |\n|----------------|--------------|\n| \"AK 未配置\" 或 \"签名无效\" 或 \"401\" | 提示用户当前发送能力所需鉴权未就绪，请补充有效 AK 或检查鉴权配置后重试 |\n| \"限流\" 或 \"429\" | 建议用户等待 1-2 分钟后重试 |\n| 其他 | 仅输出 markdown 即可 |\n\n## 环境变量（.env）\n\n项目根目录的 `.env` 文件存储 skill 基础信息，供埋点上报等模块读取。发布到不同环境时可直接替换该文件中的变量值。\n\n| 变量 | 默认值 | 说明 |\n|------|--------|------|\n| `SKILL_NAME` | `1688-item-title-optimizer` | skill 名称 |\n| `SKILL_VERSION` | `1.0.0` | skill 版本号 |\n| `SKILL_CHANNEL` | `clawhub` | 发布渠道 |\n\n> 已存在的系统环境变量优先级高于 `.env`，CI/CD 注入的变量不会被覆盖。\n\n## 埋点上报\n\n每次 CLI 命令执行时，自动向 skill 网关上报一次调用记录，用于统计 skill 调用次数。\n\n- **实现位置**：`scripts/_tracker.py` → `report_skill_usage()`，在 `cli.py` 的 `main()` 中每次命令执行后自动调用\n- **上报接口**：`POST /api/reportSkillsUsage/1.0.0`\n- **上报参数**：\n\n  | 参数 | 值来源 | 说明 |\n  |------|--------|------|\n  | `apiName` | 固定 `null` | 固定传 null |\n  | `skillsName` | `.env` `SKILL_NAME` | skill 名称 |\n  | `version` | `.env` `SKILL_VERSION` | skill 版本号 |\n  | `scene` | 固定 `CLI` | 固定值 |\n  | `channel` | `.env` `SKILL_CHANNEL` | 发布渠道 |\n\n- **失败处理**：上报失败静默忽略，不影响主流程\n\n## 输出格式\n\n采用标准 JSON 输出：\n\n```json\n{\n  \"success\": true,\n  \"markdown\": \"✅ 标题优化完成\",\n  \"data\": {\n    \"item_id\": 831034165952,\n    \"old_title\": \"304不锈钢水杯\",\n    \"new_title\": \"304不锈钢保温杯便携大容量\",\n    \"optimize_reason\": \"添加热词:保温杯,便携,大容量\",\n    \"new_title_words\": [...],\n    \"other_words\": [...]\n  }\n}\n```\n\n## 两种优化方式对比\n\n| 特性 | optimize_title（方式A） | optimize_title_llm（方式B） |\n|------|----------------------|--------------------------|\n| 优化方式 | 规则 + 统计 | LLM 深度重写 |\n| 优化质量 | ★★★★☆ | ★★★★★ |\n| 优化速度 | < 1 秒 | 2-5 秒 |\n| 标题自然度 | 较自然 | 非常自然 |\n| 成本 | 低 | 较高 |\n| 偏好支持 | ❌ | ✅ |\n| 适用场景 | 快速优化、批量处理 | 深度优化、新品发布 |\n\n### 规则5：曝光量变化预测\n\n展示优化结果时，**必须**对每种方案给出曝光量变化预估。预估规则如下：\n\n1. **热词数量变化**：新标题相比原标题每新增 1 个类目热搜词（tag=`热词`），预估曝光提升 5%-15%\n2. **热词权重参考**：`new_title_words` 和 `other_words` 中的 `weight`（权重值）、`min_rnk`（搜索排名）可辅助判断词的流量价值——权重越高、排名越靠前，预估提升越大\n3. **年份更新加成**：如果新标题包含当前年份词（如\"2026新款\"），预估额外提升 3%-8% 曝光\n4. **综合预估**：给出一个保守区间（如 \"+10% ~ +25%\"），并标注免责说明\n\n**免责说明（必须展示）**：\n> ⚠️ 曝光预估基于关键词热度数据，实际效果受类目竞争、商品权重、市场环境等多因素影响，仅供参考。\n\n**示例**：\n\n| 方案 | 新增热词数 | 年份更新 | 预估曝光变化 |\n|------|----------|---------|------------|\n| 方式A | +3 个热词 | 无 | +15% ~ +25% |\n| 方式B | +4 个热词 | 含\"2026新款\" | +20% ~ +35% |\n\n## 使用原则\n\n1. 所有命令均为只读操作，不会修改商品标题\n2. 优化结果仅供参考，需用户确认后手动应用\n3. 收到优化请求后，应同时调用两种方式并展示结果\n4. 如果用户有特殊偏好，应提取并传入 `--preference` 参数\n5. 传入 ≥3 个商品时，必须先触发 `select_items_to_optimize` 交互让用户筛选\n6. 结果展示必须使用 `title_comparison_card` 表格（3列×每方案4行，方案列合并单元格 + 组级单选），标注生成逻辑及优化说明（含热度）和曝光预估\n\n## 执行前置（首次命中能力时必须）\n\n- 如果用户没有提供商品ID（上下文里没有商品ID），直接按 [`references/interaction-specs.md`](./references/interaction-specs.md) 中 `open_tab_select_product` 的数据结构输出 JSON，流程结束，**不允许反问用户，不允许输出其他内容**\n- 首次执行 `optimize_title` 前：先完整阅读 `capabilities/optimize_title.md`\n- 首次执行 `optimize_title_llm` 前：先完整阅读 `capabilities/optimize_title_llm.md`\n- 首次执行 `get_keyword_info` 前：先完整阅读 `capabilities/get_keyword_info.md`\n- 首次执行 `get_tokenizers` 前：先完整阅读 `capabilities/get_tokenizers.md`\n\n## Agent 执行检查清单\n在执行优化时，请确认：\n- [ ] 提取商品ID\n- [ ] 若商品数 ≥ 3，已触发 `select_items_to_optimize` 交互并等待用户选择\n- [ ] 已识别并提取用户偏好（如果有）\n- [ ] 并发调用 `optimize_title` 和 `optimize_title_llm` 命令\n- [ ] 等待两个结果都返回\n- [ ] 使用 `title_comparison_card` 表格展示两个结果（含生成逻辑 + 曝光预估）\n- [ ] 已给出每种方案的曝光量变化预估及免责说明\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn76msg8cwkep3b08z7zffx9fx82p5wj\",\n  \"slug\": \"1688-item-title-optimizer\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1778568714430\n}\n\nFile v0.1.0:references/interaction-specs.md\n\n# 交互组件详细规范\n\n本文档定义了 1688-item-title-optimizer Skill 中所有交互组件的具体数据结构与映射规则。大模型在调用 `show_interaction` 前需查阅本文档，确保数据结构正确。\n\n---\n\n## 1. confirm_apply_title (Card 组件)\n\n### 组件类型\n\n`type: card` — 用户选定标题后，确认是否将新标题应用到商品。\n\n### 数据槽位定义\n\n- **`questions`**:\n  - 类型: `Array<Object>`\n  - 说明: 问题列表，每项包含 `question`（问题文本）和 `options`（选项数组）\n\n### 构造规则\n\n- `question` 中应展示原标题和选定的新标题，让用户做最终确认\n- 明确说明\"应用\"操作的含义（会替换当前商品标题）\n\n### 完整数据示例\n\n```json\n{\n  \"questions\": [\n    {\n      \"question\": \"确认将以下标题应用到商品？\\n\\n原标题：304不锈钢水杯\\n新标题：2026新款304不锈钢保温杯 大容量便携户外水杯 男女通用\\n\\n应用后将替换当前的商品标题。\",\n      \"options\": [\n        \"✅ 确认，应用到商品标题\",\n        \"✏️ 我想手动微调后再应用\",\n        \"💾 仅记录，暂不应用到商品\"\n      ],\n      \"required\": true\n    },\n    {\n      \"question\": \"**如需微调标题**，请在下方输入修改后的完整标题：\\n\\n> 当前推荐标题：2026新款304不锈钢保温杯 大容量便携户外水杯 男女通用\",\n      \"options\": [],\n      \"required\": false\n    }\n  ]\n}\n```\n\n> **说明**：第二个 question 的 `options` 为空数组，端侧会渲染为**大输入框**（而非小的\"输入其他\"框），方便用户输入完整的商品标题（通常 30-60 字）。`required: false` 表示仅当用户选择\"手动微调\"时才需要填写。\n\n### 用户选择后的处理\n\n| 用户选择 | Agent 行为 |\n|---------|-----------|\n| 确认应用 | 调用 `1688-item-one-click` 将选定标题更新到商品，完成后输出成功提示 |\n| 手动微调 | 使用第二个 question 中用户输入的标题，调用 `1688-item-one-click` 应用微调版本 |\n| 仅记录 | 结束流程，提示用户可后续手动应用 |\n\n---\n\n## 2. select_items_to_optimize (Card 组件)\n\n### 组件类型\n\n`type: card` — 当用户传入 3 个及以上商品 ID 时，展示商品列表让用户筛选需要优化的商品，缩小分析范围。\n\n### 触发条件\n\n- 用户在一次请求中传入 **≥ 3 个商品 ID**\n- Agent 必须在执行优化前触发此交互，不得自动全部执行\n\n### 数据槽位定义\n\n- **`questions`**:\n  - 类型: `Array<Object>`\n  - 说明: 问题列表，每项包含 `question`（问题文本）和 `options`（选项数组）\n  - 端侧会自动追加\"输入其他\"选项\n\n### 构造规则\n\n- `question` 中应列出所有传入的商品 ID 及其当前标题，方便用户辨识\n- 选项中应包含每个商品的 ID + 标题摘要（截取前 20 字），以及\"全部优化\"和\"取消\"选项\n- 如果无法预先获取标题，可仅展示商品 ID\n\n### 完整数据示例\n\n```json\n{\n  \"questions\": [\n    {\n      \"question\": \"您提供了 4 个商品，一次优化过多可能影响效率和结果质量。请选择需要优化的商品（建议不超过 3 个）：\\n\\n1. 商品 831034165952：304不锈钢水杯大容量...\\n2. 商品 742091827364：儿童书包男生小学生...\\n3. 商品 653928174051：夏季短袖T恤男纯棉...\\n4. 商品 590817263940：办公椅电脑椅家用舒适...\",\n      \"options\": [\n        \"优化商品1：831034165952\",\n        \"优化商品2：742091827364\",\n        \"优化商品3：653928174051\",\n        \"优化商品4：590817263940\",\n        \"全部优化（可能耗时较长）\",\n        \"❌ 取消，暂不优化\"\n      ]\n    }\n  ]\n}\n```\n\n### 用户选择后的处理\n\n| 用户选择 | Agent 行为 |\n|---------|-----------|\n| 选择特定商品（可多选） | 仅对选中的商品执行并发优化流程 |\n| 全部优化 | 对所有商品逐个执行优化流程，按顺序展示结果 |\n| 取消 | 结束流程，输出友好的结束语 |\n| 输入其他（端侧追加） | 用户可手动输入要优化的商品 ID 列表 |\n\n---\n\n## 3. title_comparison_card (Table 组件 — 相邻同值合并 + 组级单选)\n\n> ### ⚠️ 端侧版本依赖（v2 协议）\n>\n> 本交互依赖 `show_interaction.table` 的 **v2 协议扩展字段**：`mergedColumns` / `selectionGranularity` / `selectionMode` / `groupBy`。这 4 个字段**仅在已升级到 v2 的客户端**（如 newton-desktop v2 及以上）才会生效。\n>\n> **当前 1688 工作台 / 找工厂客户端尚未升级到 v2**，该客户端会**忽略**这 4 个字段，把 payload 退化为默认的 `row + multiple`（行级多选）模式渲染：\n>\n> | 现象 | v2 客户端（期望） | 未升级客户端（当前实际）|\n> |------|------------------|----------------------|\n> | 勾选框数量 | 2 个（每组组首行 1 个，rowSpan=4）| 8 个（每行 1 个）|\n> | 方案列单元格 | 「方案A」「方案B」各合并为 1 个大 cell | 8 行各显示一次「方案A」/「方案B」|\n> | 勾选语义 | 整组互斥单选（A↔B 二选一）| 行级多选，可任意勾 N 行 |\n> | 已选计数 | 0/8 或 4/8 | 0/8 ~ 8/8 任意 |\n>\n> **重要原则**：\n> 1. **payload 不要为兼容降级而修改** —— 协议字段写法是正确的，问题在端侧未实现，等客户端升级即可自动生效\n> 2. **Agent 不要因为看到「每行一个 checkbox」而判断 payload 错了** —— 这是端侧降级渲染的预期表现\n> 3. 在未升级客户端上，Agent 收到的 `selectedRows` 可能是用户跨方案勾选的若干行（不一定是同一方案的 4 行）；处理算法已在下方\"Agent 处理逻辑\"小节做了**统一兜底**（按 `plan` 分组、跨方案时重新弹窗、未勾新标题时重新弹窗），**禁止**自行启发式猜测用户意图\n\n### 组件类型\n\n`type: table` — 两种优化方案生成后，在左侧弹出表格。3 列（方案 + 属性标签 + 内容），每个**成功**方案的 4 个维度各占一行（两个都成功 = 8 行，一个成功一个失败 = 仅展示成功方案的 4 行，两个都失败 = 不弹表格）。利用端侧 `show_interaction.table` v2 协议的**相邻同值合并**能力（`mergedColumns` + `groupBy`），方案列连续同值的行在视觉上合并为一个 rowSpan 大单元格；勾选粒度为**组**（`selectionGranularity: \"group\"`），数量为**单选**（`selectionMode: \"single\"`），方案 A / 方案 B 互斥，整组共用一个勾选框（渲染在组首行）。新标题行的内容列可直接编辑。\n\n### 端侧能力依赖（v2 协议 4 个字段）\n\n| 字段 | 维度 | 本场景取值 | 语义 |\n|------|------|-----------|------|\n| `mergedColumns` | 视觉合并 | `[\"plan\"]` | 该列**相邻同值**的连续行自动合并为 rowSpan 大单元格；不做全局聚合，不跨 `groupBy` 边界 |\n| `groupBy` | 分组依据 | `\"plan\"` | 按 `plan` 字段切分相邻分组（`selectionGranularity:\"group\"` 时**必填**）|\n| `selectionGranularity` | 勾选**单位** | `\"group\"` | 每组一个 checkbox（渲染在组首行），点击即整组勾选 |\n| `selectionMode` | 勾选**数量** | `\"single\"` | 互斥单选；选中新组自动取消旧组；点击已选项 → 清空（视为取消，等价于跳过）|\n\n> **正交设计**：`selectionGranularity × selectionMode` 是两个正交维度，本场景使用 `group + single`（方案互斥）。其余 3 种组合（`row+multiple` 默认 / `row+single` / `group+multiple`）由端侧统一支持。\n\n### 协议硬约束（违反会被主进程 validator 拒绝 / 端侧渲染异常）\n\n1. **`mergedColumns` 中的列不能是 `editable: true` 的列** —— 合并后编辑态语义歧义。本场景虽然 `value` 列已不开启列级 editable（改为行级 `rows[i].editable: true` 仅作用于\"新标题\"行，详见下方\"行级 editable 协议\"小节），但本场景仍**只合并 `plan` 列**，原因变成了\"`value` 列每行内容都不同，没有相邻同值可合并\"，而非 editable 冲突\n2. **`field` 列必须显式声明 `editable: false`**（不可省略）—— 用户实测发现：省略 `editable` 字段时端侧可能把该列误渲染为可编辑；显式写 `false` 才能保证该列稳定只读\n3. **`selectionGranularity: \"group\"` 时必须同时传 `groupBy`**\n4. **`mergedColumns` / `groupBy` 的 key 必须存在于 `columns`**\n5. **行数 ≤ 10**：超过端侧分页阈值后会**自动关闭合并**（防止一组被拆到两页导致 rowSpan 跨页错乱）。本场景最多 8 行（仅成功方案入表），安全\n6. 这 4 个字段（`mergedColumns` / `groupBy` / `selectionGranularity` / `selectionMode`）是 `table` 专有，不允许出现在 `card` / `input` / `open_tab` 类型下\n\n### 触发条件\n\n- 两种优化方式（方式A `optimize_title` + 方式B `optimize_title_llm`）**均执行结束**后触发\n- **仅展示成功方案**：失败方案（CLI 返回 `success: false` 或异常）**不进入 rows**，直接跳过。rows 中仅填入成功方案的 4 行\n- **一个成功一个失败** → 触发本交互，`rows.length = 4`（仅成功方案）；在对话中简要告知用户另一方案未生成成功\n- **两个都成功** → 触发本交互，`rows.length = 8`（两个方案各 4 行）\n- **两个都失败** → **不触发**本交互；直接在对话中告知用户\"两种优化方案均未生成成功，建议稍后重试\"，并提示可重新触发优化\n\n### 失败方案处理（严禁展示）\n\n> ⚠️ **核心规则**：失败方案**不进入表格 rows**，不要为失败方案填入任何占位行、兜底行、提示行。用户在表格中只能看到成功生成的方案。如果某方案 CLI 返回 `success: false` 或异常，在对话文本中简要说明该方案未成功即可，**禁止**在 `title_comparison_card` 的 rows 里塞入失败信息。\n\n### 数据槽位定义\n\n- **`title`**:\n  - 类型: `String`\n  - 说明: 表单标题，格式为\"请选择新标题 — 商品名称（商品ID）\"\n\n- **`columns`**:\n  - 类型: `Array<Object>`\n  - 说明: 固定 3 列\n\n  | key | label | width | editable | 说明 |\n  |-----|-------|-------|----------|------|\n  | `plan` | 方案 | 80 | — | 方案标识列，端侧根据 `mergedColumns` 自动合并相同值 |\n  | `field` | 属性 | 140 | **`false`**（必须显式声明）| 属性标签列：方案名称 / 新标题 / 生成逻辑及优化说明 / 预估曝光变化。⚠️ **必须显式写 `editable: false`**，省略字段会让端侧把整列误渲染为可编辑（用户实测确认，2026-05）|\n  | `value` | 内容 | 620 | — | 对应属性的具体内容；**列级不传 editable**，由 `rows[i].editable: true` 行级控制（仅\"新标题\"行开启）|\n\n- **`mergedColumns`** ⭐ 关键字段:\n  - 类型: `Array<String>`\n  - 值: `[\"plan\"]`\n  - 说明: 指定 `plan` 列做**相邻同值合并** —— 连续同值的行在该列自动合并为一个 rowSpan 大单元格。**该列不能是列级 `editable: true`**（行级 `rows[i].editable` 不受此约束限制，但若把 `value` 加入 `mergedColumns` 同样无意义，因为 `value` 每行内容都不同）\n\n- **`groupBy`** ⭐ 关键字段:\n  - 类型: `String`\n  - 值: `\"plan\"`\n  - 说明: 按 `plan` 字段切分相邻分组，相同 `plan` 值的**连续行**属于同一组（`selectionGranularity:\"group\"` 时必填）\n\n- **`selectionGranularity`** ⭐ 关键字段:\n  - 类型: `String`\n  - 枚举: `\"row\"` / `\"group\"`\n  - 值: `\"group\"`\n  - 说明: 勾选**单位**为\"组\"，每组一个 checkbox（渲染在组首行），整组共用，勾选时整组同时选中\n\n- **`selectionMode`** ⭐ 关键字段:\n  - 类型: `String`\n  - 枚举: `\"single\"` / `\"multiple\"`（缺省 = `\"multiple\"`，向后兼容）\n  - 值: `\"single\"`\n  - 说明: 勾选**数量**为单选，方案 A / 方案 B 互斥；选中新组自动取消旧组；再次点击已选项 → 清空（落到空选，等价于跳过）。**与 `selectionGranularity` 正交**，4 种组合都合法\n\n- **`actions`**:\n  - 类型: `Array<Object>`\n  - 数组长度: **固定 1 项**（仅 `adopt`）；端侧会自动在 actions 之外额外渲染\"跳过/关闭\"按钮，**禁止**在 actions 里再追加 `skip` / `cancel` 等元素\n  - 说明: 自定义主按钮，覆盖端侧默认的\"确认选择\"标签，明确语义为\"采用此方案\"\n\n  | key | label | description | variant |\n  |-----|-------|-------------|---------|\n  | `adopt` | 采用此方案 | 用户采用该方案下的新标题（以 value 列的最终编辑值为准），后续流程基于选中方案继续 | `primary` |\n\n- **`rows`**:\n  - 类型: `Array<Object>`\n  - 说明: 每个**成功**方案占 4 行（方案名称、新标题、生成逻辑及优化说明、预估曝光变化）。两个都成功 = 8 行，一个成功一个失败 = 4 行（失败方案不进入 rows）\n\n  | 字段 | 类型 | 说明 |\n  |------|------|------|\n  | `plan` | String | 方案标识，**同组所有行都填相同值**（如\"方案A\"或\"方案B\"），端侧依靠相邻同值进行合并和分组。**方案 A 的 4 行必须连续在前，方案 B 的 4 行必须连续在后**，不能交错（端侧只合并相邻同值，不做全局聚合）|\n  | `field` | String | 属性标签名，固定枚举：`方案名称` / `新标题` / `生成逻辑及优化说明` / `预估曝光变化` |\n  | `value` | String | 属性值；`field === \"新标题\"` 那行的 value 在 UI 上可被用户直接编辑（依赖**行级** `rows[i].editable: true`，**仅在新标题行设置**）|\n  | `editable` | Boolean? | **可选，行级 editable 开关**。仅 `field === \"新标题\"` 的行设置 `editable: true`，其他 3 行不设置（端侧默认只读）。**取代列级 `columns[].editable`**，让方案名称 / 生成逻辑 / 预估曝光变化 这 3 行物理只读，从根上避免用户误编辑（详见下方\"行级 editable 协议\"小节）|\n\n  **总行数硬上限**：`rows.length ≤ 10`。本场景最多 8 行（2 方案均成功 × 4 维度）、一方失败时仅 4 行，永不触达上限；超过 10 行端侧会触发分页并**自动关闭合并**，破坏视觉效果。如需扩展第 3 个方案，先评估是否需要改用其他展示形态。\n\n- **`totalCount`**:\n  - 类型: `Integer`\n  - 值: 等于 `rows.length`（本场景为 `4` 或 `8`，取决于成功方案数）\n  - 说明: 与 `rows.length` 一致；用于端侧分页判定\n\n### 为什么\"只能合并 plan 列、不能合并 value 列\"\n\n- `mergedColumns` **只能包含 `[\"plan\"]`**\n- 不需要加入 `value`：`value` 列每行内容都不同，没有相邻同值可合并，加了也无效果\n- 不需要加入 `field`：每行 `field` 不同，没有可合并的相邻同值\n\n### 行级 editable 协议（2026-05 用户实测确认有效）\n\n> **背景**：1688 端侧官方曾答复（2026-05 钉钉）\"列级 editable 是当前能力，不支持行级控制\"。但用户后续**实测确认**端侧已支持 `rows[i].editable: true` 行级控制，且本场景配合下述 columns 写法可达到\"仅新标题行可编辑、其他行只读\"的预期效果。\n>\n> **关键事实（用户实测，与官方初步答复不一致 → 以实测为准）**：\n> - 端侧识别 `rows[i].editable: true`（行级开启编辑）\n> - 端侧对 `columns[i].editable` **省略字段** vs **显式写 `false`** 的处理不同：省略时部分列会被误渲染为可编辑，**必须显式声明 `editable: false`** 才能确保该列只读\n\n#### 协议写法（实测有效形态）\n\n```json\n\"columns\": [\n  { \"key\": \"plan\",  \"label\": \"方案\", \"width\":  80 },                          // 不传 editable（端侧合并列默认只读）\n  { \"key\": \"field\", \"label\": \"属性\", \"width\": 140, \"editable\": false },       // ⚠️ 必须显式 false\n  { \"key\": \"value\", \"label\": \"内容\", \"width\": 620 }                           // 不传 editable，由行级控制\n],\n\"rows\": [\n  { \"plan\": \"方案A\", \"field\": \"方案名称\",     \"value\": \"...\" },                   // 默认只读\n  { \"plan\": \"方案A\", \"field\": \"新标题\",       \"value\": \"...\", \"editable\": true }, // 行级开启\n  { \"plan\": \"方案A\", \"field\": \"生成逻辑...\",  \"value\": \"...\" },                   // 默认只读\n  { \"plan\": \"方案A\", \"field\": \"预估曝光变化\", \"value\": \"...\" }                    // 默认只读\n]\n```\n\n#### 端侧识别行为（用户实测）\n\n| 字段 | 写法 | 端侧行为 |\n|------|------|---------|\n| `columns[].editable` | **省略** | 该列可能被误渲染为可编辑（已观察到现象，原因未深查）|\n| `columns[].editable` | **显式 `false`** | 该列稳定渲染为只读 ✅ |\n| `columns[].editable` | **显式 `true`** | 该列所有 cell 都渲染为可编辑输入框（列级开关）|\n| `rows[i].editable` | **省略** | 该行 cell 受所在列的列级 editable 控制 |\n| `rows[i].editable` | **显式 `true`** | 该行 cell 强制渲染为可编辑输入框（行级覆盖列级） ✅ |\n\n> **本场景的具体配置**：`field` 列显式 `editable: false`、`value` 列省略（不开启列级），仅\"新标题\"行的 `rows[i].editable: true` 让该 cell 可编辑 —— 综合起来达到\"仅新标题行可编辑、其他 7 个 value cell + 全部 8 个 field cell 都只读\"的效果。\n\n#### 业务侧软兜底（防御性，不依赖端侧识别）\n\n无论端侧是否识别行级 editable，Agent 在读取回传 `selectedRows` 时**必须始终遵守**：\n\n| 行 (`field`) | 用户编辑的处理 |\n|--------------|---------------|\n| `新标题` | **采用编辑后值**（作为最终标题写入 `confirm_apply_title`）|\n| `方案名称` | **显式忽略**用户编辑，回传值仅用于\"识别选中方案\"，不参与最终标题构造 |\n| `生成逻辑及优化说明` | **完全忽略**用户编辑，仅作为 UI 展示用途 |\n| `预估曝光变化` | **完全忽略**用户编辑，仅作为 UI 展示用途 |\n\n> **双层保护设计**：\n> - 第一层：协议层 `rows[i].editable` 让端侧物理只读其他 3 行（最理想）\n> - 第二层：Agent 软兜底确保即使第一层失效（端侧不识别），其他 3 行的用户编辑也不会污染最终标题\n>\n> 这样无论端侧版本如何演进，业务正确性都有保障。\n\n### 布局示意（合并单元格 + 组级单选效果）\n\n```\n┌──────┬───────┬────────────────────┬────────────────────────────────────┐\n│  ☐   │ 方案  │ 属性                │ 内容                                │\n├──────┼───────┼────────────────────┼────────────────────────────────────┤\n│      │       │ 方案名称            │ 添加热词优化（规则版）              │\n│      │       ├────────────────────┼────────────────────────────────────┤\n│      │       │ 新标题              │ 304不锈钢保温杯便携大容量 ✎         │\n│  ☐   │ 方案A ├────────────────────┼────────────────────────────────────┤\n│      │       │ 生成逻辑及优化说明   │ 👀 304、不锈钢 / 🔥 保温杯(8500)…   │\n│      │       ├────────────────────┼────────────────────────────────────┤\n│      │       │ 预估曝光变化        │ +15% ~ +25%                        │\n├──────┼───────┼────────────────────┼────────────────────────────────────┤\n│      │       │ 方案名称            │ AI深度重写                          │\n│      │       ├────────────────────┼────────────────────────────────────┤\n│      │       │ 新标题              │ 2026新款304不锈钢保温杯… ✎          │\n│  ☐   │ 方案B ├────────────────────┼────────────────────────────────────┤\n│      │       │ 生成逻辑及优化说明   │ 📈 2026、新款 / 🔥 保温杯(8500)…    │\n│      │       ├────────────────────┼────────────────────────────────────┤\n│      │       │ 预估曝光变化        │ +20% ~ +35%（含年份更新加成）       │\n└──────┴───────┴────────────────────┴────────────────────────────────────┘\n\n图例：\n  ☐  = 整组共用的 checkbox，仅在每组「组首行」渲染（rowSpan = 4）；\n       组内非首行不渲染勾选 td。\n  ✎  = 仅\"新标题\"行可编辑（依靠行级 rows[i].editable: true，详见\n       「行级 editable 协议」小节）；其他 3 行端侧渲染为纯文本只读。\n       即使端侧暂不识别行级 editable，Agent 也会软兜底只采用新标题行的\n       编辑值，其他 3 行编辑被显式忽略。\n  方案A / 方案B 单元格 = plan 列 mergedColumns 自动合并，rowSpan = 4。\n```\n\n> **设计目的**：依靠端侧 `mergedColumns: [\"plan\"]` 实现 plan 列相邻同值的视觉合并；依靠 `selectionGranularity: \"group\"` 让每组共用一个组首 checkbox；依靠 `selectionMode: \"single\"` 让方案 A / 方案 B **互斥**（选 A 后再选 B，A 自动取消）。三者正交叠加，达到\"行 × 列双向合并 + 方案二选一\"的最终效果。\n\n### 构造规则\n\n**\"生成逻辑及优化说明\"行的 `value`** 按四大维度分类词并标注热度，维度之间用 ` / ` 分隔，每个维度内多个词用顿号 `、` 分隔，最后附优化说明：\n\n| 维度 | 对应 tag | 格式示例 |\n|------|---------|---------|\n| 🔥 热词 | `热词` | `🔥 保温杯(热度:8500)、便携(热度:6200)` |\n| 📈 流量获取 | `时间词`、`修饰词` | `📈 2026、新款` |\n| ✨ 吸引力 | `场景词`、`风格词` | `✨ 户外、男女通用` |\n| 👀 买家关注 | `属性词`、`材质词`、`品类词`、`功能词` | `👀 304、不锈钢` |\n\n构造规则：\n\n- **维度间分隔符**：` / `（前后各一个空格）\n- **维度内词间分隔符**：`、`（中文顿号）\n- 如某维度无对应词则**整段省略**（不要保留空的 emoji + 分隔符）\n- `weight` 字段不存在时省略 `(热度:xxxx)` 标注，仅保留词名\n- 最后追加 ` / 优化说明：<optimize_reason 或亮点描述>`，作为最末一段\n\n### 曝光量变化预测规则\n\n1. 新标题每新增 1 个热搜词，预估曝光提升 5%-15%\n2. 含当前年份词（如\"2026新款\"），额外提升 3%-8%\n3. 给出保守区间（如 \"+10% ~ +25%\"）\n\n### 完整数据示例\n\n```json\n{\n  \"type\": \"table\",\n  \"selectionType\": \"title_plan\",\n  \"title\": \"请选择新标题 — 304不锈钢水杯（831034165952）\",\n  \"columns\": [\n    { \"key\": \"plan\", \"label\": \"方案\", \"width\": 80 },\n    { \"key\": \"field\", \"label\": \"属性\", \"width\": 140, \"editable\": false },\n    { \"key\": \"value\", \"label\": \"内容\", \"width\": 620 }\n  ],\n  \"mergedColumns\": [\"plan\"],\n  \"selectionGranularity\": \"group\",\n  \"selectionMode\": \"single\",\n  \"groupBy\": \"plan\",\n  \"actions\": [\n    {\n      \"key\": \"adopt\",\n      \"label\": \"采用此方案\",\n      \"description\": \"用户采用该方案下的新标题（以「新标题」行的最终编辑值为准），后续流程基于选中方案继续落库或上线。\",\n      \"variant\": \"primary\"\n    }\n  ],\n  \"rows\": [\n    { \"plan\": \"方案A\", \"field\": \"方案名称\", \"value\": \"添加热词优化（规则版）\" },\n    { \"plan\": \"方案A\", \"field\": \"新标题\", \"value\": \"304不锈钢保温杯便携大容量\", \"editable\": true },\n    { \"plan\": \"方案A\", \"field\": \"生成逻辑及优化说明\", \"value\": \"👀 304、不锈钢 / 🔥 保温杯(热度:8500)、便携(热度:6200)、大容量(热度:5100) / 优化说明：添加热词保温杯、便携、大容量\" },\n    { \"plan\": \"方案A\", \"field\": \"预估曝光变化\", \"value\": \"+15% ~ +25%；实际效果受商品权重、类目竞争、市场环境等多因素影响，仅供参考\" },\n    { \"plan\": \"方案B\", \"field\": \"方案名称\", \"value\": \"AI深度重写\" },\n    { \"plan\": \"方案B\", \"field\": \"新标题\", \"value\": \"2026新款304不锈钢保温杯 大容量便携户外水杯 男女通用\", \"editable\": true },\n    { \"plan\": \"方案B\", \"field\": \"生成逻辑及优化说明\", \"value\": \"📈 2026、新款 / 👀 304、不锈钢、水杯 / 🔥 保温杯(热度:8500)、便携(热度:6200)、大容量(热度:5100) / ✨ 户外、男女通用 / 优化说明：AI深度重写，融合热词与场景描述\" },\n    { \"plan\": \"方案B\", \"field\": \"预估曝光变化\", \"value\": \"+20% ~ +35%（含年份更新加成）；实际效果受商品权重、类目竞争、市场环境等多因素影响，仅供参考\" }\n  ],\n  \"totalCount\": 8  // 两个方案都成功时为 8；若一方失败则为 4（仅成功方案入表）\n}\n```\n\n> ⚠️ 曝光预估基于关键词热度数据，实际效果受类目竞争、商品权重等多因素影响，仅供参考。\n\n### 回传契约（关键：respond 始终回传展开 rows）\n\n> **核心保证**：无论是 `group` 还是 `single` 模式，端侧 respond 给 Agent 的 `selectedRows` 始终是**展开后的原始行数组**（与 `multiple+row` 模式同构），后端 / 大模型对\"组\"和\"单选\"完全无感。\n\n| 用户操作 | 回传 `selectedRows` | 说明 |\n|---------|----------------------|------|\n| 勾选方案 A 整组并点\"采用此方案\" | 方案 A 对应的 **4 行展开数据**（按原顺序，含 cell 内编辑后的最新 value） | 协议契约：组级勾选 → 展开 4 行回传 |\n| 勾选方案 A 后改勾方案 B 再点\"采用此方案\" | 方案 B 对应的 **4 行展开数据**（A 已被自动取消，不出现在回传中） | `selectionMode: \"single\"` 互斥归一化的结果 |\n| 勾选方案 A 后再次点击方案 A 取消，再点\"采用此方案\" | `[]`（空选 = 跳过，合理语义） | 点击已选项 = 取消 |\n| 不勾选任何方案直接点\"采用此方案\" | `[]`（空选 = 跳过） | 与\"全部取消\"等价 |\n\n> 跳过 / 关闭 弹窗的回传形态由端侧通用机制决定（不属于本交互的协议层定义），Agent 侧只需按下方\"处理逻辑\"判断 `selectedRows` 是否为空即可，无需关心具体跳过形态。\n\n### Agent 处理逻辑（统一兼容 v2 客户端 与 未升级客户端）\n\n收到 `selectedRows` 后，**无需事先判断端侧版本**，按以下统一算法处理。该算法在 v2 客户端上等价于\"读 `selectedRows[0].plan`\"的简单路径，在未升级客户端上自动启用兜底分支。\n\n#### 前置：触发本交互前必须保留的上下文\n\n在触发 `title_comparison_card` 之前，Agent 必须确保以下两份数据**仍可在当前对话上下文中访问**（无需独立缓存模块，依靠 prompt context 中保留的工具调用结果即可）：\n\n- `optimize_title`（方案A）的 CLI 完整返回 JSON\n- `optimize_title_llm`（方案B）的 CLI 完整返回 JSON\n\n> **为什么需要这两份数据**：未升级客户端可能让用户勾选不完整（缺新标题行）或跨方案混选，此时 Agent 需要\"重新触发 `title_comparison_card`\" 来让用户重选 —— 重新触发时 Agent 必须用成功方案的原始返回**重新构造 payload**（仅填入成功方案的行；不能重新调用 CLI，会浪费配额且 LLM 结果不可重现）。在 v2 客户端上这两份数据虽然不会被用到，但保留无开销。\n\n#### Step 1 — 空选判定\n\n- `selectedRows.length === 0` → 视为用户放弃选择\n- 立即回退提示用户：\"是否需要重新生成方案 / 结束本轮优化\"，等待用户回复\n- **禁止**进入 `confirm_apply_title`，**禁止**自行编造标题继续流程\n\n#### Step 2 — 按 `plan` 分组聚合\n\n```\ngroups = group_by(selectedRows, row => row.plan)\n// v2 客户端典型形态：{ \"方案A\": [4 行] }\n// 未升级客户端可能形态：\n//   { \"方案A\": [1 行] }                       — 用户只勾了 1 行\n//   { \"方案A\": [3 行], \"方案B\": [2 行] }       — 跨方案混勾\n//   { \"方案B\": [4 行] }                       — 与 v2 同形态\n```\n\n#### Step 3 — 根据分组数分支处理\n\n| `groups` 的 key 数 | 含义 | 处理 |\n|-------------------|------|------|\n| `1` | v2 客户端正常路径 / 未升级客户端用户只勾了一个方案的若干行 | 进入 Step 4 |\n| `≥ 2` | **仅在未升级客户端可能出现**（v2 互斥单选会拦截）：用户跨方案勾了行 | 走 **Step 3a 重新弹窗** |\n\n##### Step 3a — 跨方案混勾的重新弹窗流程（仅 ≥2 分支）\n\n**严禁**用\"取行数最多的方案\"等启发式猜测算法（用户在未升级客户端的勾选行为可能是任意组合，Agent 没有依据猜测意图，强行猜测会导致采用了用户实际不想要的方案 → 数据污染风险）。\n\n具体执行：\n\n1. 给用户一句对话提示（明文消息，不要塞进 table）：\n   > \"检测到您勾选了多个方案的行（方案 A：N₁ 行 / 方案 B：N₂ 行）。由于本次只能采用一个方案，请在重新弹出的表格中**仅勾选您想采用的那一个方案**，再点「采用此方案」。\"\n2. **重新触发** `title_comparison_card`，**用前置小节提到的成功方案的原始 CLI 返回值重新构造 payload**（仅填入成功方案的行，payload 字段与首次触发相同，包括 4 个 v2 协议字段；**禁止**重新调用 `optimize_title` / `optimize_title_llm`）\n3. 重新等待用户回传，回到 Step 1 重新走一遍\n\n> 在 v2 客户端上 Step 3a 永远不会被执行（互斥单选拦截在端侧），所以这段逻辑只在降级场景下活。\n\n#### Step 4 — 选中行集合完整性校验\n\n设 `selectedFields = selectedRows.map(r => r.field)` 是用户实际勾选了哪些 field（仅唯一方案下的那些行）。\n\n- **必须包含 `\"方案名称\"` 与 `\"新标题\"` 两个 field 中的全部** —— 否则后续的\"读取最终新标题\"会因数据缺失而失效\n- **缺失任一时**：执行 **Step 4a 缺字段重新弹窗**\n\n##### Step 4a — 缺字段时的重新弹窗流程\n\n1. 给用户对话提示：\n   > \"您勾选的行不完整（缺少 `<缺失的 field 列表>`）。为了正确采用方案，请在重新弹出的表格中**勾选包含「方案名称」和「新标题」的完整行集合**。\"\n2. **重新触发** `title_comparison_card`（同 Step 3a 第 2 点：用原始 CLI 返回值重构 payload，禁止重调 CLI）\n3. 重新等待用户回传，回到 Step 1\n\n> 在 v2 客户端上，组级勾选保证整组 4 行齐全，Step 4a 永远不会被执行。\n\n#### Step 5 — （已移除：失败方案不再进入表格）\n\n> 由于失败方案不再进入 rows，表格中所有方案均为成功方案，无需在回传后识别失败方案。直接进入 Step 6。\n\n#### Step 6 — 读取最终新标题（仅采用「新标题」行的编辑值）\n\n在唯一选中方案的所有行里，找 `field === \"新标题\"` 的行（Step 4 已保证此行必然存在）：\n\n- 取该行的 `value` 作为最终新标题\n- **该值可能已被用户在 cell 内编辑过**（依靠行级 `editable: true`），必须以此回传值为准\n- **禁止**回退读 CLI 原始返回里的 `new_title`（用户编辑会被覆盖丢失）\n- **禁止**用其他 field 的 value 当标题\n\n> ⚠️ **关于其他 3 行（方案名称 / 生成逻辑及优化说明 / 预估曝光变化）的用户编辑**：\n> 协议层已通过**不在这 3 行设置** `editable: true` 让端侧渲染为只读（详见「行级 editable 协议」小节）。但万一端侧暂不识别 `rows[i].editable` 退化为\"全部 cell 可编辑\"或\"全部 cell 不可编辑\"，Agent 仍须按以下软兜底处理：\n> - `方案名称` 行的 value 仅用于\"识别选中方案\"，即便被用户改过也不影响判断逻辑，但**不参与最终标题构造**\n> - `生成逻辑及优化说明` 行 / `预估曝光变化` 行的 value **完全不读**，仅作 UI 展示\n> - **严禁**因用户改了其他行就把它当成新标题写入 `confirm_apply_title`\n\n#### Step 7 — 进入应用确认\n\n携带以下参数触发 `confirm_apply_title`：\n\n- 选中方案标识（来自 `groups` 的唯一 key）\n- 最终新标题（Step 6 取到的 `value`，可能含用户编辑）\n- 商品 ID\n- 商品原标题\n\n> **设计原则总结**：\n> - 算法只依赖 `selectedRows` 的扁平结构 + `plan`/`field` 字段语义，不依赖端侧\"组\"/\"单选\"等实现细节\n> - 在 v2 客户端上：Step 3 的 `≥2` 分支与 Step 4 的\"缺字段\"分支永不触发（端侧已保证完整性），算法等价于\"取 `selectedRows[0].plan` + 找新标题行\"的极简路径\n> - 在未升级客户端上：Step 3a / Step 4a 兜底按需启用，依靠 Agent 用 context 中已有的 CLI 原始返回值重构 payload 重新弹窗，**不再调用任何 CLI**，确保不浪费配额、结果可重现\n> - 待 1688 客户端升级到 v2 后：**无需任何文档 / 逻辑回滚**，兜底分支自动失效\n\n### 未升级客户端兜底处理（v2 协议未生效时）\n\n在未升级到 v2 协议的客户端（如当前 1688 工作台 / 找工厂客户端）上，端侧不会做 group 展开和 single 互斥归一化，Agent 收到的 `selectedRows` 形态可能与 v2 不同：\n\n| 场景 | v2 客户端回传 | 未升级客户端回传 |\n|------|--------------|-----------------|\n| 用户勾\"方案A 的 4 行\" | 方案A 的 4 行（自动整组展开）| 方案A 的 4 行（同结果）|\n| 用户只勾\"方案A 的新标题\"行 | 方案A 的 4 行（整组展开）| **只有 1 行**（无展开）|\n| 用户同时勾\"方案A 的 1 行 + 方案B 的 2 行\" | 不可能（互斥单选拦截）| **3 行混合，含两个 plan**（无互斥拦截）|\n| 用户全勾 8 行 | 不可能（互斥单选拦截）| **8 行，含两个 plan** |\n\n**Agent 兜底处理算法**（同时兼容 v2 / 未升级两种端侧）：\n\n1. 按 `plan` 字段对 `selectedRows` 分组，得到 `Map<plan, rows[]>`\n2. 若分组数 = 0 → 视为跳过，与 v2 空选处理一致\n3. 若分组数 = 1 → 直接进入\"识别选中方案 + 读取最终新标题\"流程（与 v2 路径一致）\n4. 若分组数 ≥ 2（仅在未升级客户端可能出现）→ **取行数最多的方案**作为用户意图；行数相同时优先取方案 A；处理后**显式提示用户**：\"检测到您勾选了多个方案的行，已按 `<选中方案>` 处理；如需选择另一方案，请重新勾选并仅保留该方案对应的行\"\n5. 在选定方案的行集合中，找 `field === \"新标题\"` 的行 → 取 `value`；若该 `field` 未被用户勾选 → **回退到原始优化结果中该方案的 `new_title`**（不是编造，而是 CLI 已返回的真实值），并提示用户\"未勾选新标题行，已使用方案默认标题\"\n\n> 本兜底逻辑确保：哪怕端侧暂未升级，Skill 仍然可用；待端侧升级到 v2 后，分组数恒为 0 或 1，兜底分支自动失效，行为与原 v2 设计一致，**无需任何代码 / 文档回滚**。\n\n---\n\n## 4. open_tab_select_product (Open Tab 组件)\n\n### 组件类型\n\n`type: open_tab` — 当用户未提供商品 ID 时，直接输出该 JSON 唤起商品选择页面，**流程到此结束，不允许反问用户，不允许输出其他内容**。\n\n### 触发条件\n\n- 用户触发标题优化意图，但**上下文中没有商品 ID**\n- **禁止反问用户是否要提供商品 ID，禁止询问用户任何问题**\n- 直接输出以下 JSON，流程结束\n\n### 完整数据示例\n\n```json\n{\n  \"type\": \"open_tab\",\n  \"selectionType\": \"shop_backend\",\n  \"url\": \"https://air.1688.com/app/CSBC-modules/csbc-ai-component-loader/picture-optimize.html?mode=newton-select-offer&skillCode=1688-item-title-optimizer\",\n  \"pageTitle\": \"选择商品\",\n  \"pageDescription\": \"选择商品优化标题\",\n  \"icon\": \"https://img.alicdn.com/imgextra/i3/O1CN01gQPY341cm5b1gzS1k_!!6000000003642-2-tps-80-80.png\"\n}\n```\n\n### 行为说明\n\n- 该交互为 **fire-and-forget** 模式，输出 JSON 后流程即结束\n- 聊天区会同步出现一张\"已为你打开商品选择\"的只读气泡卡片\n- **不再执行后续的优化步骤**\n\n---\n\nFile v0.1.0:references/title_llm_SKILL.md\n\n---\nname: title_llm\ndescription: 1688商品标题智能优化助手，基于LLM深度优化标题。只需提供商品ID，一键调用TPP推理服务，自动完成标题的智能重写、年份更新、热词标注和推荐词生成。使用场景：需要深度优化的商品标题、新品发布、标题全面改写。\n---\n\n# 标题智能优化助手 (Title LLM Optimization Assistant)\n\n为 1688 商品提供基于大语言模型的智能标题优化服务。只需提供商品ID，一键调用 TPP 推理服务完成深度优化，无需额外操作。\n\n## ⚠️ 重要：Agent 展示规范\n\n**在展示优化结果时，必须遵守以下规则：**\n\n1. **必须同时显示**：优化结果中必须同时显示原标题（old_title）和新标题（new_title）\n2. **禁止只显示新标题**：不能只显示 new_title，用户需要对比查看\n3. **清晰对比**：建议使用对比格式展示，例如：\n   ```\n   原标题：[old_title]\n   新标题：[new_title]\n   ```\n\n## 快速参考\n\n```python\n# 最简单的调用方式\nfrom interface import optimize_title_llm\n\nresult = optimize_title_llm({\"item_id\": 831034165952})\n\n# 带用户偏好的调用方式\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'单词\"\n})\n```\n\n```bash\n# 命令行调用\npython3 interface.py --function optimize_title_llm --item_id 831034165952\n\n# 带用户偏好的命令行调用\npython3 interface.py --function optimize_title_llm --item_id 831034165952 --preference \"加入防潮单词\"\n```\n\n**核心特点**：\n- ✅ 只需提供 item_id，无需其他参数\n- ✅ 支持用户偏好定制（可选）\n- ✅ 自动完成所有优化步骤\n- ✅ 返回优化后的标题和详细分析\n- ✅ 无需手动获取关键词信息\n- ✅ 无需配置分词器\n\n## 用户偏好参数 (preference)\n\n### 什么是用户偏好参数？\n\n`preference` 参数允许用户通过自然语言指定优化偏好，LLM会在优化标题时考虑这些偏好。\n\n### 如何使用？\n\n**Agent 使用指南**：\n1. **识别用户意图**：当用户在优化请求中提到特定要求时，提取这些要求\n2. **提取偏好**：将用户的自然语言要求整理成简洁的偏好描述\n3. **传入参数**：将偏好作为 `preference` 字段传入 `optimize_title_llm` 函数\n\n### 支持的偏好类型\n\n**关键词偏好**：\n- \"加入'防潮'单词\"\n- \"添加'防摔'和'耐用'关键词\"\n- \"必须包含'304不锈钢'\"\n\n**特点强调**：\n- \"突出材质特点\"\n- \"强调便携性\"\n- \"体现性价比\"\n- \"突出新款和时尚感\"\n\n**风格偏好**：\n- \"标题要简洁\"\n- \"标题要详细\"\n- \"使用专业术语\"\n- \"面向年轻消费者\"\n\n**组合偏好**：\n- \"加入'防潮'单词，同时突出材质特点\"\n- \"强调便携性和大容量，使用简洁风格\"\n\n### 使用示例\n\n#### 示例1：添加特定关键词\n```python\n# 用户说：\"优化这个商品标题，加入'防潮'这个词\"\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'单词\"\n})\n```\n\n#### 示例2：强调特点\n```python\n# 用户说：\"优化标题，要突出材质特点\"\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"突出材质特点\"\n})\n```\n\n#### 示例3：组合要求\n```python\n# 用户说：\"优化标题，加入防潮和防摔，还要强调便携性\"\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'和'防摔'关键词，强调便携性\"\n})\n```\n\n#### 示例4：命令行使用\n```bash\n# 带偏好的命令行调用\npython3 interface.py --function optimize_title_llm \\\n  --item_id 831034165952 \\\n  --preference \"加入防潮单词，突出材质特点\"\n```\n\n### Agent 实现建议\n\n当 Agent 处理用户请求时，应该：\n\n1. **解析用户指令**：识别用户是否有特殊要求\n   ```\n   用户：\"优化商品831034165952的标题，加入'防潮'这个词\"\n   ↓\n   提取：item_id=831034165952, preference=\"加入'防潮'单词\"\n   ```\n\n2. **整理偏好描述**：将用户的要求转换为简洁的偏好描述\n   ```\n   用户：\"这个标题要突出是防水防潮的，还要体现出材质很好\"\n   ↓\n   整理：preference=\"突出防水防潮特点，强调材质优质\"\n   ```\n\n3. **调用接口**：将整理后的偏好传入接口\n   ```python\n   result = optimize_title_llm({\n       \"item_id\": item_id,\n       \"preference\": preference_text\n   })\n   ```\n\n### 注意事项\n\n1. **偏好是可选的**：如果用户没有特殊要求，可以不传 `preference` 参数\n2. **使用自然语言**：偏好描述使用自然语言即可，不需要特殊格式\n3. **保持简洁**：偏好描述应该简洁明了，一般1-2句话即可\n4. **避免冲突**：避免提出互相矛盾的偏好（如\"简洁\"和\"详细\"）\n\n## 核心优势\n\n### LLM 驱动的智能优化\n- 使用大语言模型深度理解商品信息\n- 智能重写标题，而非简单的关键词拼接\n- 自动理解类目特征和用户搜索习惯\n- 生成更自然、更符合用户搜索习惯的标题\n\n### 自动化处理\n- 自动获取商品信息（标题、类目、属性、图片、热搜词）\n- 自动调用 TPP 推理服务进行优化\n- 自动更新年份信息（2023/2024/2025 → 当前年份）\n- 自动标注热词类型\n\n### 智能推荐\n- 提供优化后的标题\n- 标注每个词的类型（热词、属性词等）\n- 推荐其他可添加的高价值热词\n- 展示热词权重和排名信息\n\n## 快速开始\n\n### 命令行调用\n\n使用 interface.py 直接调用，只需提供商品ID：\n\n```bash\npython3 interface.py --function optimize_title_llm --item_id 831034165952\n```\n\n或使用测试脚本：\n\n```bash\ncd scripts\n./test_title_llm.sh\n```\n\n### python3 代码调用\n\n```python\nfrom interface import optimize_title_llm\n\n# 只需传入商品ID\nresult = optimize_title_llm({\"item_id\": 831034165952})\n\n# 带用户偏好的调用\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'单词\"\n})\n\n# 多个偏好\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'和'防摔'单词，突出材质特点\"\n})\n\nif result[\"success\"]:\n    data = result[\"data\"]\n    print(f\"原标题: {data['old_title']}\")\n    print(f\"新标题: {data['new_title']}\")\nelse:\n    print(f\"优化失败: {result['error']}\")\n```\n\n### 返回结果示例\n\n```json\n{\n  \"success\": true,\n  \"error\": null,\n  \"data\": {\n    \"item_id\": 831034165952,\n    \"old_title\": \"304不锈钢水杯\",\n    \"new_title\": \"2026新款304不锈钢保温杯便携大容量运动水杯\",\n    \"new_title_words\": [\n      {\"word\": \"2026\", \"tag\": \"时间词\", \"type\": null, \"description\": \"自动更新至当前年份\"},\n      {\"word\": \"新款\", \"tag\": \"修饰词\", \"type\": null},\n      {\"word\": \"304\", \"tag\": \"属性词\", \"type\": null},\n      {\"word\": \"不锈钢\", \"tag\": \"材质词\", \"type\": null},\n      {\"word\": \"保温杯\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"便携\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"大容量\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"运动\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"水杯\", \"tag\": \"品类词\", \"type\": null}\n    ],\n    \"other_words\": [\n      {\"word\": \"户外\", \"tag\": \"热词\", \"weight\": 8.5, \"min_rnk\": 12, \"description\": \"类目热搜词，排名12，建议添加\"},\n      {\"word\": \"旅行\", \"tag\": \"热词\", \"weight\": 7.2, \"min_rnk\": 18, \"description\": \"类目热搜词，排名18\"}\n    ]\n  }\n}\n```\n\n### 参数说明\n\n**输入参数**：\n- `item_id` (必需): 商品ID，整数类型\n- `preference` (可选): 用户偏好，字符串类型\n  - 从用户指令中提取的优化偏好\n  - 例如：\"加入'防潮'单词\"、\"突出材质特点\"、\"强调便携性\"等\n  - Agent 应从用户的自然语言指令中提取偏好并传入此字段\n\n**返回字段**：\n- `success`: 是否成功，布尔类型\n- `error`: 错误信息，失败时提供\n- `data`: 优化结果数据\n  - `item_id`: 商品ID\n  - `old_title`: 原标题（⚠️ 必须展示）\n  - `new_title`: 优化后的标题（⚠️ 必须展示）\n  - `new_title_words`: 标题词列表，包含每个词的标签和描述\n  - `other_words`: 推荐词列表，未使用的高价值热词\n\n---\n\n## 📋 结果展示规范\n\n### 基本展示格式\n\n**最简格式**（必须包含）：\n```\n原标题：304不锈钢水杯\n新标题：2026新款304不锈钢保温杯便携大容量运动水杯\n```\n\n### 完整展示格式\n\n**推荐格式**（包含详细分析）：\n```\n✅ 优化完成！\n\n原标题：304不锈钢水杯\n新标题：2026新款304不锈钢保温杯便携大容量运动水杯\n\n优化亮点：\n• 自动添加\"2026新款\"，突出时效性\n• 补充\"便携\"、\"大容量\"等高价值热词\n• 标题结构更自然，符合用户搜索习惯\n\n未使用的推荐热词：\n• 户外（权重8.5，排名12）\n• 旅行（权重7.2，排名18）\n```\n\n### ⚠️ 错误示例\n\n**❌ 只显示新标题（禁止）**：\n```\n新标题：2026新款304不锈钢保温杯便携大容量运动水杯\n```\n\n**✅ 正确示例（必须包含原标题）**：\n```\n原标题：304不锈钢水杯\n新标题：2026新款304不锈钢保温杯便携大容量运动水杯\n```\n\n## 功能特点\n\n### 1. 智能标题重写\n\n基于 LLM 的深度优化：\n- **理解商品特征**：自动分析商品类目、属性、图片等信息\n- **智能词序排列**：符合用户搜索习惯的词序\n- **自然语言生成**：生成流畅、自然的标题，避免关键词堆砌\n- **语义相关性**：确保添加的关键词与商品强相关\n\n### 2. 自动年份更新\n\n标题中的年份自动更新为当前年份：\n- 自动识别标题中的 2023、2024、2025 等年份\n- 替换为当前年份（2026）\n- 保持标题时效性，提升用户信任度\n\n### 3. 热词智能标注\n\n自动标注和分析热词：\n- **自动识别**：识别标题中的类目热搜词\n- **类型标注**：区分热词、属性词、修饰词等类型\n- **来源说明**：标注热词来源（类目热搜词）\n- **权重计算**：计算未使用热词的权重和排名\n\n### 4. 推荐词列表\n\n提供高价值的推荐词：\n- **未使用热词**：类目热搜词中未出现在优化后标题的词\n- **权重排序**：按权重和排名排序\n- **详细信息**：展示词的权重、排名、描述\n- **添加建议**：帮助商家进一步优化标题\n\n## 工作原理\n\n### 一键调用流程\n\n`optimize_title_llm` 函数自动完成以下所有步骤：\n\n1. **接收商品ID**：只需提供商品ID参数\n2. **调用TPP服务**：自动发送请求到TPP推理服务（scene: \"title_llm\"）\n3. **TPP后端处理**：\n   - 自动获取商品信息（标题、类目、属性、图片）\n   - 自动获取类目热搜词\n   - 调用LLM模型生成优化标题\n   - 自动更新年份信息\n   - 自动标注热词类型\n   - 自动生成推荐词列表\n4. **返回结果**：获取完整的优化结果\n\n## 使用场景\n\n### 场景1：新品发布\n\n为新上架商品生成高质量标题：\n\n```python\nfrom interface import optimize_title_llm\n\n# 为新品生成优化标题\nresult = optimize_title_llm({\"item_id\": 831034165952})\n\n# 带用户偏好\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"突出新款和材质特点\"\n})\n\nif result[\"success\"]:\n    data = result[\"data\"]\n    print(f\"原标题: {data['old_title']}\")\n    print(f\"新标题: {data['new_title']}\")\n```\n\n**优势**：\n- 一键调用，无需多步操作\n- LLM 深度理解商品特征\n- 生成符合类目特点的标题\n- 自动包含高价值热搜词\n- 支持用户偏好定制\n- 标题更自然、更吸引用户\n\n**展示格式示例**：\n```\n原标题：304不锈钢水杯\n新标题：2026新款304不锈钢保温杯便携大容量运动水杯\n```\n\n### 场景2：标题全面改写\n\n对现有标题进行全面优化改写：\n\n```bash\npython3 interface.py --function optimize_title_llm --item_id 987654321\n```\n\n**适用情况**：\n- 标题质量较差，需要重写\n- 标题过时，需要更新\n- 标题关键词堆砌，需要优化\n- 需要提升标题吸引力\n\n**展示结果时必须包含**：\n```\n原标题：[显示原标题]\n新标题：[显示优化后的标题]\n```\n\n### 场景3：批量优化\n\n批量处理多个商品标题：\n\n```python\nfrom interface import optimize_title_llm\nimport json\n\nitem_ids = [831034165952, 987654321, 555666777]\n\nfor item_id in item_ids:\n    result = optimize_title_llm({\"item_id\": item_id})\n\n    if result[\"success\"]:\n        data = result[\"data\"]\n        print(f\"商品 {item_id}:\")\n        print(f\"  原标题: {data['old_title']}\")\n        print(f\"  新标题: {data['new_title']}\")\n        print()\n    else:\n        print(f\"商品 {item_id} 优化失败: {result['error']}\")\n```\n\n## 自动优化策略\n\nTPP 服务自动执行以下优化策略（无需手动干预）：\n\n### LLM 智能重写\n\n1. **语义理解**：深度理解商品特征和用户需求\n2. **自然表达**：生成流畅、自然的标题文本\n3. **热词融入**：智能融入类目热搜词\n4. **避免堆砌**：避免简单的关键词堆砌\n\n### 年份自动更新\n\n- 自动识别标题中的年份（2023、2024、2025）\n- 统一替换为当前年份（2026）\n- 保持标题时效性和新鲜感\n- 提升用户对新品的感知\n\n### 热词自动标注\n\n- 自动分词并对比类目热搜词列表\n- 自动为每个词添加标签（热词、属性词等）\n- 自动提供词的来源说明\n\n### 推荐词自动生成\n\n- 自动提取未使用的高价值热词\n- 自动计算权重和排名\n- 自动过滤低权重词\n- 自动按权重排序\n\n## 性能特点\n\n### 优化速度\n- **调用耗时**：约 2-5 秒（取决于网络和模型）\n- **处理速度**：比纯规则方法慢，但质量更高\n- **适用场景**：重要商品、新品发布、深度优化\n\n### 优化质量\n- **标题自然度**：★★★★★（LLM 生成，非常自然）\n- **关键词相关性**：★★★★★（语义理解，高度相关）\n- **热词覆盖率**：★★★★☆（智能融入热词）\n- **用户体验**：★★★★★（符合搜索习惯）\n\n### 成本考虑\n- **计算成本**：较高（调用 TPP LLM 服务）\n- **网络依赖**：需要稳定的网络连接\n- **适用规模**：适合中小规模优化或重点商品\n\n## 与 optimize_title 的对比\n\n| 特性 | optimize_title_llm (LLM版本) | optimize_title (规则版本) |\n|------|------------------------------|--------------------------|\n| **调用方式** | 一键调用，只需item_id | 多参数配置 |\n| **优化方式** | LLM 深度重写 | 规则 + 统计 |\n| **优化质量** | ★★★★★ | ★★★★☆ |\n| **优化速度** | 2-5 秒 | < 1 秒 |\n| **标题自然度** | 非常自然 | 较自然 |\n| **操作复杂度** | 极简（一键） | 需要配置多个参数 |\n| **成本** | 较高 | 低 |\n| **适用场景** | 深度优化、新品发布 | 快速优化、批量处理 |\n| **自定义能力** | 有限（模型决定） | 高（支持自定义关键词） |\n\n### 选择建议\n\n**选择 optimize_title_llm 的情况：**\n- 需要一键快速调用\n- 需要高质量的标题优化\n- 新品发布，需要吸引眼球\n- 标题需要全面改写\n- 不想处理复杂的参数配置\n\n**选择 optimize_title 的情况：**\n- 需要快速批量优化\n- 有明确的自定义关键词\n- 对成本敏感\n- 需要精细控制优化策略\n- 需要传入 keyword_info 等额外信息\n\n## 注意事项\n\n### 服务依赖\n- 依赖 TPP 推理服务的可用性\n- 需要稳定的网络连接\n- 服务超时时间为 60 秒\n\n### 结果验证\n- 建议人工审核优化后的标题\n- 检查标题是否符合平台规范\n- 确认标题与商品的相关性\n- 避免违禁词和敏感词\n\n### 使用限制\n- 受 TPP 服务调用频率限制\n- 不支持自定义关键词输入\n- 优化结果由模型决定，可能需要多次尝试\n\n## 技术支持\n\n### 代码位置\n\n- **函数实现**：`src/skills/title_opt/scripts/interface.py::optimize_title_llm`\n- **测试脚本**：`src/skills/title_opt/scripts/test_title_llm.sh`\n- **文档位置**：`src/skills/title_opt/references/title_llm_SKILL.md`\n\n### 配置信息\n\n- **TPP服务URL**：在 `interface.py` 的 `URL` 变量中配置\n- **应用ID**：在 `interface.py` 的 `APP_ID` 变量中配置（当前：51522）\n- **场景标识**：`title_llm`\n\n## 未来优化方向\n\n1. **模型迭代**：持续优化 LLM 模型质量\n2. **自定义能力**：支持用户自定义关键词提示\n3. **批量优化**：支持批量调用和异步处理\n4. **A/B 测试**：对比不同优化策略的效果\n5. **用户反馈**：收集用户反馈，持续改进模型\n\nFile v0.1.0:references/title_optimizer_qa.md\n\n```\n## 常见问题\n\n### Q1: 为什么要并发执行两种方式？\n\n**A**:\n\n- 让用户直接看到两种优化风格的对比\n- 方式A保留原结构，方式B全面改写，各有优势\n- 用户可以根据实际需求选择最合适的标题\n- 并发执行节省时间，两个结果几乎同时返回\n\n### Q2: 用户偏好只对方式B生效吗？\n\n**A**:\n\n- 是的，`preference` 参数只传给 `optimize_title_llm`（方式B）\n- 方式A基于规则和系统推荐，不支持自定义偏好\n- 如果用户有特殊要求，通常方式B的结果会更符合需求\n\n### Q3: 如果两个结果都不满意怎么办？\n\n**A**:\n\n- 可以调整偏好参数，重新优化\n- 可以基于推荐词列表手动调整\n- 可以尝试不同的偏好描述\n\n### Q4: 并发调用会增加成本吗？\n\n**A**:\n\n- 方式A成本很低（规则计算）\n- 方式B成本较高（调用LLM）\n- 总成本主要取决于方式B\n- 但能让用户一次看到两种风格，提升选择效率\n\n### Q5: 会自动应用优化后的标题吗？\n\n**A**:\n\n- 不会自动应用\n- 只提供优化建议和新标题\n- 需要用户选择后确认应用\n- 确保用户完全掌控标题修改\n\n---\n\n```\n\nFile v0.1.0:references/title_wo_llm_SKILL.md\n\n---\nname: title_wo_llm\ndescription: 1688商品标题优化助手，无需LLM即可智能优化标题。通过三步流程（获取关键词信息 → 获取分词器列表并选择 → 使用选定分词器优化标题）提升标题质量。支持自定义关键词、选择分词器。使用场景：优化商品标题、自定义关键词优化。\n---\n\n# 标题优化助手 (Title Optimization Assistant)\n\n为 1688 商品提供智能标题优化服务，基于规则和统计方法（无需 LLM），帮助商家快速提升标题质量、增加曝光和转化。\n\n## 核心优化流程\n\n标题优化采用三步流程，确保优化质量和效率：\n\n### 步骤1：获取关键词信息\n使用 `get_keyword_info` 获取优化所需的所有数据：\n- 类目热搜词（基于真实搜索数据）\n- 高曝光词（该商品的历史曝光关键词）\n- 类目信息和商品属性\n\n### 步骤2：获取分词器列表并选择\n使用 `get_tokenizers` 获取所有可用的分词器：\n- 获取所有预定义的分词器类型和说明\n- 根据用户需求或prompt选择合适的分词器\n- 如果用户没有指定，选择默认分词器（列表第一个）\n\n### 步骤3：调用优化服务\n使用 `optimize_title` 生成优化后的标题：\n- 删除重复词和低频词\n- 添加高相关性热搜词\n- 生成优化说明和推荐词\n\n## 快速开始\n\n### 完整优化流程示例\n\n```bash\n# 步骤1：获取关键词信息\npython3 scripts/interface.py --function get_keyword_info --item_id 123456789\n\n# 步骤2：获取分词器列表\npython3 scripts/interface.py --function get_tokenizers\n\n# 步骤3：优化标题\npython3 scripts/interface.py --function optimize_title --item_id 123456789 --use_llm\n```\n\n### 一键优化（跳过步骤1-2）\n\n如果不需要查看中间结果，可直接调用优化服务：\n\n```bash\npython3 scripts/interface.py --function optimize_title --item_id 123456789\n```\n\n## 功能详解\n\n### 1. get_keyword_info - 获取关键词信息\n\n获取标题优化所需的全部关键词数据。**支持用户自定义关键词输入。**\n\n**命令行：**\n```bash\npython3 scripts/interface.py --function get_keyword_info --item_id <商品ID> [--include_expo_words] [--include_hot_words] [--custom_keywords \"关键词1;关键词2;关键词3\"]\n```\n\n**参数：**\n- `--item_id` (必需): 商品ID\n- `--include_expo_words`: 包含高曝光词（默认True）\n- `--include_hot_words`: 包含类目热搜词（默认True）\n- `--custom_keywords` (可选): 用户自定义关键词，**使用分号分隔**，例如：\"保温杯;不锈钢;便携\"\n\n**使用示例：**\n```bash\n# 基础用法：获取系统推荐的关键词\npython3 scripts/interface.py --function get_keyword_info --item_id 123456789\n\n# 添加自定义关键词\npython3 scripts/interface.py --function get_keyword_info --item_id 123456789 --custom_keywords \"保温杯;不锈钢;大容量;便携\"\n\n# 只使用自定义关键词（不获取系统推荐）\npython3 scripts/interface.py --function get_keyword_info --item_id 123456789 --custom_keywords \"保温杯;不锈钢\" --no-include_hot_words\n```\n\n**返回结果：**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"item_id\": 123456789,\n    \"cate_id\": 50000001,\n    \"cate_name\": \"保温杯/保温瓶\",\n    \"hot_words\": [\"不锈钢\", \"保温杯\", \"便携\", \"大容量\"],\n    \"expo_words\": {\"保温\": 150, \"水杯\": 120},\n    \"custom_keywords\": [\"保温杯\", \"不锈钢\", \"大容量\", \"便携\"],\n    \"cpv\": \"材质:不锈钢;容量:500ml\",\n    \"original_title\": \"304不锈钢水杯\"\n  }\n}\n```\n\n### 2. get_tokenizers - 选择分词器\n\n获取所有分词器列表，并根据用户prompt选择分词器。如果用户没有对分词器进行描述，则选择默认分词器（第一个分词器）。\n\n**命令行：**\n```bash\npython3 scripts/interface.py --function get_tokenizers\n```\n\n**参数：**\n（空）\n\n**返回结果：**\n[{\"tokenizer\": \"qwen-flash\", \"desc\": \"使用qwen-flash模型进行分词\"}]\n\n获取上述结果后，按照用户prompt选择最匹配的分词器。\n\n### 3. optimize_title - 优化标题\n\n执行标题优化，生成优化后的标题。\n\n**命令行：**\n```bash\npython3 scripts/interface.py --function optimize_title --item_id <商品ID> [--use_llm]\n```\n\n**参数：**\n- `--item_id` (必需): 商品ID\n- `--use_llm`: 使用LLM进行热词相关性判断（可选，提升准确性但增加耗时）\n\n**返回结果：**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"item_id\": 123456789,\n    \"old_title\": \"304不锈钢水杯\",\n    \"new_title\": \"304不锈钢保温杯便携\",\n    \"optimize_reason\": \"添加热词:保温杯,便携\",\n    \"new_title_words\": [\n      {\"word\": \"304\", \"tag\": \"属性词\", \"type\": null},\n      {\"word\": \"不锈钢\", \"tag\": \"属性词\", \"type\": null},\n      {\"word\": \"保温杯\", \"tag\": \"热词\", \"type\": \"add\"}\n    ],\n    \"other_words\": [\n      {\"word\": \"大容量\", \"tag\": \"热词\", \"description\": \"类目热搜词，排名5\"}\n    ]\n  }\n}\n```\n\n## 使用场景\n\n### 场景1：新商品发布\n为新上架商品生成优质标题\n\n```bash\n# 步骤1：获取关键词信息\npython3 scripts/interface.py --function get_keyword_info --item_id 123456789\n\n# 步骤2：获取分词器列表\npython3 scripts/interface.py --function get_tokenizers\n# 假设返回: [{\"tokenizer\": \"qwen-flash\", \"desc\": \"...\"}, {\"tokenizer\": \"jieba\", \"desc\": \"...\"}]\n# 用户根据描述选择分词器，例如选择 \"qwen-flash\"\n\n# 步骤3：使用选定的分词器优化标题\npython3 scripts/interface.py --function optimize_title --item_id 123456789 --tokenizer_type qwen-flash --use_llm\n```\n\n### 场景2：自定义关键词优化\n商家想使用特定的关键词优化标题（例如品牌词、活动词等）\n\n```bash\n# 使用自定义关键词\npython3 scripts/interface.py --function get_keyword_info --item_id 123456789 \\\n  --custom_keywords \"双十一;爆款;旗舰店;限时特惠\"\n\n# 然后进行优化\npython3 scripts/interface.py --function optimize_title --item_id 123456789\n```\n\n**使用自定义关键词的优势：**\n- 可以添加品牌词、活动词等特殊关键词\n- 适合有特定营销需求的场景\n- 结合系统推荐词和自定义词，实现精准优化\n\n## 优化策略\n\n### 删除策略\n- **重复词**：标题中出现多次的词\n- **低频词**：类目中搜索量极低的词\n- **无效词**：对搜索无帮助的词\n\n### 添加策略\n- **高热度词**：类目热搜词，排名靠前\n- **高曝光词**：该商品历史高曝光的词\n- **高相关性**：与商品强相关的词（使用LLM判断）\n- **自定义词**：用户指定的关键词（品牌词、活动词等）\n\n### 长度控制\n优化后标题长度不超过 60 个字符（中文按2计，英文按1计）\n\n## 技术特点\n\n### 无需LLM的快速优化\n- 基于规则和统计的方法\n- 优化速度快（< 1秒）\n- 成本低，适合大规模应用\n\n### 可选LLM增强\n- 使用 `--use_llm` 参数启用\n- 提升热词相关性判断准确率\n- 耗时增加约0.5-1秒\n\n### 数据驱动\n- IGrpah图数据库：类目热搜词、词频统计\n- Hologres数据仓库：商品曝光数据\n- 实时计算：相似度分析、权重计算\n\nFile v0.1.0:scripts/Skill 交互接入快速指南 (Quick Start).md\n\n# Skill 交互接入快速指南 (Quick Start)\n\n本指南旨在帮助 Skill 开发者**快速接入** Newton Agent 的客户端交互能力。只需两步：**声明 Metadata** 和 **正文引导**。\n\n---\n\n## 1. 第一步：在 Metadata 中声明交互 (必选)\n\n在 `SKILL.md` 的 YAML Frontmatter 中添加 `interactions` 列表。这是框架识别和大模型发现交互能力的**唯一入口**。\n\n### 核心字段速查\n\n| 字段 | 说明 | 示例值 |\n| --- | --- | --- |\n| `name` | **交互唯一 ID**，大模型调用时使用 | `select_products` |\n| `type` | **组件类型**：`table` (表格), `card` (卡片), `input` (问答) | `table` |\n| `selectionType` | **数据类型标识**，决定云端存哪里 | `product`, `merchant` |\n| `description` | **业务语义**，告诉大模型何时用 | \"从结果中选择商品\" |\n| `required_data` | **数据槽位**，简要描述需要的数据 | `{ products: \"商品列表\" }` |\n\n### 快速复制模板\n\n```yaml\n---\nmetadata:\n  interactions:\n    - name: select_products_for_inquiry\n      type: table\n      selectionType: product\n      description: \"从搜索结果中选择要询盘的商品\"\n      required_data:\n        products: \"商品列表数组，每项包含 id, title, price\"\n---\n\n```\n---\n\n## 2. 第二步：在正文中引导大模型 (可选但推荐)\n\n在 `SKILL.md` 正文中，用自然语言告诉大模型**何时触发**、**如何填数**，以及**去哪里查规范**。\n\n### 引导话术示例\n\n> **触发时机**： 在执行 `text_search` 获得商品列表后，若用户表现出挑选意向，请调用 `show_interaction` 并设置 `name='select_products_for_inquiry'`。**数据填充**： 将 `text_search` 返回的 `items` 数组赋值给 `products` 槽位。**具体的字段映射规则与组件渲染数据结构请查阅** [`**references/interaction-specs.md**`](./references/interaction-specs.md) **中对应交互的章节。**\n\n#### 📌 完整引导案例（推荐直接复制）\n\n以下是一个完整的 Skill 正文引导示例，展示了如何严格遵循\"先查 specs、再构造参数\"的流程：\n\n⚠️ **交互渲染（必须执行）**：当此命令返回的 `data.data.products` 包含 ≥2 个商品时，禁止直接用 Markdown 表格输出商品数据，必须通过交互组件渲染：\n\n1.  **先读取** `{baseDir}/references/interaction-specs.md` 中的 `select_products_from_scoring` 章节，获取交互组件的完整数据结构定义\n    \n2.  **再触发** metadata.interactions 中声明的 `select_products_from_scoring` 交互，严格按 specs 中的字段映射构造参数\n    \n3.  **调用示例**：\n    \n\n### ⚠️ 关键约定\n\n---\n\n## 3. 三种组件的快速参考\n\n根据你的业务场景，选择对应的 `type`：\n\n### A. Table (表格选择) - 适合结构化数据多选\n\n*   **场景**：商品列表、订单筛选。\n    \n*   **Metadata 示例**：\n    \n\n### B. Card (选项卡片) - 适合快速偏好选择\n\n*   **场景**：风格选择、平台确认。端侧会自动追加“输入其他”。\n    \n*   **Metadata 示例**：\n    \n\n### C. Input (澄清问答) - 适合细节确认与自由输入\n\n*   **场景**：预算确认、备注填写。\n    \n*   **Metadata 示例**：\n    \n    ### D 打开 Tab 标签页 - 适合页面跳转与外部资源展示\n    \n    输出 type='open\\_tab' 时，客户端立即在工作区右侧新开一个 webview Tab，加载指定 URL 并渲染指定页面名称；工具不等用户操作即返回（fire-and-forget），聊天区同步出现一张\"已为你打开 xxx\"的只读气泡卡片\n    \n    ---\n    \n    ## 3.5 真实交互 Case 速查\n    \n    以下是三种组件在实际场景中的**完整可拷贝示例**，可直接作为 `show_interaction` 的入参参考。\n    \n    ### 通用字段速查（所有 case 通用）\n    \n    | 字段 | 适用类型 | 说明 |\n    | --- | --- | --- |\n    | `type` | 必填 | `card` / `table` / `input` |\n    | `selectionType` | 可选 | 数据类型标识（`product` / `merchant` / `style` / `requirement` 等），影响 UI 标签和云端分类 |\n    \n    #### card / input 专属（`questions[ ]` 内字段）\n    \n    | 字段 | 类型 | 默认 | 说明 |\n    | --- | --- | --- | --- |\n    | `question` | string | — | 问题文本，**支持 Markdown 渲染**（加粗、链接、列表、行内代码、`\\n` 换行） |\n    \n    | `options`\n    \n*   [ ] | — | 候选选项，2~6 个；不传或传 \n    \n\n`[ ]` 表示纯自由输入题 |\n\n| `allowMultiple` | boolean | `false` | 是否多选；多选题端侧自动出现「全选 / 取消全选」按钮（选项 ≥2 时） | | `required` | boolean | `false` | 是否必填；**默认可跳过**，端侧会显示「跳过此题」按钮，跳过的题回传 `{ answer: null, skipped: true }` |\n\n#### table 专属\n\n| 字段 | 类型 | 说明 |\n| --- | --- | --- |\n| `title` | string | 表格标题，**支持 Markdown 渲染** |\n\n| `columns[ ].editable` | boolean | 该列是否可在表格中直接编辑 |\n\n| `columns[ ].width` | number | 列宽（像素），不传自适应 |\n\n| `totalCount` | number | 总数据量提示（与 `rows.length` 可不一致，用于分页场景） | | `actions` | array | **自定义按钮**，配置后追加在「确认选择」右侧；点击后会把选中行 + 该按钮的 `description` 一起回传给大模型；不配置时仅展示「跳过」+「确认选择」 |\n\n#### open\\_tab 组件\n\n### 数据字段定义\n\n*   `**url**` (必填)\n    \n    *   类型: `string`\n        \n    *   约束: 必须以 `http://\\` 或 `https://\\` 开头\n        \n    *   映射规则: 从 `shop_query_tool` 的 `backend_url` 字段取值，拼接业务 query 参数\n        \n*   `**pageTitle**` (必填)\n    \n    *   类型: `string`\n        \n    *   建议长度: ≤ 20 字符（超出会在 Tab 上被 `...` 截断）\n        \n    *   映射规则: `${platformName} ${pageSubject}`，如 `\"Ozon 订单管理\"`\n        \n*   `**pageDescription**` (可选)\n    \n    *   类型: `string`\n        \n    *   长度: ≤ 80 字符\n        \n    *   用途: 在气泡卡片第二行展示，告诉用户页面做了哪些\n        \n*   `**iconUrl**` (可选)\n    \n    *   类型: `string`（http/https URL）\n        \n    *   用途: 卡片左侧的 18×18 方形图标；不传则显示默认 🌐\n        \n\n### 完整数据示例\n\n```json\n{\n  \"type\": \"open_tab\",\n  \"selectionType\": \"shop_backend\",\n  \"url\": \"https://seller.ozon.ru/app/orders\",\n  \"pageTitle\": \"Ozon 店铺订单\",\n  \"pageDescription\": \"查看今日待发货订单\"\n}\n\n```\n> **端侧默认能力**（无需在参数里声明，自动可用）：\n\n---\n\n### Case 1：Input 多步澄清（含必填、可跳过、Markdown 渲染、纯自由输入混合）\n\n典型场景：在启动一个新需求前，连续向用户确认项目类型、模块、规模、上线时间等多维度信息。`questions` 是有序数组，端侧会按顺序逐题展示。\n\n**本 case 演示**：\n\n*   通过 `required: true` 把「项目类型」「团队规模」标为必填，其余题可跳过\n    \n*   通过 `allowMultiple: true` + `required: false` 让多选题既能多选也能跳过\n    \n*   通过 Markdown 在 question 文本里加 `**加粗**`、`\\n` 换行、行内代码 ``code`` 来增强可读性\n    \n*   通过 `options: [ ]` 表示纯自由输入题\n    \n\n**回传结构**（同时演示已答 + 跳过的回传形态）：\n\n```json\n[\n  { \"question\": \"...\", \"answer\": \"电商系统\" },\n  { \"question\": \"...\", \"answer\": [\"用户管理\", \"订单系统\"] },\n  { \"question\": \"...\", \"answer\": null, \"skipped\": true }\n]\n\n```\n\n**调用入参**：\n\n```json\n{\n    \"type\": \"input\",\n    \"selectionType\": \"project_info\",\n    \"questions\": [\n        {\n            \"question\": \"**第一步**：您的项目类型是？\\n\\n> 不同类型对应不同的技术栈推荐。\",\n            \"options\": [\"电商系统\", \"社交平台\", \"企业管理系统\", \"其他\"],\n            \"allowMultiple\": false,\n            \"required\": true\n        },\n        {\n            \"question\": \"**第二步**：您需要哪些功能模块？（可多选，可跳过）\",\n            \"options\": [\"用户管理\", \"订单系统\", \"支付集成\", \"数据分析\", \"消息通知\", \"文件存储\"],\n            \"allowMultiple\": true,\n            \"required\": false\n        },\n        {\n            \"question\": \"**第三步**：您的团队规模是？\",\n            \"options\": [\"1-5人\", \"6-20人\", \"21-50人\", \"50人以上\"],\n            \"required\": true\n        },\n        {\n            \"question\": \"**第四步**：预期的上线时间？\\n\\n（如不确定可跳过此题，我们后续再讨论）\",\n            \"options\": [\"1个月内\", \"3个月内\", \"半年内\", \"1年内\"],\n            \"allowMultiple\": false,\n            \"required\": false\n        },\n        {\n            \"question\": \"**第五步**：您关注哪些非功能性指标？（可多选）\",\n            \"options\": [\"性能\", \"安全\", \"可扩展性\", \"可维护性\", \"合规性\"],\n            \"allowMultiple\": true,\n            \"required\": false\n        },\n        {\n            \"question\": \"**第六步**：目标用户群体？\",\n            \"options\": [\"个人消费者\", \"中小企业\", \"大型企业\", \"政府机构\"],\n            \"required\": false\n        },\n        {\n            \"question\": \"**第七步**：是否有其他特殊需求？请用一句话描述。\\n\\n例如：`需要对接钉钉` / `必须支持私有化部署`\",\n\n            \"options\": [ ],\n\n            \"required\": false\n        }\n    ]\n}\n\n```\n---\n\n### Case 2：Card 选项卡片（风格偏好收集，全部可跳过 + 多选全选）\n\n典型场景：在生图 / 生文等创意类任务前，快速收集用户的风格偏好。所有题目均设为可跳过，让用户对没强偏好的维度直接放过；多选题端侧会自动出现「全选」按钮。\n\n**本 case 演示**：\n\n*   全部题目 `required` 省略（即默认 false，可跳过）\n    \n*   多选题（颜色偏好、风格关键词）端侧自动出现「全选 / 取消全选」按钮\n    \n*   Markdown 在 question 中说明每个维度的语义\n    \n\n**调用入参**：\n\n```json\n{\n    \"type\": \"card\",\n    \"selectionType\": \"style\",\n    \"questions\": [\n        {\n            \"question\": \"**整体风格**：你希望作品偏向哪种基调？\",\n            \"options\": [\"简约\", \"复古\", \"科技感\", \"国潮\", \"暗黑\"],\n            \"allowMultiple\": false\n        },\n        {\n            \"question\": \"**主色调**：可选多个，端侧会出现「全选」按钮，方便你一键选齐。\",\n            \"options\": [\"黑白灰\", \"暖色系\", \"冷色系\", \"莫兰迪\", \"高饱和\", \"霓虹\"],\n            \"allowMultiple\": true\n        },\n        {\n            \"question\": \"**风格关键词**（可多选，可跳过）\",\n            \"options\": [\"极简\", \"繁复\", \"写实\", \"插画\", \"抽象\", \"故事感\"],\n            \"allowMultiple\": true\n        },\n        {\n            \"question\": \"**目标受众**：作品主要给谁看？\",\n            \"options\": [\"Z世代\", \"都市白领\", \"亲子家庭\", \"高净值人群\", \"通用\"],\n            \"allowMultiple\": false\n        }\n    ]\n}\n\n```\n---\n\n### Case 3：Table 表格选择（含可编辑列 + Markdown 标题）\n\n典型场景：商品列表批量选择，部分列允许用户在表格内直接修改（如名称、价格、类目）。\n\n**本 case 演示**：\n\n*   `columns[ ].editable: true` 让指定列可编辑\n    \n*   `title` 使用 Markdown 加粗 + 行内代码强调操作要点\n    \n*   端侧表头自动出现「全选 / 取消全选」按钮（行数 ≥2 时）\n    \n\n**调用入参**：\n\n```json\n{\n    \"type\": \"table\",\n    \"selectionType\": \"product\",\n    \"title\": \"请选择并修改商品信息 — **可直接在表格内编辑** `名称 / 价格 / 类目`\",\n    \"columns\": [\n        { \"key\": \"id\", \"label\": \"商品ID\", \"width\": 100 },\n        { \"key\": \"name\", \"label\": \"商品名称\", \"width\": 200, \"editable\": true },\n        { \"key\": \"price\", \"label\": \"价格(元)\", \"width\": 120, \"editable\": true },\n        { \"key\": \"stock\", \"label\": \"库存\", \"width\": 80 },\n        { \"key\": \"category\", \"label\": \"类目\", \"width\": 120, \"editable\": true },\n        { \"key\": \"status\", \"label\": \"状态\", \"width\": 100 }\n    ],\n    \"rows\": [\n        { \"id\": \"1001\", \"name\": \"无线蓝牙耳机 Pro\", \"price\": \"299\", \"stock\": 156, \"category\": \"电子产品\", \"status\": \"在售\" },\n        { \"id\": \"1002\", \"name\": \"机械键盘 RGB版\", \"price\": \"599\", \"stock\": 42, \"category\": \"电脑配件\", \"status\": \"在售\" },\n        { \"id\": \"1003\", \"name\": \"人体工学椅\", \"price\": \"1299\", \"stock\": 8, \"category\": \"办公家具\", \"status\": \"库存紧张\" },\n        { \"id\": \"1004\", \"name\": \"4K显示器 27寸\", \"price\": \"2499\", \"stock\": 23, \"category\": \"电脑配件\", \"status\": \"在售\" },\n        { \"id\": \"1005\", \"name\": \"智能手表\", \"price\": \"899\", \"stock\": 67, \"category\": \"穿戴设备\", \"status\": \"新品\" }\n    ],\n    \"totalCount\": 5\n}\n\n```\n---\n\n### Case 4：Table + 自定义 Actions（落库 / 下单 / 重新搜索）\n\n典型场景：选完商品后，用户可以选择不同的「下一步动作」。每个按钮都会把选中行 + 自己的 `description` 一起回传给大模型，让大模型在确认数据的同时直接得到「该做什么」的指令。\n\n**本 case 演示**：\n\n*   `actions` 数组配置 3 个自定义按钮，覆盖 `primary` / `default` / `destructive` 三种 variant\n    \n*   每个按钮的 `description` 是给大模型的\"附加任务指令\"，**不会展示给用户**（用户看到的只是 `label`）\n    \n*   「跳过」+「确认选择」按钮始终保留（端侧默认行为，无需声明）\n    \n\n**回传结构**：\n\n用户点了自定义按钮（以「落库」为例）时：\n\n```json\n{\n  \"selectionType\": \"product\",\n  \"data\": {\n    \"selectedRows\": [ { \"id\": \"1001\", \"name\": \"...\", ... } ],\n    \"action\": {\n      \"key\": \"store_to_db\",\n      \"label\": \"落库\",\n      \"description\": \"把选中的商品数据直接写入到 ods_product_pool 表，跳过人工确认环节\"\n    }\n  }\n}\n\n```\n\n用户点了默认「确认选择」时（兼容老逻辑）：\n\n```json\n{\n  \"selectionType\": \"product\",\n  \"data\": { \"selectedRows\": [ ... ], \"action\": \"confirm\" }\n}\n\n```\n\n用户点了「跳过」时：\n\n```json\n{\n  \"selectionType\": \"product\",\n\n  \"data\": { \"selectedRows\": [ ], \"action\": \"skip\" }\n\n}\n\n```\n\n**调用入参**：\n\n```json\n{\n    \"type\": \"table\",\n    \"selectionType\": \"product\",\n    \"title\": \"请选择目标商品，并通过下方按钮告诉我要执行哪一种后续操作\",\n    \"columns\": [\n        { \"key\": \"id\", \"label\": \"商品ID\", \"width\": 100 },\n        { \"key\": \"name\", \"label\": \"商品名称\", \"width\": 220 },\n        { \"key\": \"price\", \"label\": \"价格\", \"width\": 100 },\n        { \"key\": \"stock\", \"label\": \"库存\", \"width\": 80 }\n    ],\n    \"rows\": [\n        { \"id\": \"1001\", \"name\": \"无线蓝牙耳机 Pro\", \"price\": \"¥299\", \"stock\": 156 },\n        { \"id\": \"1002\", \"name\": \"机械键盘 RGB版\",   \"price\": \"¥599\", \"stock\": 42  },\n        { \"id\": \"1003\", \"name\": \"人体工学椅\",       \"price\": \"¥1299\",\"stock\": 8   }\n    ],\n    \"totalCount\": 3,\n    \"actions\": [\n        {\n            \"key\": \"store_to_db\",\n            \"label\": \"落库\",\n            \"description\": \"把选中的商品数据直接写入到 ods_product_pool 表，跳过人工确认环节\",\n            \"variant\": \"primary\"\n        },\n        {\n            \"key\": \"create_order\",\n            \"label\": \"立即下单\",\n            \"description\": \"对选中的商品创建采购订单，使用默认收货地址，订单状态置为待支付\",\n            \"variant\": \"primary\"\n        },\n        {\n            \"key\": \"research_again\",\n            \"label\": \"重新搜索\",\n            \"description\": \"用户对当前结果不满意，请放大搜索范围（去掉品牌限定、扩大价格区间到 ±50%）后重新调用 text_search\",\n            \"variant\": \"default\"\n        },\n        {\n            \"key\": \"blacklist\",\n            \"label\": \"加入黑名单\",\n            \"description\": \"把选中的商品 ID 加入用户黑名单，后续搜索结果中永不出现\",\n            \"variant\": \"destructive\"\n        }\n    ]\n}\n\n```\n> `**variant**` **视觉效果速查**：\n\n---\n\n### Case 5：open\\_tab 打开店铺后台\n\n```markdown\n典型场景：用户问\"我店铺今天有多少待发货订单\"，大模型判断需要跳转到后台页面时，直接打开对应页面，并继续往下回答或\n执行下一步（fire-and-forget 的关键优势）。\n{\n  \"type\": \"open_tab\",\n  \"selectionType\": \"shop_backend\",\n  \"url\": \"https://work.1688.com/home/page/index.htm\",\n  \"pageTitle\": \"Ozon 店铺订单\",\n  \"pageDescription\": \"查看今日待发货订单\"\n}\n```\n\n## 4. \n\n## 关键注意事项 (避坑指南)\n\n1.  `**selectionType**` **必须准**：填 `product` 还是 `merchant` 直接决定数据存入哪张表，请勿随意填写。\n    \n2.  **Table 不能为空**：调用 `table` 类型交互前，务必确保 `rows` 有真实数据，否则前端会报错。\n    \n3.  **细节下沉**：Metadata 中只写**槽位名**和**简要描述**。复杂的 JSON 结构、Props 定义和数据映射规则应写入 `references/interaction-specs.md`，实现声明与实现的解耦。\n    \n\n**推荐目录结构**：\n\n```text\nmy-skill/\n├── SKILL.md                      # 轻量级声明与业务逻辑\n└── references/\n    └── interaction-specs.md      # 详细的组件 Props 与数据格式定义\n\n```\n---\n\n## 5. `references/interaction-specs.md` 编写规范\n\n该文档是 Skill 内部的**交互详细说明书**，供大模型在调用 `show_interaction` 前查阅，确保数据结构正确。\n\n### 编写原则\n\n1.  **一个交互一节**：每个在 Metadata 中声明的 `interactions` 条目，对应文档中的一个章节，标题与 `name` 一致。\n    \n2.  **聚焦数据结构**：只写**渲染数据结构**和**字段映射规则**，不要重复 Metadata 中已有的业务描述。\n    \n3.  **给出真实示例**：提供一段可直接拷贝的 JSON 示例，便于大模型对照填充。\n    \n\n### 标准模板\n\n```markdown\n# 交互组件详细规范\n\n本文档定义了本 Skill 中所有交互组件的具体数据结构与映射规则。\n\n## 1. <交互 name> (<组件类型> 组件)\n\n### 组件类型\n`type: table` | `card` | `input`\n\n### 数据槽位定义\n- **`<槽位名>`**:\n  - 类型: `Array<Object>` / `String` / ...\n  - 映射规则: 描述该槽位的数据从哪个 Tool 的哪个字段转换而来。\n  - 必须字段: 列出对象内必须包含的 key。\n\n### 框架自动填充的字段（如有）\n说明框架会根据 `selectionType` 自动注入哪些默认值（如 Table 的 `columns`），Skill 无需手动指定。\n\n```json\n[\n  { \"key\": \"imageUrl\", \"label\": \"图片\", \"width\": 80 },\n  { \"key\": \"title\", \"label\": \"商品标题\" },\n  { \"key\": \"price\", \"label\": \"价格\" }\n]\n\n```\n\n### 完整数据示例\n\n```json\n{\n  \"products\": [\n    { \"id\": \"p1\", \"title\": \"示例商品\", \"price\": 99, \"imageUrl\": \"https://...\" }\n  ]\n}\n\n```\n```plaintext\n\n### 编写要点速查\n\n| 章节 | 必须包含 | 说明 |\n| :--- | :--- | :--- |\n| 组件类型 | ✅ | 与 Metadata 的 `type` 保持一致 |\n| 数据槽位定义 | ✅ | 每个 `required_data` 槽位都要展开 |\n| 映射规则 | ✅ | 明确指出数据来源的 Tool 与字段路径 |\n| 框架自动填充 | ⭕ | 仅 `selectionType` 有内置模板时需要写 |\n| 完整数据示例 | ✅ | 一段可直接拷贝的 JSON |\n\n---\n\n\n*更多详细技术实现请参考：[SIMPLE_INTERACTION_PROTOCOL.md](./SIMPLE_INTERACTION_PROTOCOL.md)*\n\n\n```\n\nFile v0.1.0:capabilities/get_keyword_info.md\n\n# get_keyword_info — 获取关键词信息\n\n## 功能说明\n\n获取标题优化所需的全部关键词数据，包括类目热搜词、高曝光词、类目信息和商品属性。支持用户自定义关键词输入。\n\n## 前置条件\n\n- 已配置 AK（通过 `cli.py configure YOUR_AK` 或设置环境变量 `ALI_1688_AK`）\n\n## CLI 调用\n\n```bash\n# 基础调用\npython3 {baseDir}/cli.py get_keyword_info --item_id <商品ID>\n\n# 添加自定义关键词\npython3 {baseDir}/cli.py get_keyword_info --item_id <商品ID> --custom_keywords \"保温杯;不锈钢;便携\"\n```\n\n**参数说明**：\n\n| 参数 | 类型 | 必需 | 说明 |\n|------|------|------|------|\n| `--item_id` | int | 是 | 商品ID |\n| `--include_expo_words` | flag | 否 | 包含高曝光词（默认 True） |\n| `--include_hot_words` | flag | 否 | 包含类目热搜词（默认 True） |\n| `--custom_keywords` | str | 否 | 自定义关键词，分号分隔 |\n\n## 返回数据说明\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| item_id | int | 商品ID |\n| cate_id | int | 类目ID |\n| cate_name | String | 类目名称 |\n| hot_words | Array | 类目热搜词列表 |\n| expo_words | Object | 高曝光词及曝光量 |\n| custom_keywords | Array | 用户自定义关键词 |\n| cpv | String | 商品属性 |\n| original_title | String | 原标题 |\n\n## 输出格式\n\n### 成功输出\n\n```json\n{\n  \"success\": true,\n  \"markdown\": \"✅ 关键词信息获取成功\",\n  \"data\": {\n    \"item_id\": 123456789,\n    \"cate_id\": 50000001,\n    \"cate_name\": \"保温杯/保温瓶\",\n    \"hot_words\": [\"不锈钢\", \"保温杯\", \"便携\", \"大容量\"],\n    \"expo_words\": {\"保温\": 150, \"水杯\": 120},\n    \"custom_keywords\": [\"保温杯\", \"不锈钢\", \"大容量\", \"便携\"],\n    \"cpv\": \"材质:不锈钢;容量:500ml\",\n    \"original_title\": \"304不锈钢水杯\"\n  }\n}\n```\n\n## 异常处理\n\n| 异常场景 | 处理方式 |\n|---------|---------|\n| AK 未配置 | 提示用户配置 AK |\n| 商品ID 未提供 | 提示用户提供 --item_id 参数 |\n| 签名无效（401） | 提示用户检查 AK 是否有效 |\n| 请求被限流（429） | 建议用户等待 1-2 分钟后重试 |\n\nFile v0.1.0:capabilities/get_tokenizers.md\n\n# get_tokenizers — 获取分词器列表\n\n## 功能说明\n\n获取所有可用的分词器列表及说明。根据用户需求或 prompt 选择合适的分词器。如果用户没有指定，选择默认分词器（列表第一个）。\n\n## 前置条件\n\n- 已配置 AK（通过 `cli.py configure YOUR_AK` 或设置环境变量 `ALI_1688_AK`）\n\n## CLI 调用\n\n```bash\npython3 {baseDir}/cli.py get_tokenizers\n```\n\n**无参数**，返回所有可用分词器列表。\n\n## 返回数据说明\n\n成功时返回 `data` 对象，包含 `tokenizers` 数组：\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| tokenizer | String | 分词器类型标识 |\n| desc | String | 分词器描述 |\n\n## 输出格式\n\n### 成功输出\n\n```json\n{\n  \"success\": true,\n  \"markdown\": \"✅ 分词器列表获取成功\",\n  \"data\": {\n    \"tokenizers\": [\n      {\"tokenizer\": \"qwen-flash\", \"desc\": \"使用qwen-flash模型进行分词\"}\n    ]\n  }\n}\n```\n\n## 异常处理\n\n| 异常场景 | 处理方式 |\n|---------|---------|\n| AK 未配置 | 提示用户配置 AK |\n| 签名无效（401） | 提示用户检查 AK 是否有效 |\n| 请求被限流（429） | 建议用户等待 1-2 分钟后重试 |\n\n## 使用说明\n\n1. 获取分词器列表后，根据用户需求选择合适的分词器\n2. 如果用户没有指定，默认使用列表中的第一个分词器\n3. 选定的分词器类型可传入 `optimize_title` 的 `--tokenizer_type` 参数\n\nFile v0.1.0:capabilities/optimize_title_llm.md\n\n# optimize_title_llm — LLM 深度重写\n\n## 功能说明\n\n基于大语言模型的智能标题重写方式。LLM 深度理解商品特征后全面改写标题，生成更自然流畅的标题，自动更新年份、融入热词。支持用户偏好定制（如\"加入'防潮'单词\"）。\n\n## 前置条件\n\n- 已配置 AK（通过 `cli.py configure YOUR_AK` 或设置环境变量 `ALI_1688_AK`）\n\n## CLI 调用\n\n```bash\n# 基础调用\npython3 {baseDir}/cli.py optimize_title_llm --item_id <商品ID>\n\n# 带用户偏好\npython3 {baseDir}/cli.py optimize_title_llm --item_id <商品ID> --preference \"加入防潮单词\"\n```\n\n**参数说明**：\n\n| 参数 | 类型 | 必需 | 说明 |\n|------|------|------|------|\n| `--item_id` | int | 是 | 商品ID |\n| `--preference` | str | 否 | 用户偏好，自然语言描述优化偏好 |\n\n## 用户偏好参数 (preference)\n\n`preference` 参数允许用户通过自然语言指定优化偏好，LLM 会在优化标题时考虑这些偏好。\n\n**支持的偏好类型**：\n\n- **关键词偏好**：\"加入'防潮'单词\"、\"添加'防摔'和'耐用'关键词\"\n- **特点强调**：\"突出材质特点\"、\"强调便携性\"、\"体现性价比\"\n- **风格偏好**：\"标题要简洁\"、\"面向年轻消费者\"\n- **组合偏好**：\"加入'防潮'单词，同时突出材质特点\"\n\n**Agent 偏好提取关键词**：\n\n| 用户表述 | 偏好类型 |\n|---------|---------|\n| \"加入xxx\"、\"添加xxx\"、\"包含xxx\" | 关键词偏好 |\n| \"突出xxx\"、\"强调xxx\"、\"体现xxx\" | 特点强调 |\n| \"要xxx风格\"、\"面向xxx\" | 风格偏好 |\n\n## 返回数据说明\n\n成功时返回 `data` 对象，包含以下字段：\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| item_id | int | 商品ID |\n| old_title | String | 原标题（⚠️ 必须展示） |\n| new_title | String | 优化后的标题（⚠️ 必须展示） |\n| new_title_words | Array | 标题词列表，包含每个词的标签和描述 |\n| other_words | Array | 推荐词列表，未使用的高价值热词 |\n\n## 输出格式\n\n### 成功输出\n\n```json\n{\n  \"success\": true,\n  \"markdown\": \"✅ 标题优化完成（LLM深度重写）\",\n  \"data\": {\n    \"item_id\": 831034165952,\n    \"old_title\": \"304不锈钢水杯\",\n    \"new_title\": \"2026新款304不锈钢保温杯便携大容量运动水杯\",\n    \"new_title_words\": [\n      {\"word\": \"2026\", \"tag\": \"时间词\", \"type\": null, \"description\": \"自动更新至当前年份\"},\n      {\"word\": \"新款\", \"tag\": \"修饰词\", \"type\": null},\n      {\"word\": \"304\", \"tag\": \"属性词\", \"type\": null},\n      {\"word\": \"不锈钢\", \"tag\": \"材质词\", \"type\": null},\n      {\"word\": \"保温杯\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"便携\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"大容量\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"运动\", \"tag\": \"热词\", \"type\": null, \"description\": \"类目热搜词\"},\n      {\"word\": \"水杯\", \"tag\": \"品类词\", \"type\": null}\n    ],\n    \"other_words\": [\n      {\"word\": \"户外\", \"tag\": \"热词\", \"weight\": 8.5, \"min_rnk\": 12, \"description\": \"类目热搜词，排","readmeExcerpt":"Skill: 1688-item-title-optimizer Owner: 1688aiinfra Summary: 1688商品标题优化 工具能力：为商品标题添加热词优化（快速、基于规则）和 LLM 深度重写（高质量、自然流畅），支持用户输入偏好。如果用户没有选择想优化标题的商品，技能中可以出组件让用户选择； 触发词：优化标题、标题优化、改标题、重写标题、商品标题、标题改写、分析标题、我要优化标题、标题里哪些词没用、标题里应该加哪些热搜关键词、我的商品标题怎么优化？、我的标题怎么优化？、我要优化商品标题 Tags: latest:0.83.0 Version history: v0.83.0 | 2026-09-04T02:35:06.845Z | auto **Multi-store/shop support and command expansion:** - Added support for multi-store","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# 优化指定店铺的商品标题（规则版）\npython3 {baseDir}/cli.py optimize_title --item_id <商品ID> --NEWTON_SHOP_LOGIN_ID \"店铺loginId\"\n\n# 优化指定店铺的商品标题（LLM版）\npython3 {baseDir}/cli.py optimize_title_llm --item_id <商品ID> --NEWTON_SHOP_LOGIN_ID \"店铺loginId\""},{"language":"bash","snippet":"python3 {baseDir}/cli.py get_bindlist"},{"language":"bash","snippet":"# 查看 AK 状态\npython3 {baseDir}/cli.py configure\n# 设置 AK\npython3 {baseDir}/cli.py configure YOUR_AK"},{"language":"bash","snippet":"python3 {baseDir}/cli.py optimize_title --item_id <商品ID>"},{"language":"bash","snippet":"# 基础调用\npython3 {baseDir}/cli.py optimize_title_llm --item_id <商品ID>\n\n# 带用户偏好\npython3 {baseDir}/cli.py optimize_title_llm --item_id <商品ID> --preference \"加入防潮单词\""},{"language":"bash","snippet":"# 基础调用\npython3 {baseDir}/cli.py get_keyword_info --item_id <商品ID>\n\n# 添加自定义关键词\npython3 {baseDir}/cli.py get_keyword_info --item_id <商品ID> --custom_keywords \"保温杯;不锈钢;便携\""}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: 1688-item-title-optimizer\ndescription: |\n  1688商品标题优化\n  工具能力：为商品标题添加热词优化（快速、基于规则）和 LLM 深度重写（高质量、自然流畅），支持用户输入偏好。如果用户没有选择想优化标题的商品，技能中可以出组件让用户选择；\n  触发词：优化标题、标题优化、改标题、重写标题、商品标题、标题改写、分析标题、我要优化标题、标题里哪些词没用、标题里应该加哪些热搜关键词、我的商品标题怎么优化？、我的标题怎么优化？、我要优化商品标题\nmetadata:\n  openclaw:\n    emoji: \"✏️\"\n    requires:\n      bins:\n        - python\n  interactions:\n    - name: open_tab_select_product\n      type: open_tab\n      selectionType: shop_backend\n      description: \"当用户未提供商品ID时，直接输出该JSON唤起商品选择页面，流程结束，禁止反问用户\"\n      required_data:\n        url: \"https://air.1688.com/app/CSBC-modules/csbc-ai-component-loader/picture-optimize.html?mode=newton-select-offer&skillCode=1688-item-title-optimizer\"\n        pageTitle: \"选择商品\"\n        pageDescription: \"选择商品优化标题\"\n        icon: \"https://img.alicdn.com/imgextra/i3/O1CN01gQPY341cm5b1gzS1k_!!6000000003642-2-tps-80-80.png\"\n    - name: confirm_apply_title\n      type: card\n      selectionType: requirement\n      description: \"用户选定标题后，确认是否应用到商品\"\n      required_data:\n        questions: \"展示选定标题并询问是否应用\"\n    - name: select_items_to_optimize\n      type: table\n      selectionType: product\n      description: \"当用户传入≥3个商品ID时，在左侧弹出表格让用户筛选要优化的商品\"\n      required_data:\n        title: \"表格标题\"\n        columns: \"列定义数组：商品ID、当前标题\"\n        rows: \"商品列表，每项包含 itemId、title\"\n    - name: title_comparison_card\n      type: table\n      selectionType: title_plan\n      description: \"两种优化方案生成后，在左侧弹出表格供用户选择新标题。3列（方案+属性+内容），每个成功方案4个维度各占一行（两个都成功=8行，一个成功一个失败=仅展示成功方案的4行，两个都失败=不弹表格直接提示重试）。利用端侧 show_interaction.table v2 协议的 mergedColumns + groupBy + selectionGranularity:group + selectionMode:single 实现方案列相邻同值合并 + 组级互斥单选，用户勾选整组后点击「采用此方案」按钮\"\n      required_data:\n        title: \"表格标题：请选择新标题 + 商品名称（商品ID）\"\n        columns: \"固定3列：plan（方案标识，宽80，不传 editable）、field（属性标签，宽140，必须显式声明 editable:false 否则会被端侧误渲染为可编辑，用户实测确认）、value（内容，宽620，不传 editable，由行级 rows[i].editable 控制）。配合行级 editable：仅新标题行 rows[i] 加 editable:true 时该 cell 可编辑，其他 cell 全部只读\"\n        mergedColumns: \"[\\\"plan\\\"]。协议硬约束：列必须存在；不能含列级 editable:true 的列。本场景 value 已不开列级 editable，但仍只合并 plan，因为 value 每行内容都不同没有相邻同值\"\n        groupBy: \"\\\"plan\\\"。selectionGranularity=group 时必填，按plan相邻同值切分组\"\n        selectionGranularity: \"\\\"group\\\"。勾选粒度按组（每组组首行渲染一个checkbox，rowSpan=组大小）\"\n        selectionMode: \"\\\"single\\\"。互斥单选：选新组自动取消旧组；点已选项=清空；空选=跳过。与 selectionGranularity 正交\"\n        actions: \"[{key:adopt, label:采用此方案, variant:primary, description:...}]，覆盖默认「确认选择」\"\n        rows: \"4行或8行（rows.length≤10，超过会触发分页关闭合并）。仅填入成功方案的行，失败方案不展示。两个都成功=8行，一个成功一个失败=4行，两个都失败=不弹表格。同方案的4行 plan 必须填相同值且连续排列：方案名称、新标题（仅这行 rows[i].editable:true，可cell内编辑）、生成逻辑及优化说明、预估曝光变化\"\n        respond_contract: \"selectedRows 始终回传展开后的N行（与 multiple+row 同构），Agent 按 plan 分组、按 field=新标题 取最终value（含编辑），空选视为跳过。无论端侧是否识别行级 editable，Agent 必须软兜底：只采用「新标题」行的编辑值，其他 3 行编辑显式忽略\"\n---\n\n# 1688-item-title-optimizer — 商品标题智能优化\n\n## 技能概述\n\n1688 商品标题智能优化助手。自动并发执行两种优化算法生成结果：1) 添加热词优化（快速、基于规则）2) LLM 深度重写（高质量、自然流畅）。只需提供商品 ID，即可同时获得两种优化方案供对比选择。支持用户偏好参数（如\"加入'防潮'单词\"）。\n\n## 使用场景\n\n- 商品标题修改、改写、优化\n- 新品发布，需要高质量标题\n- 批量优化商品标题\n- 用"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn76msg8cwkep3b08z7zffx9fx82p5wj\",\n  \"slug\": \"1688-item-title-optimizer\",\n  \"version\": \"0.83.0\",\n  \"publishedAt\": 1788489306845\n}"},{"path":"references/interaction-specs.md","content":"# 交互组件详细规范\n\n本文档定义了 1688-item-title-optimizer Skill 中所有交互组件的具体数据结构与映射规则。大模型在调用 `show_interaction` 前需查阅本文档，确保数据结构正确。\n\n---\n\n## 1. confirm_apply_title (Card 组件)\n\n### 组件类型\n\n`type: card` — 用户选定标题后，确认是否将新标题应用到商品。\n\n### 数据槽位定义\n\n- **`questions`**:\n  - 类型: `Array<Object>`\n  - 说明: 问题列表，每项包含 `question`（问题文本）和 `options`（选项数组）\n\n### 构造规则\n\n- `question` 中应展示原标题和选定的新标题，让用户做最终确认\n- 明确说明\"应用\"操作的含义（会替换当前商品标题）\n\n### 完整数据示例\n\n```json\n{\n  \"questions\": [\n    {\n      \"question\": \"确认将以下标题应用到商品？\\n\\n原标题：304不锈钢水杯\\n新标题：2026新款304不锈钢保温杯 大容量便携户外水杯 男女通用\\n\\n应用后将替换当前的商品标题。\",\n      \"options\": [\n        \"✅ 确认，应用到商品标题\",\n        \"✏️ 我想手动微调后再应用\",\n        \"💾 仅记录，暂不应用到商品\"\n      ],\n      \"required\": true\n    },\n    {\n      \"question\": \"**如需微调标题**，请在下方输入修改后的完整标题：\\n\\n> 当前推荐标题：2026新款304不锈钢保温杯 大容量便携户外水杯 男女通用\",\n      \"options\": [],\n      \"required\": false\n    }\n  ]\n}\n```\n\n> **说明**：第二个 question 的 `options` 为空数组，端侧会渲染为**大输入框**（而非小的\"输入其他\"框），方便用户输入完整的商品标题（通常 30-60 字）。`required: false` 表示仅当用户选择\"手动微调\"时才需要填写。\n\n### 用户选择后的处理\n\n| 用户选择 | Agent 行为 |\n|---------|-----------|\n| 确认应用 | 调用 `1688-item-one-click` 将选定标题更新到商品，完成后输出成功提示 |\n| 手动微调 | 使用第二个 question 中用户输入的标题，调用 `1688-item-one-click` 应用微调版本 |\n| 仅记录 | 结束流程，提示用户可后续手动应用 |\n\n---\n\n## 2. select_items_to_optimize (Card 组件)\n\n### 组件类型\n\n`type: card` — 当用户传入 3 个及以上商品 ID 时，展示商品列表让用户筛选需要优化的商品，缩小分析范围。\n\n### 触发条件\n\n- 用户在一次请求中传入 **≥ 3 个商品 ID**\n- Agent 必须在执行优化前触发此交互，不得自动全部执行\n\n### 数据槽位定义\n\n- **`questions`**:\n  - 类型: `Array<Object>`\n  - 说明: 问题列表，每项包含 `question`（问题文本）和 `options`（选项数组）\n  - 端侧会自动追加\"输入其他\"选项\n\n### 构造规则\n\n- `question` 中应列出所有传入的商品 ID 及其当前标题，方便用户辨识\n- 选项中应包含每个商品的 ID + 标题摘要（截取前 20 字），以及\"全部优化\"和\"取消\"选项\n- 如果无法预先获取标题，可仅展示商品 ID\n\n### 完整数据示例\n\n```json\n{\n  \"questions\": [\n    {\n      \"question\": \"您提供了 4 个商品，一次优化过多可能影响效率和结果质量。请选择需要优化的商品（建议不超过 3 个）：\\n\\n1. 商品 831034165952：304不锈钢水杯大容量...\\n2. 商品 742091827364：儿童书包男生小学生...\\n3. 商品 653928174051：夏季短袖T恤男纯棉...\\n4. 商品 590817263940：办公椅电脑椅家用舒适...\",\n      \"options\": [\n        \"优化商品1：831034165952\",\n        \"优化商品2：742091827364\",\n        \"优化商品3：653928174051\",\n        \"优化商品4：590817263940\",\n        \"全部优化（可能耗时较长）\",\n        \"❌ 取消，暂不优化\"\n      ]\n    }\n  ]\n}\n```\n\n### 用户选择后的处理\n\n| 用户选择 | Agent 行为 |\n|---------|-----------|\n| 选择特定商品（可多选） | 仅对选中的商品执行并发优化流程 |\n| 全部优化 | 对所有商品逐个执行优化流程，按顺序展示结果 |\n| 取消 | 结束流程，输出友好的结束语 |\n| 输入其他（端侧追加） | 用户可手动输入要优化的商品 ID 列表 |\n\n---\n\n## 3. title_comparison_card (Table 组件 — 相邻同值合并 + 组级单选)\n\n> ### ⚠️ 端侧版本依赖（v2 协议）\n>\n> 本交互依赖 `show_interaction.table` 的 **v2 协议扩展字段**：`mergedColumns` / `selectionGranularity` / `selectionMode` / `groupBy`。这 4 个字段**仅在已升级到 v2 的客户端**（如 newton-desktop v2 及以上）才会生效。\n>\n> **当前 1688 工作台 / 找工厂客户端尚未升级到 v2**，该客户端会**忽略**这 4 个字段，把 payload 退化为默认的 `row + multiple`（行级多选）模式渲染：\n>\n> | 现象 | v2 客户端（期望） | 未升级客户端（当前实际）|\n> |------|------------------|----------------------|\n> | 勾选框数量 | 2 个（每组组首行 1 个，rowSpan=4）| 8 个（每行 1 个）|\n> | 方案列单元格 | 「方案A」「方案B」各合并为 1 个大 cell | 8 行各显示一次「方案A」/「方案B」|\n> | 勾选语义 | 整组互斥单选（A↔B 二选一）| 行级多选，可任意勾 N 行 |\n> | 已选计数 | 0/8 或 4/8 | 0/8 ~ 8/8 任意 |\n>\n> **重要原则**：\n> 1. **payload 不要为兼容降级而修改** —— 协议字段写法是正确的，问题在端侧未实现，等客户端升级即可自动生效\n> 2. *"},{"path":"references/title_llm_SKILL.md","content":"---\nname: title_llm\ndescription: 1688商品标题智能优化助手，基于LLM深度优化标题。只需提供商品ID，一键调用TPP推理服务，自动完成标题的智能重写、年份更新、热词标注和推荐词生成。使用场景：需要深度优化的商品标题、新品发布、标题全面改写。\n---\n\n# 标题智能优化助手 (Title LLM Optimization Assistant)\n\n为 1688 商品提供基于大语言模型的智能标题优化服务。只需提供商品ID，一键调用 TPP 推理服务完成深度优化，无需额外操作。\n\n## ⚠️ 重要：Agent 展示规范\n\n**在展示优化结果时，必须遵守以下规则：**\n\n1. **必须同时显示**：优化结果中必须同时显示原标题（old_title）和新标题（new_title）\n2. **禁止只显示新标题**：不能只显示 new_title，用户需要对比查看\n3. **清晰对比**：建议使用对比格式展示，例如：\n   ```\n   原标题：[old_title]\n   新标题：[new_title]\n   ```\n\n## 快速参考\n\n```python\n# 最简单的调用方式\nfrom interface import optimize_title_llm\n\nresult = optimize_title_llm({\"item_id\": 831034165952})\n\n# 带用户偏好的调用方式\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'单词\"\n})\n```\n\n```bash\n# 命令行调用\npython3 interface.py --function optimize_title_llm --item_id 831034165952\n\n# 带用户偏好的命令行调用\npython3 interface.py --function optimize_title_llm --item_id 831034165952 --preference \"加入防潮单词\"\n```\n\n**核心特点**：\n- ✅ 只需提供 item_id，无需其他参数\n- ✅ 支持用户偏好定制（可选）\n- ✅ 自动完成所有优化步骤\n- ✅ 返回优化后的标题和详细分析\n- ✅ 无需手动获取关键词信息\n- ✅ 无需配置分词器\n\n## 用户偏好参数 (preference)\n\n### 什么是用户偏好参数？\n\n`preference` 参数允许用户通过自然语言指定优化偏好，LLM会在优化标题时考虑这些偏好。\n\n### 如何使用？\n\n**Agent 使用指南**：\n1. **识别用户意图**：当用户在优化请求中提到特定要求时，提取这些要求\n2. **提取偏好**：将用户的自然语言要求整理成简洁的偏好描述\n3. **传入参数**：将偏好作为 `preference` 字段传入 `optimize_title_llm` 函数\n\n### 支持的偏好类型\n\n**关键词偏好**：\n- \"加入'防潮'单词\"\n- \"添加'防摔'和'耐用'关键词\"\n- \"必须包含'304不锈钢'\"\n\n**特点强调**：\n- \"突出材质特点\"\n- \"强调便携性\"\n- \"体现性价比\"\n- \"突出新款和时尚感\"\n\n**风格偏好**：\n- \"标题要简洁\"\n- \"标题要详细\"\n- \"使用专业术语\"\n- \"面向年轻消费者\"\n\n**组合偏好**：\n- \"加入'防潮'单词，同时突出材质特点\"\n- \"强调便携性和大容量，使用简洁风格\"\n\n### 使用示例\n\n#### 示例1：添加特定关键词\n```python\n# 用户说：\"优化这个商品标题，加入'防潮'这个词\"\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'单词\"\n})\n```\n\n#### 示例2：强调特点\n```python\n# 用户说：\"优化标题，要突出材质特点\"\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"突出材质特点\"\n})\n```\n\n#### 示例3：组合要求\n```python\n# 用户说：\"优化标题，加入防潮和防摔，还要强调便携性\"\nresult = optimize_title_llm({\n    \"item_id\": 831034165952,\n    \"preference\": \"加入'防潮'和'防摔'关键词，强调便携性\"\n})\n```\n\n#### 示例4：命令行使用\n```bash\n# 带偏好的命令行调用\npython3 interface.py --function optimize_title_llm \\\n  --item_id 831034165952 \\\n  --preference \"加入防潮单词，突出材质特点\"\n```\n\n### Agent 实现建议\n\n当 Agent 处理用户请求时，应该：\n\n1. **解析用户指令**：识别用户是否有特殊要求\n   ```\n   用户：\"优化商品831034165952的标题，加入'防潮'这个词\"\n   ↓\n   提取：item_id=831034165952, preference=\"加入'防潮'单词\"\n   ```\n\n2. **整理偏好描述**：将用户的要求转换为简洁的偏好描述\n   ```\n   用户：\"这个标题要突出是防水防潮的，还要体现出材质很好\"\n   ↓\n   整理：preference=\"突出防水防潮特点，强调材质优质\"\n   ```\n\n3. **调用接口**：将整理后的偏好传入接口\n   ```python\n   result = optimize_title_llm({\n       \"item_id\": item_id,\n       \"preference\": preference_text\n   })\n   ```\n\n### 注意事项\n\n1. **偏好是可选的**：如果用户没有特殊要求，可以不传 `preference` 参数\n2. **使用自然语言**：偏好描述使用自然语言即可，不需要特殊格式\n3. **保持简洁**：偏好描述应该简洁明了，一般1-2句话即可\n4. **避免冲突**：避免提出互相矛盾的偏好（如\"简洁\"和\"详细\"）\n\n## 核心优势\n\n### LLM 驱动的智能优化\n- 使用大语言模型深度理解商品信息\n- 智能重写标题，而非简单的关键词拼接\n- 自动理解类目特征和用户搜索习惯\n- 生成更自然、更符合用户搜索习惯的标题\n\n### 自动化处理\n- 自动获取商品信息（标题、类目、属性、图片、热搜词）\n- 自动调用 TPP 推理服务进行优化\n- 自动更新年份信息（2023/2024/2025 → 当前年份）\n- 自动标注热词类型\n\n### 智能推荐\n- 提供优化后的标题\n- 标注每个词的类型（热词、属性词等）\n- 推荐其他可添加的高价值热词\n- 展示热词权"},{"path":"references/title_optimizer_qa.md","content":"```\n## 常见问题\n\n### Q1: 为什么要并发执行两种方式？\n\n**A**:\n\n- 让用户直接看到两种优化风格的对比\n- 方式A保留原结构，方式B全面改写，各有优势\n- 用户可以根据实际需求选择最合适的标题\n- 并发执行节省时间，两个结果几乎同时返回\n\n### Q2: 用户偏好只对方式B生效吗？\n\n**A**:\n\n- 是的，`preference` 参数只传给 `optimize_title_llm`（方式B）\n- 方式A基于规则和系统推荐，不支持自定义偏好\n- 如果用户有特殊要求，通常方式B的结果会更符合需求\n\n### Q3: 如果两个结果都不满意怎么办？\n\n**A**:\n\n- 可以调整偏好参数，重新优化\n- 可以基于推荐词列表手动调整\n- 可以尝试不同的偏好描述\n\n### Q4: 并发调用会增加成本吗？\n\n**A**:\n\n- 方式A成本很低（规则计算）\n- 方式B成本较高（调用LLM）\n- 总成本主要取决于方式B\n- 但能让用户一次看到两种风格，提升选择效率\n\n### Q5: 会自动应用优化后的标题吗？\n\n**A**:\n\n- 不会自动应用\n- 只提供优化建议和新标题\n- 需要用户选择后确认应用\n- 确保用户完全掌控标题修改\n\n---\n\n```"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"1688商品标题优化 工具能力：为商品标题添加热词优化（快速、基于规则）和 LLM 深度重写（高质量、自然流畅），支持用户输入偏好。如果用户没有选择想优化标题的商品，技能中可以出组件让用户选择； 触发词：优化标题、标题优化、改标题、重写标题、商品标题、标题改写、分析标题、我要优化标题、标题里哪些词没用、标题里应该加哪些热搜关键词、我的商品标题怎么优化？、我的标题怎么优化？、我要优化商品标题 Skill: 1688-item-title-optimizer Owner: 1688aiinfra Summary: 1688商品标题优化 工具能力：为商品标题添加热词优化（快速、基于规则）和 LLM 深度重写（高质量、自然流畅），支持用户输入偏好。如果用户没有选择想优化标题的商品，技能中可以出组件让用户选择； 触发词：优化标题、标题优化、改标题、重写标题、商品标题、标题改写、分析标题、我要优化标题、标题里哪些词没用、标题里应该加哪些热搜关键词、我的商品标题怎么优化？、我的标题怎么优化？、我要优化商品标题 Tags: latest:0.83.0 Version history: v0.83.0 | 2026-09-04T02:35:06.845Z | auto **Multi-store/shop support and command expansion:** - Added support for multi-store","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":890,"uniquenessScore":54,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-11T17:14:50.148Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-11T17:14:50.148Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-11T20:59:44.216Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}