@pippit-dev/cli 1.0.13 → 1.0.14

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/checksums.txt CHANGED
@@ -1,6 +1,6 @@
1
- 10344df2fea39ac74dc362fce1dbf60e0dd8a73afa45402bdc3f3f3fee2aab03 pippit-tool-cli-1.0.13-darwin-amd64.tar.gz
2
- 8bf05a6e9acea5eb4057102eda3c58d0ec17843bd800a8b0aa820688477f903b pippit-tool-cli-1.0.13-darwin-arm64.tar.gz
3
- 7f444b3b6089d9c1d6006c1888dad75717f259a3af3b511b2fc26aaff21f1ff4 pippit-tool-cli-1.0.13-linux-amd64.tar.gz
4
- f25ade56bd1b3b99b9fe4858fe1fc766878a79ef650961e7042f5de0d2bdda98 pippit-tool-cli-1.0.13-linux-arm64.tar.gz
5
- 665bfaad8505fea2669dc8cbd8a4577f0179f8fe6c8a20c84b3882343b336d2d pippit-tool-cli-1.0.13-windows-amd64.zip
6
- b4833e6dce0f7bc2981648bfe7fa029438f6ab7e58636c50134b2100302379cd pippit-tool-cli-1.0.13-windows-arm64.zip
1
+ 7e8b88e21ebfd05357f0183c408bfbacaf6c583398e9ab8f3edd24063be911b1 pippit-tool-cli-1.0.14-darwin-amd64.tar.gz
2
+ e514b59bb83b59130deb9cec6cb0f114fd11fe47921d7a65e2f697ad5d528e07 pippit-tool-cli-1.0.14-darwin-arm64.tar.gz
3
+ 436efcab90026d8e0d3e593943d8cbd473a5219017685c1099f09992a7034d4b pippit-tool-cli-1.0.14-linux-amd64.tar.gz
4
+ d4a7916d18a16b7b179db6251931796440e236a6d8d841e385bf02e4de9bca29 pippit-tool-cli-1.0.14-linux-arm64.tar.gz
5
+ 9688067ffd270653e81570ff2cd395e51d92f82248573c3682a3d7c3fd6cbb89 pippit-tool-cli-1.0.14-windows-amd64.zip
6
+ 98d211cd42c0d1a7b526f9a0cca7456d0e9acbf56a0f4da4c7dc1b2d25d457ff pippit-tool-cli-1.0.14-windows-arm64.zip
@@ -33,6 +33,7 @@ func NewCommand(stdout, stderr io.Writer, runner *common.Runner) *cobra.Command
33
33
  "image": strings.Join(opts.ImagePaths, ","),
34
34
  "model": strings.TrimSpace(opts.Model),
35
35
  "ratio": strings.TrimSpace(opts.Ratio),
36
+ "resolution": strings.ToUpper(strings.TrimSpace(opts.Resolution)),
36
37
  "generate_image_count": optionalIntString(opts.GenerateImageCount),
37
38
  })
38
39
  return err
@@ -47,6 +48,7 @@ func NewCommand(stdout, stderr io.Writer, runner *common.Runner) *cobra.Command
47
48
  flags.StringArrayVar(&opts.ImagePaths, "image", nil, "local reference image path; repeat for multiple images")
48
49
  flags.StringVar(&opts.Model, "model", "", "image model; supported: seedream_5.0_pro, seedream_5.0, seedream_4.3, nova2, seedream_4.5, seedream_4.1, seedream_4")
49
50
  flags.StringVar(&opts.Ratio, "ratio", "", "image ratio; "+internalgen.SupportedRatioUsage())
51
+ flags.StringVar(&opts.Resolution, "resolution", "", "image resolution; only seedream_5.0_pro supports these options: 1K, 2K, 4K")
50
52
  flags.IntVar(&generateImageCount, "generate-image-count", 0, "generated image count")
51
53
  return cmd
52
54
  }
@@ -66,12 +66,15 @@ func TestGenerateImage(t *testing.T) {
66
66
  if !ok {
67
67
  t.Fatalf("general_agent_settings = %#v, want object", body["general_agent_settings"])
68
68
  }
69
- if settings["image_model"] != "seedream_4.5" {
70
- t.Fatalf("image_model = %v, want seedream_4.5", settings["image_model"])
69
+ if settings["image_model"] != "seedream_5.0_pro" {
70
+ t.Fatalf("image_model = %v, want seedream_5.0_pro", settings["image_model"])
71
71
  }
72
72
  if settings["ratio"] != float64(6) {
73
73
  t.Fatalf("ratio = %v, want 6", settings["ratio"])
74
74
  }
75
+ if settings["resolution"] != "4K" {
76
+ t.Fatalf("resolution = %v, want 4K", settings["resolution"])
77
+ }
75
78
  if settings["generate_image_count"] != float64(2) {
76
79
  t.Fatalf("generate_image_count = %v, want 2", settings["generate_image_count"])
77
80
  }
@@ -97,8 +100,9 @@ func TestGenerateImage(t *testing.T) {
97
100
  "generate-image",
98
101
  "--prompt", "生成小猫海报",
99
102
  "--image", image,
100
- "--model", "seedream_4.5",
103
+ "--model", "seedream_5.0_pro",
101
104
  "--ratio", "6",
105
+ "--resolution", "4K",
102
106
  "--generate-image-count", "2",
103
107
  })
104
108
 
@@ -27,12 +27,14 @@ type Options struct {
27
27
  ImagePaths []string
28
28
  Model string
29
29
  Ratio string
30
+ Resolution string
30
31
  GenerateImageCount *int
31
32
  }
32
33
 
33
34
  type generalAgentSettings struct {
34
35
  ImageModel string `json:"image_model"`
35
36
  Ratio *int `json:"ratio,omitempty"`
37
+ Resolution string `json:"resolution,omitempty"`
36
38
  GenerateImageCount *int `json:"generate_image_count,omitempty"`
37
39
  }
38
40
 
@@ -142,6 +144,7 @@ func buildSubmitRunBody(opts *Options, imageAssetIDs []string) map[string]any {
142
144
  "general_agent_settings": generalAgentSettings{
143
145
  ImageModel: strings.TrimSpace(opts.Model),
144
146
  Ratio: ratio,
147
+ Resolution: strings.ToUpper(strings.TrimSpace(opts.Resolution)),
145
148
  GenerateImageCount: opts.GenerateImageCount,
146
149
  },
147
150
  }
@@ -42,6 +42,18 @@ func TestValidateOptionsAllowsServerDecidedRatio(t *testing.T) {
42
42
  }
43
43
  }
44
44
 
45
+ func TestValidateOptionsAllowsServerDecidedResolution(t *testing.T) {
46
+ opts := &Options{
47
+ Prompt: "x",
48
+ Model: "seedream_4.5",
49
+ Resolution: "8K",
50
+ }
51
+
52
+ if err := ValidateOptions(opts); err != nil {
53
+ t.Fatalf("ValidateOptions() error = %v, want nil", err)
54
+ }
55
+ }
56
+
45
57
  func TestValidateOptionsRejectsNegativeGenerateImageCount(t *testing.T) {
46
58
  count := -1
47
59
  opts := &Options{
@@ -116,8 +128,9 @@ func TestBuildSubmitRunBodyWithGeneralAgentSettings(t *testing.T) {
116
128
  count := 2
117
129
  opts := &Options{
118
130
  Prompt: " 生成小猫海报 ",
119
- Model: " seedream_4.5 ",
131
+ Model: " seedream_5.0_pro ",
120
132
  Ratio: "6",
133
+ Resolution: " 4k ",
121
134
  GenerateImageCount: &count,
122
135
  }
123
136
 
@@ -132,12 +145,15 @@ func TestBuildSubmitRunBodyWithGeneralAgentSettings(t *testing.T) {
132
145
  if !ok {
133
146
  t.Fatalf("general_agent_settings = %#v, want object", body["general_agent_settings"])
134
147
  }
135
- if settings.ImageModel != "seedream_4.5" {
136
- t.Fatalf("image_model = %q, want seedream_4.5", settings.ImageModel)
148
+ if settings.ImageModel != "seedream_5.0_pro" {
149
+ t.Fatalf("image_model = %q, want seedream_5.0_pro", settings.ImageModel)
137
150
  }
138
151
  if settings.Ratio == nil || *settings.Ratio != 6 {
139
152
  t.Fatalf("ratio = %#v, want 6", settings.Ratio)
140
153
  }
154
+ if settings.Resolution != "4K" {
155
+ t.Fatalf("resolution = %q, want 4K", settings.Resolution)
156
+ }
141
157
  if settings.GenerateImageCount == nil || *settings.GenerateImageCount != 2 {
142
158
  t.Fatalf("generate_image_count = %#v, want 2", settings.GenerateImageCount)
143
159
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pippit-dev/cli",
3
- "version": "1.0.13",
3
+ "version": "1.0.14",
4
4
  "description": "Pippit CLI",
5
5
  "bin": {
6
6
  "pippit-tool-cli": "scripts/run.js"
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: xyq-skill
3
- description: 通过小云雀的 AI 能力进行综合创作,支持生成和编辑图片/视频,并在用户明确要求视频模型直出、指定视频模型或直接调用 CLI 时使用 pippit-tool-cli generate-video。覆盖文生图、文生视频、图生视频、视频编辑、风格转换、视频续写、视频复刻、TVC、宣传片、音乐 MV、产品广告、分镜和教育短视频等场景。当用户提到小云雀、xyq、上传参考图/视频/mp3或wav音频、查看生成进度时也应触发。短剧生成、续写、改写、人物设定和分集创作应使用 xyq-short-drama-skill,不在本技能中执行。
3
+ description: 通过小云雀的 AI 能力进行综合创作,支持生成和编辑图片/视频,并在用户明确要求图片或视频模型直出、指定图片或视频模型或直接调用 CLI 时使用 pippit-tool-cli generate-image / generate-video。覆盖文生图、文生视频、图生视频、视频编辑、风格转换、视频续写、视频复刻、TVC、宣传片、音乐 MV、产品广告、分镜和教育短视频等场景。当用户提到小云雀、xyq、上传参考图/视频/mp3或wav音频、查看生成进度时也应触发。短剧生成、续写、改写、人物设定和分集创作应使用 xyq-short-drama-skill,不在本技能中执行。
4
4
  user-invocable: true
5
5
  metadata:
6
6
  {
@@ -17,7 +17,7 @@ metadata:
17
17
  }
18
18
  ---
19
19
 
20
- # 小云雀创作与视频模型直出
20
+ # 小云雀创作与图片/视频模型直出
21
21
 
22
22
  通过 小云雀的API 创建会话、发送消息(生图、生视频、编辑视频等)、上传图片/视频/mp3或wav音频文件,并查询会话消息进展。
23
23
 
@@ -28,11 +28,44 @@ metadata:
28
28
  - **编辑**:局部修改、元素替换、镜头调整、风格迁移
29
29
  - **复杂创作**:复刻已有视频风格做 TVC/宣传片、用音乐生成 MV、产品展示片制作
30
30
 
31
- 除“视频模型直出”外,创作和编辑需求通过发送自然语言消息来完成,后端 Agent 会自主编排工作流。复杂任务耗时较长,需耐心轮询。
31
+ 除“图片/视频模型直出”外,创作和编辑需求通过发送自然语言消息来完成,后端 Agent 会自主编排工作流。复杂任务耗时较长,需耐心轮询。
32
32
 
33
33
  ## 执行路由(必须先判断)
34
34
 
35
- ### 路由 A:视频模型直出
35
+ ### 路由 A:图片模型直出
36
+
37
+ 满足任一条件时,必须直接使用 `pippit-tool-cli generate-image`,不要改走 `submit_run.py`:
38
+
39
+ - 用户明确说“图片模型直出”、“直接调图片模型”或明确要求用 CLI 生图。
40
+ - 用户指定了具体图片模型(如 `seedream_5.0_pro`),并希望单次直接生成图片。
41
+ - 上游流程已明确将任务标记为图片 direct-model / 模型直出。
42
+
43
+ 执行原则:
44
+
45
+ 1. 执行前用 `command -v pippit-tool-cli` 确认 CLI 可用;不可用时报告阻塞,不要悄悄降级到会话 API。
46
+ 2. 真实提交会消耗 credits;如果用户本轮尚未明确确认生成,按“用户确认与反问”规则征得明确确认后再运行。
47
+ 3. 保留用户原始 prompt,不要自行扩写、润色、翻译或增加风格词。
48
+ 4. `--model` 必填;用户未提供图片模型时,先询问使用哪个模型。只添加用户已经给出的 `--ratio`、`--resolution`、`--generate-image-count`、`--image` 参数,不补默认值。
49
+ 5. `--resolution` 的使用说明是:仅 `seedream_5.0_pro` 支持 `1K`、`2K`、`4K`。不要在 skill 侧维护额外 allowlist 或自行改写用户值,实际合法性由服务端决定。
50
+ 6. `generate-image` 返回后,保存 `thread_id`、`run_id`,并立即向用户展示 `web_thread_link`。
51
+ 7. 每隔 10 秒调用 `query-result`,直到 `completed=true`。出现 `error_message` 时停止并报告;成功时展示并下载 `images[].output_path`。
52
+
53
+ ```bash
54
+ pippit-tool-cli generate-image \
55
+ --prompt "用户原始描述" \
56
+ --model IMAGE_MODEL
57
+ --ratio RATIO
58
+ --resolution RESOLUTION
59
+ --generate-image-count COUNT
60
+ --image 参考图路径
61
+
62
+ pippit-tool-cli query-result \
63
+ --thread-id THREAD_ID \
64
+ --run-id RUN_ID \
65
+ --download-dir OUTPUT_DIR
66
+ ```
67
+
68
+ ### 路由 B:视频模型直出
36
69
 
37
70
  满足任一条件时,必须直接使用 `pippit-tool-cli generate-video`,不要改走 `submit_run.py`:
38
71
 
@@ -60,13 +93,13 @@ pippit-tool-cli query-result \
60
93
 
61
94
  `--image` 最多重复 9 次,`--video` 和 `--audio` 最多各重复 3 次。
62
95
 
63
- ### 路由 B:小云雀后端 Agent 编排
96
+ ### 路由 C:小云雀后端 Agent 编排
64
97
 
65
98
  需要意图确认、脚本/分镜拆解、MV、TVC、局部编辑、复杂参考素材编排,或者用户未明确要求模型直出时,继续使用本技能内置的 `submit_run.py` / `get_thread.py` 会话工作流。
66
99
 
67
- ### 路由 C:短剧工作流
100
+ ### 路由 D:短剧工作流
68
101
 
69
- 用户要求短剧生成、续写、改写、剧情扩展、人物设定、分集草稿或短剧会话文件处理时,停止本技能流程并转交 `xyq-short-drama-skill`,不要用 `submit_run.py` 或 `generate-video` 假装执行完整短剧流程。
102
+ 用户要求短剧生成、续写、改写、剧情扩展、人物设定、分集草稿或短剧会话文件处理时,停止本技能流程并转交 `xyq-short-drama-skill`,不要用 `submit_run.py`、`generate-image` 或 `generate-video` 假装执行完整短剧流程。
70
103
 
71
104
  ## 用户确认与反问
72
105
 
@@ -87,7 +120,8 @@ pippit-tool-cli query-result \
87
120
  2. **查询会话进展** - 根据 `thread_id` 、 `run_id`、`after_seq` 增量拉取该会话的消息列表,用于轮询创作过程的消息和最终产物结果
88
121
  3. **上传文件** - 支持上传`单张图片`、`单个视频文件`或`单个mp3/wav音频文件`到小云雀资产库,得到文件对应的 `asset_id`(编辑或参考已有图片/视频/音频时需要先上传)
89
122
  4. **下载结果** - 将会话中生成的图片/视频批量下载到本地,支持指定输出目录和文件名前缀。
90
- 5. **视频模型直出** - 使用 `pippit-tool-cli generate-video` 直接调用视频模型,使用 `query-result` 查询并下载结果。
123
+ 5. **图片模型直出** - 使用 `pippit-tool-cli generate-image` 直接调用图片模型,使用 `query-result` 查询并下载图片结果。
124
+ 6. **视频模型直出** - 使用 `pippit-tool-cli generate-video` 直接调用视频模型,使用 `query-result` 查询并下载视频结果。
91
125
 
92
126
 
93
127
  ## 前置要求
@@ -98,7 +132,7 @@ export XYQ_ACCESS_KEY="your-access-key"
98
132
 
99
133
  可选:`XYQ_OPENAPI_BASE` 或 `XYQ_BASE_URL`,默认 `https://xyq.jianying.com`。
100
134
 
101
- 会话 API 路由无需安装额外依赖,仅使用 Python 标准库。视频模型直出路由额外要求 `pippit-tool-cli` 在 `PATH` 中可用。
135
+ 会话 API 路由无需安装额外依赖,仅使用 Python 标准库。图片/视频模型直出路由额外要求 `pippit-tool-cli` 在 `PATH` 中可用。
102
136
 
103
137
  ## 使用方法
104
138
 
@@ -170,7 +204,18 @@ python3 {baseDir}/scripts/download_results.py --urls URL1 URL2 URL3 --output-dir
170
204
  6. 向用户展示:过程中的创作信息,以及下载后的本地文件列表
171
205
  ```
172
206
 
173
- ### 场景 2:用户提供图片/视频/音频要求编辑修改或作为参考(如"参考这个视频做一个新的"、"用这首歌做MV")
207
+ ### 场景 2:用户明确要求图片模型直出
208
+
209
+ ```
210
+ 1. command -v pippit-tool-cli → 确认 CLI 可用
211
+ 2. 检查图片模型:用户未提供时先询问,不要自行选择
212
+ 3. pippit-tool-cli generate-image --prompt "用户原始描述" --model IMAGE_MODEL [仅添加用户已给出的其他参数]
213
+ 4. 拿到 thread_id、run_id 和 web_thread_link,立即展示 web_thread_link
214
+ 5. 每隔 10 秒调用 query-result --thread-id THREAD_ID --run-id RUN_ID --download-dir OUTPUT_DIR
215
+ 6. completed=true 后展示并下载 images[].output_path;出现 error_message 时停止并报告
216
+ ```
217
+
218
+ ### 场景 3:用户提供图片/视频/音频要求编辑修改或作为参考(如"参考这个视频做一个新的"、"用这首歌做MV")
174
219
 
175
220
  ```
176
221
  1. upload_file.py /path/to/video.mp4 → 拿到 asset_id1
@@ -181,7 +226,7 @@ python3 {baseDir}/scripts/download_results.py --urls URL1 URL2 URL3 --output-dir
181
226
 
182
227
  用户给了文件路径 + 编辑指令 = 先上传文件,再把编辑指令和 所有asset_id 一起发送。
183
228
 
184
- ### 场景 3:用户提供参考图/视频/音频要求生成新内容
229
+ ### 场景 4:用户提供参考图/视频/音频要求生成新内容
185
230
 
186
231
  ```
187
232
  1. upload_file.py /path/to/ref1.png → 拿到 asset_id1
@@ -192,7 +237,7 @@ python3 {baseDir}/scripts/download_results.py --urls URL1 URL2 URL3 --output-dir
192
237
  6. 后续同场景 1 的步骤 2-6
193
238
  ```
194
239
 
195
- ### 场景 4:在已有会话中追加新需求
240
+ ### 场景 5:在已有会话中追加新需求
196
241
 
197
242
  ```
198
243
  1. submit_run.py --message "新的描述" --thread-id THREAD_ID → 拿到 thread_id、run_id、web_thread_link
@@ -269,12 +314,12 @@ python3 {baseDir}/scripts/download_results.py --urls URL1 URL2 URL3 --output-dir
269
314
 
270
315
  ## 核心原则:用户侧不做创作,只做传话
271
316
 
272
- 你(用户侧 Agent)的职责是**搬运工**,不是创作者。会话 API 路由由后端 Agent 负责理解需求、拆解分镜、编排工作流、选模型、写 prompt;模型直出路由把用户原始参数传给 CLI。你要做的是:
317
+ 你(用户侧 Agent)的职责是**搬运工**,不是创作者。会话 API 路由由后端 Agent 负责理解需求、拆解分镜、编排工作流、选模型、写 prompt;图片/视频模型直出路由把用户原始参数传给 CLI。你要做的是:
273
318
 
274
- 1. **上传**:如果用户给了本地文件 `upload_file.py` 拿到 asset_id
275
- 2. **提交任务**:先按“执行路由”判断;模型直出调用 `pippit-tool-cli generate-video`,其余任务把用户的原始描述 + asset_id 原封不动发给 `submit_run.py`
319
+ 1. **准备素材**:会话 API 路由用 `upload_file.py` 把本地文件转为 asset_id;图片/视频模型直出路由把本地路径直接交给 CLI 的 `--image` / `--video` / `--audio` 参数
320
+ 2. **提交任务**:先按“执行路由”判断;图片模型直出调用 `pippit-tool-cli generate-image`,视频模型直出调用 `pippit-tool-cli generate-video`,其余任务把用户的原始描述 + asset_id 原封不动发给 `submit_run.py`
276
321
  3. **传话**:根据 `get_thread.py` 返回的消息列表,展示过程中的意图询问、创作信息等
277
- 4. **取件**:`get_thread.py` 轮询结果 → 检查结果 → 下载产物 → 结果展示给用户
322
+ 4. **取件**:会话 API 路由用 `get_thread.py` 轮询,图片/视频模型直出路由用 `query-result` 轮询 → 检查结果 → 下载产物 → 结果展示给用户
278
323
 
279
324
  **绝对不要做的事:**
280
325
  - 不要替用户扩写、润色、翻译 prompt(用户说"帮我推演分镜",就直接传"帮我推演分镜",不要自己先写个分镜表再逐条发)
@@ -310,4 +355,4 @@ python3 {baseDir}/scripts/download_results.py --urls URL1 URL2 URL3 --output-dir
310
355
  - 查询会话时可用 --after-seq 做增量拉取,便于轮询新消息(含 assistant 回复与生图/生视频结果)
311
356
  - 上传文件仅支持图片(image/*)、视频(video/*)和 `.mp3/.wav` 音频文件,其他类型会被拒绝,文件大小须在 200MB 以下
312
357
  - 生成过程中将过程中的创作信息展示给用户;任务完成后给出**产物结果(图片/视频)URL链接**和下载的**本地文件列表**。
313
- - 模型直出任务必须保留 `generate-video` 返回的 `thread_id` / `run_id`,并用 `query-result` 取回最终视频。
358
+ - 图片/视频模型直出任务必须保留 `generate-image` / `generate-video` 返回的 `thread_id` / `run_id`,并用 `query-result` 取回最终图片或视频。