@round2ai/r2-cli 1.0.11 → 1.0.12-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -12
- package/dist/README.md +24 -12
- package/dist/r2-cli.js +36 -35
- package/package.json +7 -4
- package/scripts/install-skills.js +1 -20
- package/skills/r2-auth/SKILL.md +31 -45
- package/skills/r2-goods/SKILL.md +309 -98
- package/skills/r2-shared/SKILL.md +94 -0
- package/dist/package.json +0 -61
- package/scripts/build.js +0 -176
- package/scripts/dev.js +0 -22
- package/skills/r2-cli/SKILL.md +0 -70
- /package/skills/{r2-cli → r2-shared}/_meta.json +0 -0
package/skills/r2-auth/SKILL.md
CHANGED
|
@@ -1,21 +1,31 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: r2-auth
|
|
3
|
-
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "R2-CLI 认证登录专家。扫码登录和闲鱼店铺授权。用于登录、login、auth、扫码、二维码、授权、xianyu、logout、登出、状态查询场景。Agent 使用 auth login --json 一步完成登录。Agent 必须先将 qrUrl 链接展示给用户,再等待扫码结果。"
|
|
5
|
+
metadata:
|
|
6
|
+
requires:
|
|
7
|
+
bins: ["r2-cli"]
|
|
8
|
+
cliHelp: "r2-cli auth --help"
|
|
9
|
+
related:
|
|
10
|
+
- "r2-shared"
|
|
4
11
|
---
|
|
5
12
|
|
|
6
|
-
# R2-Auth
|
|
13
|
+
# R2-Auth (v1)
|
|
14
|
+
|
|
15
|
+
> **Tip**: Agent 使用 `--json` 一步完成登录:生成二维码 + 自动打开浏览器 + 自动轮询。**必须先将 qrUrl 展示给用户**,再等待扫码结果。
|
|
16
|
+
> **Tip**: 二维码 5 分钟过期,超时需重新执行命令。Token 存储在 `~/.r2-cli/config.json`。
|
|
7
17
|
|
|
8
18
|
扫码登录 + 闲鱼店铺授权,专为 AI Agent 设计。
|
|
9
19
|
|
|
10
|
-
##
|
|
20
|
+
## CRITICAL
|
|
11
21
|
|
|
12
|
-
|
|
22
|
+
安装、统一错误格式见 **r2-shared** skill。
|
|
13
23
|
|
|
14
24
|
---
|
|
15
25
|
|
|
16
|
-
##
|
|
26
|
+
## 扫码登录(auth login)
|
|
17
27
|
|
|
18
|
-
|
|
28
|
+
### 一步式(推荐)
|
|
19
29
|
|
|
20
30
|
```bash
|
|
21
31
|
r2-cli auth login --json
|
|
@@ -23,7 +33,7 @@ r2-cli auth login --json
|
|
|
23
33
|
|
|
24
34
|
命令会依次输出两段 JSON:
|
|
25
35
|
|
|
26
|
-
|
|
36
|
+
**第 1 段:二维码信息(立即输出)**
|
|
27
37
|
|
|
28
38
|
```json
|
|
29
39
|
{
|
|
@@ -39,24 +49,15 @@ r2-cli auth login --json
|
|
|
39
49
|
|------|------|
|
|
40
50
|
| `qrToken` | 二维码 token(轮询用,不需要手动使用) |
|
|
41
51
|
| `expireTimeMs` | 二维码过期时间(毫秒),默认 5 分钟 |
|
|
42
|
-
| `pollIntervalMs` | 轮询间隔(毫秒),不需要手动使用 |
|
|
43
52
|
| `url` | 扫码链接(用户也可手动访问) |
|
|
44
53
|
| `qrUrl` | 本地浏览器扫码页面链接 |
|
|
45
54
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
成功:
|
|
55
|
+
**第 2 段:登录结果(用户扫码确认后输出)**
|
|
49
56
|
|
|
50
57
|
```json
|
|
51
58
|
{ "success": true, "userInfo": { "nickname": "...", "mobile": "..." } }
|
|
52
59
|
```
|
|
53
60
|
|
|
54
|
-
失败:
|
|
55
|
-
|
|
56
|
-
```json
|
|
57
|
-
{ "success": false, "error": "二维码已过期" }
|
|
58
|
-
```
|
|
59
|
-
|
|
60
61
|
### Agent 操作步骤
|
|
61
62
|
|
|
62
63
|
1. 用 Bash 工具 `run_in_background: true` 启动命令
|
|
@@ -73,11 +74,9 @@ r2-cli auth login --json
|
|
|
73
74
|
|
|
74
75
|
**为什么必须先展示链接**:自动打开浏览器在某些环境下可能失败(远程服务器、SSH、无头终端)。链接是用户扫码的唯一保障,必须优先展示。
|
|
75
76
|
|
|
76
|
-
> 旧版两步式流程(先 `auth login qr` 再 `auth login poll`)已废弃。如需手动轮询,可使用 `auth login poll --token <>`。
|
|
77
|
-
|
|
78
77
|
---
|
|
79
78
|
|
|
80
|
-
##
|
|
79
|
+
## 闲鱼店铺授权(auth xianyu)
|
|
81
80
|
|
|
82
81
|
流程与登录类似,同样一步完成:
|
|
83
82
|
|
|
@@ -85,7 +84,7 @@ r2-cli auth login --json
|
|
|
85
84
|
r2-cli auth xianyu --json
|
|
86
85
|
```
|
|
87
86
|
|
|
88
|
-
|
|
87
|
+
**第 1 段:授权二维码信息(立即输出)**
|
|
89
88
|
|
|
90
89
|
```json
|
|
91
90
|
{
|
|
@@ -100,28 +99,15 @@ r2-cli auth xianyu --json
|
|
|
100
99
|
|------|------|
|
|
101
100
|
| `state` | 授权状态 token(轮询用) |
|
|
102
101
|
| `expireTimeMs` | 过期时间(毫秒),默认 5 分钟 |
|
|
103
|
-
| `pollIntervalMs` | 轮询间隔(毫秒) |
|
|
104
102
|
| `qrUrl` | 本地浏览器授权页面链接 |
|
|
105
103
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
成功:
|
|
104
|
+
**第 2 段:授权结果(用户扫码确认后输出)**
|
|
109
105
|
|
|
110
106
|
```json
|
|
111
107
|
{ "success": true, "shopId": "...", "shopName": "..." }
|
|
112
108
|
```
|
|
113
109
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
```json
|
|
117
|
-
{ "success": false, "error": "授权链接已过期" }
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
Agent 操作步骤与登录相同:
|
|
121
|
-
1. 获取第 1 段 JSON
|
|
122
|
-
2. **先展示 `qrUrl` 链接给用户**(单独一行,醒目格式)
|
|
123
|
-
3. 告知用户浏览器会尝试自动打开,如未打开请手动点击链接
|
|
124
|
-
4. 等待第 2 段 JSON
|
|
110
|
+
Agent 操作步骤与登录相同:获取第 1 段 JSON → **先展示 `qrUrl`** → 等待第 2 段 JSON。
|
|
125
111
|
|
|
126
112
|
---
|
|
127
113
|
|
|
@@ -129,20 +115,20 @@ Agent 操作步骤与登录相同:
|
|
|
129
115
|
|
|
130
116
|
| 命令 | 说明 |
|
|
131
117
|
|------|------|
|
|
132
|
-
| `r2-cli auth login` |
|
|
133
|
-
| `r2-cli auth
|
|
118
|
+
| `r2-cli auth login` | 扫码登录(人类使用,自动打开浏览器) |
|
|
119
|
+
| `r2-cli auth xianyu` | 闲鱼店铺授权(人类使用,自动打开浏览器) |
|
|
134
120
|
| `r2-cli auth login poll --token <>` | 手动轮询登录状态(备选,不推荐) |
|
|
135
|
-
| `r2-cli auth xianyu` | 闲鱼店铺授权(自动打开浏览器,人类使用) |
|
|
136
|
-
| `r2-cli auth xianyu --json` | 闲鱼店铺授权(输出 JSON + 自动打开浏览器,Agent 推荐) |
|
|
137
121
|
| `r2-cli auth xianyu poll --state <>` | 手动轮询授权状态(备选,不推荐) |
|
|
138
122
|
| `r2-cli auth status` | 查看登录状态 |
|
|
139
123
|
| `r2-cli auth logout` | 退出登录 |
|
|
140
124
|
|
|
141
125
|
---
|
|
142
126
|
|
|
143
|
-
##
|
|
127
|
+
## 错误处理
|
|
144
128
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
-
|
|
148
|
-
|
|
129
|
+
| 错误信息 | 原因 | 解决方法 |
|
|
130
|
+
|----------|------|----------|
|
|
131
|
+
| `请先运行 r2-cli auth login 登录` | 未登录或 Token 过期 | 执行 `r2-cli auth login --json` |
|
|
132
|
+
| `二维码已过期` | 扫码超时(5 分钟) | 重新执行命令 |
|
|
133
|
+
| `授权链接已过期` | 授权扫码超时(5 分钟) | 重新执行命令 |
|
|
134
|
+
| `网络连接失败` | API 服务不可达 | 检查网络连接,确认 SERVER_BASEURL 配置 |
|
package/skills/r2-goods/SKILL.md
CHANGED
|
@@ -1,42 +1,70 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: r2-goods
|
|
3
|
-
|
|
3
|
+
version: 1.0.0
|
|
4
|
+
description: "R2-CLI 商品管理专家。用于商品上架/下架/改价/挂售、查看店铺/仓库/选品商品/上架列表。Agent 获取数据后展示给用户选择,完成 4 步上架流程。触发词:上架、下架、改价、挂售、商品列表、goods、up、down、price、hang-up、shops、stocks、listing、list。"
|
|
5
|
+
metadata:
|
|
6
|
+
requires:
|
|
7
|
+
bins: ["r2-cli"]
|
|
8
|
+
cliHelp: "r2-cli goods --help"
|
|
9
|
+
related:
|
|
10
|
+
- "r2-shared"
|
|
11
|
+
- "r2-auth"
|
|
4
12
|
---
|
|
5
13
|
|
|
6
|
-
# R2-Goods
|
|
14
|
+
# R2-Goods (v1)
|
|
7
15
|
|
|
8
|
-
|
|
16
|
+
> **Tip**: Agent 获取数据后展示给用户选择,不要让用户自己提供 ID。这是核心原则。
|
|
17
|
+
> **Tip**: `goods up` 自动轮询上架结果(每 2 秒,最多 10 秒),无需手动查询。
|
|
18
|
+
> **Tip**: `hang-up` 挂售流程:**先上传图片 → Agent 尝试识别图片自动填充信息(不能识别则询问用户)→ 匹配类目/属性 → 提交**。支持多模态的 Agent(Claude Code/Gemini)可自动识别,不支持的 Agent 走询问路径。
|
|
9
19
|
|
|
10
|
-
|
|
20
|
+
商品管理专家,指导 AI Agent 完成商品上架、下架、改价、挂售全流程。
|
|
11
21
|
|
|
12
|
-
|
|
22
|
+
## CRITICAL
|
|
23
|
+
|
|
24
|
+
安装、统一错误格式见 **r2-shared** skill。认证登录见 **r2-auth** skill。
|
|
25
|
+
|
|
26
|
+
## 上架路由决策
|
|
27
|
+
|
|
28
|
+
用户说"上架商品"时,按以下规则选择上架方式:
|
|
29
|
+
|
|
30
|
+
| 条件 | 上架方式 | 流程 |
|
|
31
|
+
|------|----------|------|
|
|
32
|
+
| 商品**在选品库**中(用户没提供图片、类目等详细信息) | `goods up`(普通上架) | 店铺 → 仓库 → 选品商品 → 输入价格 → 提交 |
|
|
33
|
+
| 用户**提供了图片**,或商品**不在选品库** | `goods hang-up`(挂售上架) | 上传图片 → AI 读图识别 → 类目/属性 → 提交 |
|
|
34
|
+
|
|
35
|
+
**判断方法**:
|
|
36
|
+
1. 用户只说"上架"没给细节 → 先查选品库(`goods list`),有商品就走 `goods up`,**选品库为空则自动走 `goods hang-up`,不需要再问用户**
|
|
37
|
+
2. 用户提供了图片文件 → 直接走 `goods hang-up`,Agent 会用 Read 工具查看图片自动识别商品信息
|
|
38
|
+
3. 不确定时 → 问用户:"商品在选品库里吗?还是有图片需要挂售上架?"
|
|
13
39
|
|
|
14
40
|
## 命令概览
|
|
15
41
|
|
|
16
|
-
| 命令 | 说明 |
|
|
17
|
-
|
|
18
|
-
| `r2-cli goods shops [--json]` |
|
|
19
|
-
| `r2-cli goods stocks [--json]` |
|
|
20
|
-
| `r2-cli goods list [--stock-id <id>] [--
|
|
21
|
-
| `r2-cli goods listing [--json]` |
|
|
22
|
-
| `r2-cli goods up` |
|
|
23
|
-
| `r2-cli goods
|
|
24
|
-
| `r2-cli goods
|
|
25
|
-
| `r2-cli goods
|
|
42
|
+
| 分类 | 命令 | 说明 |
|
|
43
|
+
|------|------|------|
|
|
44
|
+
| 查询 | `r2-cli goods shops [--json]` | 查看已授权店铺 |
|
|
45
|
+
| | `r2-cli goods stocks [--json]` | 查看仓库 |
|
|
46
|
+
| | `r2-cli goods list [--stock-id <id>] [--json]` | 查看选品商品 |
|
|
47
|
+
| | `r2-cli goods listing [--json]` | 查询上架列表 |
|
|
48
|
+
| 上架 | `r2-cli goods up --stock-goods-id <> --shop-id <> --price <> --json` | 普通上架(选品商品) |
|
|
49
|
+
| | `r2-cli goods down --id <id> [--json]` | 下架商品 |
|
|
50
|
+
| | `r2-cli goods price --id <id> --price <amount> [--json]` | 修改价格 |
|
|
51
|
+
| 挂售 | `r2-cli goods hang-up categories [--json]` | 获取闲鱼类目 |
|
|
52
|
+
| | `r2-cli goods hang-up props --channel-cat-id <id> [--json]` | 获取属性列表 |
|
|
53
|
+
| | `r2-cli goods hang-up brands --channel-cat-id <> --prop-id <> --key <> [--json]` | 品牌搜索 |
|
|
54
|
+
| | `r2-cli goods hang-up upload-images --shop-id <> --files <> --json` | 上传图片 |
|
|
55
|
+
| | `r2-cli goods hang-up submit --shop-id <> --title <> ... --json` | 提交挂售上架 |
|
|
26
56
|
|
|
27
57
|
---
|
|
28
58
|
|
|
29
|
-
##
|
|
30
|
-
|
|
31
|
-
**每一步 Agent 获取数据后,必须展示给用户让用户做选择。不要让用户自己提供 ID。**
|
|
59
|
+
## 一、查询命令
|
|
32
60
|
|
|
33
|
-
###
|
|
61
|
+
### 店铺(shops)
|
|
34
62
|
|
|
35
63
|
```bash
|
|
36
64
|
r2-cli goods shops --json
|
|
37
65
|
```
|
|
38
66
|
|
|
39
|
-
|
|
67
|
+
返回字段:
|
|
40
68
|
|
|
41
69
|
| 字段 | 说明 |
|
|
42
70
|
|------|------|
|
|
@@ -44,35 +72,30 @@ r2-cli goods shops --json
|
|
|
44
72
|
| `shopName` | 店铺名称 |
|
|
45
73
|
| `platform` | 平台(xianyu / douyin 等) |
|
|
46
74
|
|
|
47
|
-
|
|
75
|
+
> `--json` 输出会自动过滤敏感字段(`accessToken`、`refreshExpireIn`),Agent 可直接展示。
|
|
48
76
|
|
|
49
|
-
###
|
|
77
|
+
### 仓库(stocks)
|
|
50
78
|
|
|
51
79
|
```bash
|
|
52
80
|
r2-cli goods stocks --json
|
|
53
81
|
```
|
|
54
82
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
| 字段 | 说明 |
|
|
58
|
-
|------|------|
|
|
59
|
-
| `stockId` | 仓库 ID(用于第 3 步过滤商品) |
|
|
60
|
-
| `stockName` | 仓库名称 |
|
|
83
|
+
返回字段:`stockId`(仓库 ID)、`stockName`(仓库名称)
|
|
61
84
|
|
|
62
|
-
###
|
|
85
|
+
### 选品商品(list)
|
|
63
86
|
|
|
64
87
|
```bash
|
|
65
|
-
#
|
|
88
|
+
# 按仓库过滤(推荐)
|
|
66
89
|
r2-cli goods list --stock-id <stockId> --json
|
|
67
90
|
|
|
68
|
-
# 按商品 ID
|
|
91
|
+
# 按商品 ID 精确查询
|
|
69
92
|
r2-cli goods list --stock-goods-id <id> --json
|
|
70
93
|
|
|
71
|
-
#
|
|
94
|
+
# 翻页
|
|
72
95
|
r2-cli goods list --stock-id <stockId> --page 2 --size 20 --json
|
|
73
96
|
```
|
|
74
97
|
|
|
75
|
-
|
|
98
|
+
返回字段:
|
|
76
99
|
|
|
77
100
|
| 字段 | 说明 |
|
|
78
101
|
|------|------|
|
|
@@ -83,124 +106,312 @@ r2-cli goods list --stock-id <stockId> --page 2 --size 20 --json
|
|
|
83
106
|
| `salePrice` | 建议售价 |
|
|
84
107
|
| `cate1Name` / `cate2Name` / `cate3Name` | 分类 |
|
|
85
108
|
|
|
86
|
-
###
|
|
109
|
+
### 上架列表(listing)
|
|
87
110
|
|
|
88
111
|
```bash
|
|
89
|
-
r2-cli goods
|
|
112
|
+
r2-cli goods listing --json
|
|
113
|
+
r2-cli goods listing --status up --json # 只看已上架
|
|
114
|
+
r2-cli goods listing --shop-id <id> --json # 按店铺过滤
|
|
115
|
+
r2-cli goods listing --stock-goods-id <id> --json # 按商品过滤
|
|
116
|
+
r2-cli goods listing --id <id> --json # 精确查询
|
|
90
117
|
```
|
|
91
118
|
|
|
92
|
-
|
|
119
|
+
过滤参数:`--id`、`--stock-goods-id`、`--shop-id`、`--stock-id`、`--status`(init/up/down/fail)、`--platform`
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 二、上架/下架
|
|
124
|
+
|
|
125
|
+
### Agent 上架 4 步流程
|
|
126
|
+
|
|
127
|
+
**每一步 Agent 获取数据后,必须展示给用户让用户做选择。**
|
|
128
|
+
|
|
129
|
+
1. `r2-cli goods shops --json` → 展示店铺 → 用户选择 `shopId`
|
|
130
|
+
2. `r2-cli goods stocks --json` → 展示仓库 → 用户选择 `stockId`
|
|
131
|
+
3. `r2-cli goods list --stock-id <stockId> --json` → 展示商品 → 用户选择 `stockGoodsId`
|
|
132
|
+
4. `r2-cli goods up --stock-goods-id <id> --shop-id <id> --price <amount> --json` → 提交上架
|
|
133
|
+
|
|
134
|
+
命令自动轮询上架进度(每 2 秒,最多 10 秒),返回:
|
|
93
135
|
|
|
94
136
|
```json
|
|
95
137
|
{
|
|
96
138
|
"success": true,
|
|
97
139
|
"data": {
|
|
98
140
|
"submit": { "...提交结果..." },
|
|
99
|
-
"listing": {
|
|
100
|
-
"id": "上架记录ID",
|
|
101
|
-
"status": "up",
|
|
102
|
-
"goodsName": "...",
|
|
103
|
-
"price": 299,
|
|
104
|
-
"...": "..."
|
|
105
|
-
}
|
|
141
|
+
"listing": { "id": "上架记录ID", "status": "up", "goodsName": "...", "price": 299 }
|
|
106
142
|
}
|
|
107
143
|
}
|
|
108
144
|
```
|
|
109
145
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
| status | 含义 |
|
|
113
|
-
|--------|------|
|
|
114
|
-
| `init` | 待上架(处理中,正常不应出现在最终结果) |
|
|
115
|
-
| `up` | 已上架成功 |
|
|
116
|
-
| `down` | 已下架 |
|
|
117
|
-
| `fail` | 上架失败,查看 `errorMsg` 了解原因 |
|
|
146
|
+
状态值:`init`(处理中)、`up`(已上架)、`down`(已下架)、`fail`(失败,查看 `errorMsg`)
|
|
118
147
|
|
|
119
|
-
###
|
|
148
|
+
### 上架参数
|
|
120
149
|
|
|
121
150
|
| 参数 | 必填 | 说明 |
|
|
122
151
|
|------|------|------|
|
|
123
|
-
| `--stock-goods-id <id>` | 是 | 库存商品 ID
|
|
124
|
-
| `--shop-id <id>` | 是 | 第三方店铺 ID
|
|
125
|
-
| `--price <amount>` | 是 |
|
|
126
|
-
|
|
|
127
|
-
| `--json` | 否 | JSON 输出(Agent 推荐使用) |
|
|
152
|
+
| `--stock-goods-id <id>` | 是 | 库存商品 ID(来自 `stockGoodsId`) |
|
|
153
|
+
| `--shop-id <id>` | 是 | 第三方店铺 ID(来自 `shopId`,**不是 `id`**) |
|
|
154
|
+
| `--price <amount>` | 是 | 上架价格 |
|
|
155
|
+
| `--json` | 否 | JSON 输出(Agent 推荐) |
|
|
128
156
|
|
|
129
|
-
|
|
157
|
+
> 缺少必填参数时返回 `{ "success": false, "error": "Agent 模式需要 --stock-goods-id, --shop-id, --price" }`,不会进入交互模式。
|
|
130
158
|
|
|
131
|
-
|
|
159
|
+
### 下架(down)
|
|
132
160
|
|
|
133
|
-
**Agent
|
|
134
|
-
|
|
135
|
-
支持两种方式指定商品(二选一):
|
|
161
|
+
**Agent 必须先向用户确认后再执行下架。**
|
|
136
162
|
|
|
137
163
|
```bash
|
|
138
|
-
# 方式 1
|
|
164
|
+
# 方式 1:上架记录 ID
|
|
139
165
|
r2-cli goods down --id <goodsListingId> --json
|
|
140
166
|
|
|
141
|
-
# 方式 2
|
|
167
|
+
# 方式 2:库存商品 ID + 店铺 ID
|
|
142
168
|
r2-cli goods down --stock-goods-id <id> --shop-id <id> --json
|
|
143
169
|
```
|
|
144
170
|
|
|
145
|
-
|
|
171
|
+
### 改价(price)
|
|
172
|
+
|
|
173
|
+
**Agent 必须先询问用户新价格,不能自行决定。**
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
# 方式 1:上架记录 ID
|
|
177
|
+
r2-cli goods price --id <goodsListingId> --price <新价格> --json
|
|
178
|
+
|
|
179
|
+
# 方式 2:库存商品 ID + 店铺 ID
|
|
180
|
+
r2-cli goods price --stock-goods-id <id> --shop-id <id> --price <新价格> --json
|
|
181
|
+
```
|
|
146
182
|
|
|
147
183
|
---
|
|
148
184
|
|
|
149
|
-
##
|
|
185
|
+
## 三、闲鱼挂售(hang-up)
|
|
186
|
+
|
|
187
|
+
挂售模式支持完整商品信息:图片、类目、属性等。与普通上架(`goods up`)是不同流程。
|
|
188
|
+
|
|
189
|
+
**核心理念**:先上传图片,Agent 尝试识别图片内容自动填充商品信息;无法识别时向用户询问。
|
|
190
|
+
|
|
191
|
+
### Agent 挂售流程
|
|
192
|
+
|
|
193
|
+
**核心原则**:
|
|
194
|
+
- 缺少的必填信息(价格、商家编码)**在流程中尽早询问**,不要积攒到最后
|
|
195
|
+
- Agent 自动识别图片、匹配类目/属性、构建参数,**直接提交**,不需要用户确认
|
|
196
|
+
- 提交成功后展示上架结果(商品信息摘要),让用户知道上架了什么
|
|
197
|
+
- `item-attrs` 中 `propId` 和 `valueId` 是不同的值,构建时从 props 返回数据中取准确值
|
|
198
|
+
|
|
199
|
+
**图片识别降级策略**:
|
|
150
200
|
|
|
151
|
-
|
|
201
|
+
| Agent 能力 | 处理方式 |
|
|
202
|
+
|------------|----------|
|
|
203
|
+
| 能查看图片(多模态) | 用 Read 工具读图 → 自动识别品牌/成色/类目/描述 |
|
|
204
|
+
| 不能查看图片 | 跳过识别 → 向用户询问品牌、类目、成色、描述等信息 |
|
|
205
|
+
|
|
206
|
+
> 不同 Agent 能力不同(Claude Code / Gemini 支持读图,部分 Agent 不支持)。Agent 应自行判断是否能识别图片,不能则直接走询问路径。两条路径最终都走相同的 submit 提交。
|
|
207
|
+
|
|
208
|
+
#### 第 1 步:上传图片 + 识别商品信息(并行)
|
|
209
|
+
|
|
210
|
+
**上传图片**:
|
|
152
211
|
|
|
153
212
|
```bash
|
|
154
|
-
|
|
155
|
-
|
|
213
|
+
r2-cli goods hang-up upload-images --shop-id <shopId> --files /path/img1.jpg,/path/img2.jpg --json
|
|
214
|
+
```
|
|
156
215
|
|
|
157
|
-
|
|
158
|
-
|
|
216
|
+
返回:
|
|
217
|
+
|
|
218
|
+
```json
|
|
219
|
+
{
|
|
220
|
+
"success": true,
|
|
221
|
+
"images": [
|
|
222
|
+
{ "value": "1086608743767730915" },
|
|
223
|
+
{ "value": "1086608743823622409" }
|
|
224
|
+
]
|
|
225
|
+
}
|
|
159
226
|
```
|
|
160
227
|
|
|
161
|
-
|
|
228
|
+
> 图片路径是用户本地文件路径。`--image-ids` 保持字符串,不要转数字(19 位 ID 会精度丢失)。
|
|
162
229
|
|
|
163
|
-
|
|
230
|
+
**同时尝试识别图片**:如果 Agent 支持多模态(如 Claude Code、Gemini),用 Read 工具查看用户图片文件,识别以下信息。不支持则跳过,改为向用户询问。
|
|
231
|
+
|
|
232
|
+
> **多图不一致处理**:如果多张图片显示不同商品(如不同款式、不同品牌),Agent 应识别后告知用户,只保留同一商品的图片。不要把不同商品混在一起提交。
|
|
233
|
+
|
|
234
|
+
| 识别内容 | 提取信息 | 用途 |
|
|
235
|
+
|----------|----------|------|
|
|
236
|
+
| 商品类型 | 鞋/包/衣服/配饰/数码等 | 匹配闲鱼类目 |
|
|
237
|
+
| 品牌 Logo/标签 | Nike/Gucci/LV 等 | `--brand-name` + brands 搜索 |
|
|
238
|
+
| 成色状态 | 全新/轻微使用/明显磨损 | `--stuff-status` |
|
|
239
|
+
| 颜色 | 白色/黑色/彩色等 | item-attrs 属性 |
|
|
240
|
+
| 款式/材质 | 低帮鞋/皮质/帆布等 | item-attrs 属性 |
|
|
241
|
+
| 尺码标签 | 42/EU40/M 等 | `--size` |
|
|
242
|
+
| 综合信息 | — | 生成 `--title` 和 `--desc` |
|
|
243
|
+
|
|
244
|
+
**识别后自动生成**:
|
|
245
|
+
- `--title`:根据品牌+品类+关键特征生成简洁标题(如 "Nike Air Force 1 白色 42码 95新")
|
|
246
|
+
- `--desc`:综合图片信息生成商品描述
|
|
247
|
+
|
|
248
|
+
**成色判断映射**:
|
|
249
|
+
|
|
250
|
+
| 图片中商品状态 | `--stuff-status` 值 |
|
|
251
|
+
|----------------|---------------------|
|
|
252
|
+
| 带吊牌/未拆封 | `100`(全新) |
|
|
253
|
+
| 几乎无使用痕迹 | `-1`(准新)或 `99`(99新) |
|
|
254
|
+
| 轻微使用痕迹 | `95`(95新) |
|
|
255
|
+
| 明显使用痕迹 | `90`(9新) |
|
|
164
256
|
|
|
165
|
-
|
|
257
|
+
**如果用户没提供价格和商家编码,此时询问**(不要留到最后)。
|
|
258
|
+
|
|
259
|
+
#### 第 2 步:匹配类目 + 属性(串行)
|
|
260
|
+
|
|
261
|
+
**获取类目并自动匹配**:
|
|
166
262
|
|
|
167
263
|
```bash
|
|
168
|
-
|
|
169
|
-
|
|
264
|
+
r2-cli goods hang-up categories --json
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Agent 根据图片识别结果自动匹配类目。常见匹配:
|
|
268
|
+
|
|
269
|
+
| 识别结果 | 推荐匹配 |
|
|
270
|
+
|----------|----------|
|
|
271
|
+
| 运动鞋/板鞋 | 鞋靴 → 男鞋/女鞋 → 低帮鞋 |
|
|
272
|
+
| 手提包/斜挎包 | 箱包 → 女士包/男士包 |
|
|
273
|
+
| T恤/卫衣/外套 | 服装 → 男装/女装 |
|
|
274
|
+
| 手表 | 腕表/饰品 |
|
|
170
275
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
r2-cli goods
|
|
175
|
-
r2-cli goods listing --id <id> --json # 精确查询
|
|
276
|
+
**获取属性并自动匹配**:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
r2-cli goods hang-up props --channel-cat-id <channelCatId> --json
|
|
176
280
|
```
|
|
177
281
|
|
|
178
|
-
|
|
282
|
+
> props 响应可能很大(几十 KB),Agent 应直接搜索关键属性名,用 Grep 提取 propId 和匹配的 valueId/valueName。
|
|
179
283
|
|
|
180
|
-
|
|
181
|
-
|------|------|
|
|
182
|
-
| `--id <id>` | 上架记录 ID |
|
|
183
|
-
| `--stock-goods-id <id>` | 库存商品 ID |
|
|
184
|
-
| `--shop-id <id>` | 店铺 ID |
|
|
185
|
-
| `--stock-id <id>` | 仓库 ID |
|
|
186
|
-
| `-s, --status <status>` | 状态过滤:`init` / `up` / `down` / `fail` |
|
|
187
|
-
| `-p, --platform <platform>` | 平台,默认 xianyu |
|
|
284
|
+
**属性匹配优先级**(按重要性排序):
|
|
188
285
|
|
|
189
|
-
|
|
286
|
+
| 优先级 | 属性 | 说明 |
|
|
287
|
+
|--------|------|------|
|
|
288
|
+
| 1 | 品牌 | 用 brands 搜索确认,**必须精确匹配,忽略近似名称** |
|
|
289
|
+
| 2 | 款式 | 运动鞋/休闲鞋/皮鞋等,从识别结果匹配 |
|
|
290
|
+
| 3 | 鞋码/尺码 | 42/43/M/L 等,从用户输入或图片识别 |
|
|
291
|
+
| 4 | 成色 | 全新/几乎全新/轻微穿着痕迹/明显穿着痕迹 |
|
|
292
|
+
| 5 | 其他 | 颜色、材质等,能匹配则填,不能则跳过 |
|
|
190
293
|
|
|
191
|
-
|
|
294
|
+
**品牌精确匹配规则**:
|
|
295
|
+
- brands 搜索会返回近似名称(如搜 Nike 会返回 BACHNIKE、NIKE 7 等),Agent 必须选择**完全匹配**的官方品牌名称
|
|
296
|
+
- 例如搜 "Nike" → 只选 `Nike/耐克`,忽略 `BACHNIKE`、`NIKE 7/妮刻柒号` 等
|
|
192
297
|
|
|
193
|
-
|
|
298
|
+
```bash
|
|
299
|
+
r2-cli goods hang-up brands --channel-cat-id <id> --prop-id <品牌propId> --key "Nike" --json
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
最终构建 `--item-attrs`(**注意 propId 和 valueId 是不同字段**):
|
|
194
303
|
|
|
195
304
|
```json
|
|
196
|
-
|
|
305
|
+
[
|
|
306
|
+
{ "propId": "1d6d7611...", "valueId": "af8266ea...", "valueName": "运动鞋" },
|
|
307
|
+
{ "propId": "30dc3038...", "valueId": "d64b3e52...", "valueName": "42" }
|
|
308
|
+
]
|
|
197
309
|
```
|
|
198
310
|
|
|
199
|
-
|
|
311
|
+
#### 第 3 步:提交挂售
|
|
312
|
+
|
|
313
|
+
**所有参数就绪后直接提交,不需要用户确认**:
|
|
314
|
+
|
|
315
|
+
```bash
|
|
316
|
+
r2-cli goods hang-up submit \
|
|
317
|
+
--shop-id <shopId> \
|
|
318
|
+
--title "商品标题" \
|
|
319
|
+
--price 599 \
|
|
320
|
+
--category-id <catId> \
|
|
321
|
+
--channel-cat-id <channelCatId> \
|
|
322
|
+
--image-ids "id1,id2" \
|
|
323
|
+
--stuff-status 95 \
|
|
324
|
+
--desc "商品描述" \
|
|
325
|
+
--out-item-no "商家编码" \
|
|
326
|
+
--brand-name "Nike" \
|
|
327
|
+
--size "42" \
|
|
328
|
+
--item-attrs '[{"propId":"xx","valueId":"yy","valueName":"Nike"}]' \
|
|
329
|
+
--json
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
成功返回:
|
|
333
|
+
|
|
334
|
+
```json
|
|
335
|
+
{ "success": true, "data": "上架成功" }
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
**提交后展示上架结果摘要**(让用户知道上架了什么):
|
|
339
|
+
|
|
340
|
+
```
|
|
341
|
+
上架成功!
|
|
342
|
+
- 标题:Nike 低帮运动鞋 白色 42码
|
|
343
|
+
- 价格:¥99999
|
|
344
|
+
- 品牌:Nike/耐克
|
|
345
|
+
- 类目:男士鞋靴 → 低帮鞋
|
|
346
|
+
- 成色:全新
|
|
347
|
+
- 店铺:xxx
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### 必填字段处理
|
|
351
|
+
|
|
352
|
+
缺少时**在流程中尽早询问用户**,不要等所有信息都收集完再问:
|
|
353
|
+
|
|
354
|
+
| 缺失字段 | 何时询问 | 询问方式 |
|
|
355
|
+
|----------|----------|----------|
|
|
356
|
+
| `--price`(售价) | 上传图片时 | "这个商品上架价格是多少?" |
|
|
357
|
+
| `--out-item-no`(商家编码) | 上传图片时 | "商家编码是什么?(同店铺唯一标识)" |
|
|
358
|
+
| `--shop-id`(店铺) | 流程开始时 | 展示店铺列表让用户选择 |
|
|
359
|
+
| `--title`(标题) | 图片识别无法生成时 | "商品标题用什么?" |
|
|
360
|
+
| `--desc`(描述) | 图片识别无法生成时 | "商品描述?" |
|
|
361
|
+
|
|
362
|
+
### 必填参数
|
|
363
|
+
|
|
364
|
+
| 参数 | 说明 |
|
|
365
|
+
|------|------|
|
|
366
|
+
| `--shop-id <id>` | 店铺 ID(即闲鱼用户名 account) |
|
|
367
|
+
| `--title <title>` | 商品标题 |
|
|
368
|
+
| `--price <amount>` | 售价 |
|
|
369
|
+
| `--category-id <id>` | 大分类 ID(从 categories 获取) |
|
|
370
|
+
| `--channel-cat-id <id>` | 小分类 ID(从 categories 获取) |
|
|
371
|
+
| `--image-ids <ids>` | 图片 ID 列表,逗号分隔(保持字符串) |
|
|
372
|
+
| `--stuff-status <n>` | 成色等级 |
|
|
373
|
+
| `--desc <desc>` | 商品描述 |
|
|
374
|
+
| `--out-item-no <no>` | 商家编码(同店铺唯一,用户自定义) |
|
|
375
|
+
|
|
376
|
+
### 成色等级
|
|
377
|
+
|
|
378
|
+
| 值 | 含义 |
|
|
379
|
+
|----|------|
|
|
380
|
+
| `100` | 全新 |
|
|
381
|
+
| `-1` | 准新 |
|
|
382
|
+
| `99` | 99新 |
|
|
383
|
+
| `95` | 95新 |
|
|
384
|
+
| `90` | 9新 |
|
|
385
|
+
|
|
386
|
+
### 可选参数
|
|
387
|
+
|
|
388
|
+
| 参数 | 默认值 | 说明 |
|
|
389
|
+
|------|--------|------|
|
|
390
|
+
| `--brand-name <name>` | — | 品牌名称 |
|
|
391
|
+
| `--size <size>` | — | 尺码 |
|
|
392
|
+
| `--goods-no <no>` | — | 货号 |
|
|
393
|
+
| `--original-price <amount>` | — | 原价 |
|
|
394
|
+
| `--trade-type <n>` | `0` | 交易方式:0 仅在线 / 1 仅线下 / 2 线上或线下 |
|
|
395
|
+
| `--transport-fee <amount>` | `0` | 运费(0 = 包邮) |
|
|
396
|
+
| `--division-id <id>` | `330100` | 行政区划 ID(市级,默认杭州) |
|
|
397
|
+
| `--item-attrs <json>` | — | 商品属性列表 JSON(来自 props/brands) |
|
|
398
|
+
| `--yhb` | `false` | 是否开启验货宝 |
|
|
399
|
+
|
|
400
|
+
> 内部默认值:`itemBizType=2`(普通商品)、`spBizType="16"`(奢品)
|
|
401
|
+
|
|
402
|
+
---
|
|
403
|
+
|
|
404
|
+
## 错误处理
|
|
405
|
+
|
|
406
|
+
所有 `--json` 命令统一错误格式:`{ "success": false, "error": "错误信息" }`
|
|
200
407
|
|
|
201
408
|
| 错误信息 | 原因 | 解决方法 |
|
|
202
409
|
|----------|------|----------|
|
|
203
410
|
| `请先运行 r2-cli auth login 登录` | 未登录或 Token 过期 | 执行 `r2-cli auth login --json` |
|
|
204
|
-
|
|
|
205
|
-
|
|
|
206
|
-
|
|
|
411
|
+
| `Agent 模式需要 --stock-goods-id, --shop-id, --price` | `goods up --json` 缺少必填参数 | 补齐三个参数 |
|
|
412
|
+
| `请指定下架条件:--id 或 --stock-goods-id + --shop-id` | 下架缺少定位参数 | 补充参数 |
|
|
413
|
+
| `--price <amount> 为必填参数` | 改价未提供价格 | 询问用户新价格 |
|
|
414
|
+
| `请提供至少一张图片` | upload-images 无图片 | 提供本地图片路径 |
|
|
415
|
+
| `请填写有效的商品叶子类目` | category-id 或 channel-cat-id 错误 | 重新查询 categories |
|
|
416
|
+
| `找不到传入的某些图片` | 图片 ID 无效或过期 | 重新上传图片 |
|
|
417
|
+
| `轮询超时` | 上架结果查询超时 | 稍后用 `goods listing` 查看 |
|