@pippit-dev/cli 1.0.20 → 1.0.22

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/scripts/run.js CHANGED
@@ -1,19 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const { execFileSync } = require("child_process");
4
- const fs = require("fs");
5
- const path = require("path");
6
- const {
7
- isCanvasCommand,
8
- runCanvasCommand,
9
- } = require("./canvas-command");
10
- const { maybeWarnNewVersion } = require("./version-check");
3
+ const { execFileSync } = require('child_process');
4
+ const fs = require('fs');
5
+ const path = require('path');
6
+ const { isCanvasCommand, runCanvasCommand } = require('./canvas-command');
7
+ const { maybeWarnNewVersion } = require('./version-check');
11
8
 
12
- const ext = process.platform === "win32" ? ".exe" : "";
13
- const bin = path.join(__dirname, "..", "bin", "pippit-tool-cli" + ext);
9
+ const ext = process.platform === 'win32' ? '.exe' : '';
10
+ const bin = path.join(__dirname, '..', 'bin', 'pippit-tool-cli' + ext);
14
11
  const args = process.argv.slice(2);
15
12
 
16
- const oldBin = bin + ".old";
13
+ const oldBin = bin + '.old';
17
14
  function restoreOldBinary() {
18
15
  try {
19
16
  if (fs.existsSync(bin)) {
@@ -26,57 +23,76 @@ function restoreOldBinary() {
26
23
  }
27
24
  }
28
25
 
29
- if (process.platform === "win32" && fs.existsSync(oldBin)) {
30
- if (!fs.existsSync(bin)) {
31
- restoreOldBinary();
32
- } else {
33
- try {
34
- execFileSync(bin, ["--help"], { stdio: "ignore", timeout: 10000 });
35
- fs.rmSync(oldBin, { force: true });
36
- } catch (_) {
26
+ function runCanvas() {
27
+ runCanvasCommand(args, {
28
+ nativeInvocation: { command: bin },
29
+ })
30
+ .then((exitCode) => {
31
+ if (exitCode) process.exitCode = exitCode;
32
+ })
33
+ .catch((error) => {
34
+ console.error(error && error.message ? error.message : String(error));
35
+ process.exitCode = 1;
36
+ });
37
+ }
38
+
39
+ function main() {
40
+ // Installation help must work before any native binary preparation.
41
+ if (args[0] === 'install') {
42
+ return require('./install-wizard.js').main(args.slice(1));
43
+ }
44
+
45
+ const helpRequested = args.includes('--help') || args.includes('-h') || args[0] === 'help';
46
+ if (isCanvasCommand(args) && (args[2] !== 'run' || helpRequested)) {
47
+ return runCanvas();
48
+ }
49
+
50
+ if (!helpRequested && args.length > 0 && process.platform === 'win32' && fs.existsSync(oldBin)) {
51
+ if (!fs.existsSync(bin)) {
37
52
  restoreOldBinary();
53
+ } else {
54
+ try {
55
+ execFileSync(bin, ['--help'], { stdio: 'ignore', timeout: 10000 });
56
+ fs.rmSync(oldBin, { force: true });
57
+ } catch (_) {
58
+ restoreOldBinary();
59
+ }
38
60
  }
39
61
  }
40
- }
41
62
 
42
- // Match the lark-cli install entry: `npx @pippit-dev/cli@latest install`
43
- // should run the JS setup flow before the native binary exists.
44
- if (args[0] === "install") {
45
- require("./install-wizard.js").main();
46
- } else {
47
- maybeWarnNewVersion(args);
63
+ if (!helpRequested && args.length > 0) maybeWarnNewVersion(args);
48
64
 
49
65
  if (!fs.existsSync(bin)) {
66
+ if (helpRequested || args.length === 0) {
67
+ console.error(
68
+ 'Native CLI binary is missing. Reinstall @pippit-dev/cli to restore native command help; canvas command --help and install --help remain available.',
69
+ );
70
+ process.exitCode = 1;
71
+ return;
72
+ }
50
73
  try {
51
- execFileSync(process.execPath, [path.join(__dirname, "install.js")], {
52
- stdio: "inherit",
53
- env: { ...process.env, PIPPIT_CLI_RUN: "true" },
74
+ execFileSync(process.execPath, [path.join(__dirname, 'install.js')], {
75
+ stdio: 'inherit',
76
+ env: { ...process.env, PIPPIT_CLI_RUN: 'true' },
54
77
  });
55
78
  } catch (_) {
56
79
  console.error(
57
- "\nFailed to prepare pippit-tool-cli binary.\n" +
58
- "Make sure Go is installed and available in PATH, then retry.\n"
80
+ '\nFailed to prepare pippit-tool-cli binary.\n' +
81
+ 'Check your network connection and reinstall the npm package to download the prebuilt binary.\n',
59
82
  );
60
83
  process.exit(1);
61
84
  }
62
85
  }
63
86
 
64
87
  if (isCanvasCommand(args)) {
65
- runCanvasCommand(args, {
66
- nativeInvocation: { command: bin },
67
- })
68
- .then((exitCode) => {
69
- if (exitCode) process.exitCode = exitCode;
70
- })
71
- .catch((error) => {
72
- console.error(error && error.message ? error.message : String(error));
73
- process.exitCode = 1;
74
- });
88
+ runCanvas();
75
89
  } else {
76
90
  try {
77
- execFileSync(bin, args, { stdio: "inherit" });
91
+ execFileSync(bin, args, { stdio: 'inherit' });
78
92
  } catch (e) {
79
93
  process.exit(e.status || 1);
80
94
  }
81
95
  }
82
96
  }
97
+
98
+ main();
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: xyq-skill
3
- description: 通过小云雀的 AI 能力进行综合创作,支持生成和编辑图片/视频,并在用户明确要求图片或视频模型直出、指定图片或视频模型或直接调用 CLI 时使用 pippit-tool-cli generate-image / generate-video;用户要求视频超分、提升视频清晰度、擦字幕或去字幕时,使用 video-super-resolution / erase-video-subtitle。覆盖文生图、文生视频、图生视频、首尾帧生视频、视频编辑、风格转换、视频续写、视频复刻、TVC、宣传片、音乐 MV、产品广告、分镜和教育短视频等场景。当用户提到小云雀、xyq、上传参考图/视频/mp3或wav音频、查看生成进度时也应触发。短剧生成、续写、改写、人物设定和分集创作应使用 xyq-short-drama-skill,不在本技能中执行。
3
+ description: 通过小云雀的 AI 能力进行综合创作,支持生成和编辑图片/视频,并在用户明确要求图片或视频模型直出、指定图片或视频模型或直接调用 CLI 时使用 pippit-tool-cli generate-image / generate-video;用户要求视频超分、提升视频清晰度、擦字幕或去字幕时,使用 video-super-resolution / erase-video-subtitle。覆盖文生图、文生视频、图生视频、首尾帧生视频、视频编辑、风格转换、视频续写、视频复刻、TVC、宣传片、音乐 MV、产品广告、分镜和教育短视频等场景。当用户提到小云雀、xyq、上传参考图/视频/mp3或wav音频、查看生成进度,或查询小云雀积分余额、剩余积分、credits 时也应触发;积分查询使用 pippit-tool-cli get-credit-balance。短剧生成、续写、改写、人物设定和分集创作应使用 xyq-short-drama-skill,不在本技能中执行。
4
4
  user-invocable: true
5
5
  metadata:
6
6
  {
@@ -17,9 +17,9 @@ metadata:
17
17
  }
18
18
  ---
19
19
 
20
- # 小云雀创作、图片/视频模型直出与视频处理
20
+ # 小云雀创作、图片/视频模型直出、视频处理与积分查询
21
21
 
22
- 通过 小云雀的API 创建会话、发送消息(生图、生视频、编辑视频等)、上传图片/视频/mp3或wav音频文件,并查询会话消息进展。
22
+ 通过 小云雀的API 创建会话、发送消息(生图、生视频、编辑视频等)、上传图片/视频/mp3或wav音频文件,并查询会话消息进展;通过 CLI 查询个人有效积分余额。
23
23
 
24
24
  小云雀是一个 AI 综合创作平台,同时为人类创作者和 Agent 设计。Agent 通过 Skill 入口理解任务、调用模型并自动编排工作流。
25
25
 
@@ -33,6 +33,8 @@ metadata:
33
33
 
34
34
  ## 执行路由(必须先判断)
35
35
 
36
+ 积分余额查询优先走路由 F,不进入创作、视频处理或短剧工作流。
37
+
36
38
  ### 路由 A:图片模型直出
37
39
 
38
40
  满足任一条件时,必须直接使用 `pippit-tool-cli generate-image`,不要改走 `submit_run.py`:
@@ -134,12 +136,37 @@ pippit-tool-cli query-result \
134
136
 
135
137
  ### 路由 D:小云雀后端 Agent 编排
136
138
 
137
- 需要意图确认、脚本/分镜拆解、MV、TVC、局部编辑、复杂参考素材编排,或者用户未明确要求模型直出时,继续使用本技能内置的 `submit_run.py` / `get_thread.py` 会话工作流;明确的首尾帧请求走路由 B,明确的视频超分和擦字幕请求走路由 C。
139
+ 需要意图确认、脚本/分镜拆解、MV、TVC、局部编辑、复杂参考素材编排,或者用户未明确要求模型直出的创作需求,继续使用本技能内置的 `submit_run.py` / `get_thread.py` 会话工作流;明确的首尾帧请求走路由 B,明确的视频超分和擦字幕请求走路由 C;积分余额查询走路由 F
138
140
 
139
141
  ### 路由 E:短剧工作流
140
142
 
141
143
  用户要求短剧生成、续写、改写、剧情扩展、人物设定、分集草稿或短剧会话文件处理时,停止本技能流程并转交 `xyq-short-drama-skill`,不要用 `submit_run.py`、`generate-image` 或 `generate-video` 假装执行完整短剧流程。
142
144
 
145
+ ### 路由 F:积分余额查询
146
+
147
+ 用户询问小云雀“积分余额”、“还剩多少积分”、“剩余 credits”或要求查询个人有效积分时,直接使用 `pippit-tool-cli get-credit-balance`。
148
+
149
+ 执行原则:
150
+
151
+ 1. 执行前用 `command -v pippit-tool-cli` 确认 CLI 可用;不可用或版本不支持该命令时报告阻塞,不要改走 `submit_run.py`。
152
+ 2. 使用当前 CLI 登录凭证或显式配置的 `XYQ_ACCESS_KEY` 查询凭证所属用户的个人有效积分余额;无需传入用户 ID、`thread_id` 或 `run_id`。鉴权要求见“前置要求”。
153
+ 3. 这是只读查询,不需要积分消耗确认;不创建会话,不提交生成任务,也不调用 `get_thread.py` 或 `query-result` 轮询。
154
+ 4. 成功时读取 JSON 中字符串类型的 `total_remain_amount`,向用户展示当前有效积分余额;`"0"` 是有效的零余额。查询失败或缺少余额字段时报告错误,不得当作零余额。
155
+ 5. 需要排查请求时可添加 `--with-log-id`,同时保留返回的 `log_id`。该命令只返回总余额,不提供积分明细、到期时间或生成任务的费用预估。
156
+
157
+ ```bash
158
+ pippit-tool-cli get-credit-balance
159
+
160
+ # 排查请求时同时返回 log_id
161
+ pippit-tool-cli get-credit-balance --with-log-id
162
+ ```
163
+
164
+ 默认输出示例:
165
+
166
+ ```json
167
+ {"total_remain_amount":"123"}
168
+ ```
169
+
143
170
  ## 用户确认与反问
144
171
 
145
172
  后端返回意图确认问题、真实提交前需要 credits 确认,或缺少无法安全推断的必需信息时,暂停执行并向用户提问。
@@ -148,7 +175,7 @@ pippit-tool-cli query-result \
148
175
  - **Codex**:准确工具名是 `request_user_input`。仅在工具已暴露且当前模式允许时调用;不可用时退回普通聊天提问。不要在 Codex 中调用 `ask_user_question`。
149
176
  - **WorkBuddy**:准确工具名是 `ask_user_question`(Ask User Question)。需要用户补充、选择或确认时优先调用;工具未暴露时才退回普通聊天提问。
150
177
  - **Trae 及其他宿主**:先查看当前宿主实际暴露的工具,再使用同类结构化提问、确认或表单工具;不要臆造具体工具名。没有同类工具时退回普通聊天提问。
151
- 2. 涉及 credits、真实生成、外部提交或不可逆操作时,必须等待用户明确答复;不要默认同意或超时后继续。
178
+ 2. 涉及 credits 消耗、真实生成、外部提交或不可逆操作时,必须等待用户明确答复;不要默认同意或超时后继续。路由 F 的只读积分余额查询不需要额外确认。
152
179
  3. 后端已经给出问题或选项时,保持原意传给用户,不要代替用户回答。
153
180
  4. 当前宿主没有结构化提问工具,或当前模式不允许调用时,使用一条简洁的普通聊天问题并暂停。
154
181
  5. 收到回复后,把用户答案原样发回同一 `thread_id`,获取新的 `run_id`,再继续轮询;不要新开会话。
@@ -162,11 +189,12 @@ pippit-tool-cli query-result \
162
189
  5. **图片模型直出** - 使用 `pippit-tool-cli generate-image` 直接调用图片模型,使用 `query-result` 查询并下载图片结果。
163
190
  6. **视频模型直出** - 使用 `pippit-tool-cli generate-video` 直接调用视频模型,使用 `query-result` 查询并下载视频结果。
164
191
  7. **视频处理** - 使用 `pippit-tool-cli video-super-resolution` 或 `erase-video-subtitle` 处理本地视频,使用 `query-result` 查询并下载视频结果。
192
+ 8. **积分余额查询** - 使用 `pippit-tool-cli get-credit-balance` 查询当前凭证所属用户的个人有效积分余额,直接展示 `total_remain_amount`。
165
193
 
166
194
 
167
195
  ## 前置要求
168
196
 
169
- 图片/视频模型直出和视频处理(路由 A/B/C)使用原生 CLI。首次使用时运行网页登录,CLI 会自动申请或复用本机专属凭证,并保存到系统安全凭证库:
197
+ 图片/视频模型直出、视频处理和积分余额查询(路由 A/B/C/F)使用原生 CLI。首次使用时运行网页登录,CLI 会自动申请或复用本机专属凭证,并保存到系统安全凭证库:
170
198
 
171
199
  ```bash
172
200
  pippit-tool-cli login
@@ -182,7 +210,7 @@ export XYQ_ACCESS_KEY="your-access-key"
182
210
 
183
211
  可选:`XYQ_OPENAPI_BASE` 或 `XYQ_BASE_URL`,默认 `https://xyq.jianying.com`。
184
212
 
185
- 会话 API 路由无需安装额外依赖,仅使用 Python 标准库。图片/视频模型直出和视频处理路由额外要求 `pippit-tool-cli` 在 `PATH` 中可用。
213
+ 会话 API 路由无需安装额外依赖,仅使用 Python 标准库。图片/视频模型直出、视频处理和积分余额查询路由要求 `pippit-tool-cli` 在 `PATH` 中可用。
186
214
 
187
215
  ## 使用方法
188
216
 
@@ -385,10 +413,10 @@ python3 {baseDir}/scripts/download_results.py --urls URL1 URL2 URL3 --output-dir
385
413
 
386
414
  ## 核心原则:用户侧不做创作,只做传话
387
415
 
388
- 你(用户侧 Agent)的职责是**搬运工**,不是创作者。会话 API 路由由后端 Agent 负责理解需求、拆解分镜、编排工作流、选模型、写 prompt;图片/视频模型直出和视频处理路由把用户原始参数传给 CLI。你要做的是:
416
+ 你(用户侧 Agent)的职责是**搬运工**,不是创作者。会话 API 路由由后端 Agent 负责理解需求、拆解分镜、编排工作流、选模型、写 prompt;图片/视频模型直出和视频处理路由把用户原始参数传给 CLI。积分余额查询按路由 F 直接查询并展示余额;以下步骤适用于创作和视频处理任务:
389
417
 
390
418
  1. **准备素材**:会话 API 路由用 `upload_file.py` 把本地文件转为 asset_id;图片/视频模型直出和视频处理路由把本地路径直接交给对应 CLI;首尾帧任务固定传 `--generate-type 1` 并保持首帧、尾帧顺序
391
- 2. **提交任务**:先按“执行路由”判断;图片模型直出调用 `pippit-tool-cli generate-image`,视频模型直出调用 `pippit-tool-cli generate-video`,视频超分和擦字幕调用对应的视频处理命令,其余任务把用户的原始描述 + asset_id 原封不动发给 `submit_run.py`
419
+ 2. **提交任务**:先按“执行路由”判断;图片模型直出调用 `pippit-tool-cli generate-image`,视频模型直出调用 `pippit-tool-cli generate-video`,视频超分和擦字幕调用对应的视频处理命令,其余通用创作任务把用户的原始描述 + asset_id 原封不动发给 `submit_run.py`
392
420
  3. **传话**:根据 `get_thread.py` 返回的消息列表,展示过程中的意图询问、创作信息等
393
421
  4. **取件**:会话 API 路由用 `get_thread.py` 轮询,图片/视频模型直出和视频处理路由用 `query-result` 轮询 → 检查结果 → 下载产物 → 结果展示给用户
394
422