@lingjingai/lj-awb-cli-pre 0.4.0 → 0.4.6
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 +45 -0
- package/build/_shared.mjs +54 -5
- package/build/prod.mjs +12 -3
- package/package.json +2 -2
- package/packages/awb-cli/package.json +2 -2
- package/packages/awb-core/package.json +1 -1
- package/packages/awb-core/src/api.js +31 -0
- package/packages/awb-core/src/commands.js +141 -39
- package/packages/awb-core/src/common.js +20 -0
- package/packages/awb-core/src/output.js +176 -9
- package/packages/awb-core/src/services.js +1767 -198
- package/packages/awb-core/src/standalone.js +116 -12
- package/packages/awb-core/src/update.js +327 -0
- package/skills/lj-awb/SKILL.md +30 -9
- package/skills/lj-awb/VERSION +1 -1
- package/skills/lj-awb/compat.json +3 -3
- package/skills/lj-awb/modules/asset.md +10 -1
- package/skills/lj-awb/modules/auth.md +9 -1
- package/skills/lj-awb/modules/create-contract.md +5 -2
- package/skills/lj-awb/modules/create.md +4 -2
- package/skills/lj-awb/modules/credits.md +19 -2
- package/skills/lj-awb/modules/driver.md +1 -0
- package/skills/lj-awb/modules/image.md +3 -1
- package/skills/lj-awb/modules/model.md +5 -4
- package/skills/lj-awb/modules/task.md +4 -1
- package/skills/lj-awb/modules/upload.md +1 -1
- package/skills/lj-awb/modules/video.md +11 -2
- package/skills/lj-awb/modules/workflows.md +3 -1
- package/skills/lj-awb/references/error-codes.md +41 -0
- package/skills/lj-awb/references/model-options-read.md +7 -6
- package/skills/lj-awb/references/output-fields.md +10 -5
- package/skills/lj-awb/scripts/resolve-lj-awb-cmd.sh +106 -4
|
@@ -2,6 +2,7 @@ import { fetchProjectGroupUsers, fetchTeams, fetchUserInfo } from './api.js';
|
|
|
2
2
|
import * as artifact from './artifact.js';
|
|
3
3
|
import { clearAuth, loadAuth, saveAccessKey, summarizeAuth } from './auth.js';
|
|
4
4
|
import { LingjingAwbCliError, maskSecret, toBool, trimSecret } from './common.js';
|
|
5
|
+
import { runCliUpdate } from './update.js';
|
|
5
6
|
import {
|
|
6
7
|
assetGroupCreate,
|
|
7
8
|
assetGroupGet,
|
|
@@ -10,7 +11,11 @@ import {
|
|
|
10
11
|
assetMatchActor,
|
|
11
12
|
assetReviewModels,
|
|
12
13
|
assetRegister,
|
|
14
|
+
authLogin,
|
|
15
|
+
authLogout,
|
|
13
16
|
creditsBalance,
|
|
17
|
+
creditsBuy,
|
|
18
|
+
creditsRedeem,
|
|
14
19
|
creditsUsageSummary,
|
|
15
20
|
createProjectGroupCommand,
|
|
16
21
|
accountInfo,
|
|
@@ -39,6 +44,9 @@ import {
|
|
|
39
44
|
subjectWait,
|
|
40
45
|
subtitleRemove,
|
|
41
46
|
subtitleStatus,
|
|
47
|
+
videoSuperResolution,
|
|
48
|
+
videoSuperResolutionFee,
|
|
49
|
+
videoSuperResolutionStatus,
|
|
42
50
|
taskList,
|
|
43
51
|
taskRecordPoll,
|
|
44
52
|
taskRecords,
|
|
@@ -85,6 +93,9 @@ const MODEL_LIST_ARGS = [
|
|
|
85
93
|
const TASK_RECORD_ARG = { name: 'task-record-file', valueName: 'path', description: '任务台账 JSONL 文件;也可用 LINGJING_AWB_TASK_RECORD_FILE' };
|
|
86
94
|
const RESOURCE_ARG = { name: 'resource', valueName: 'spec', description: '统一素材,格式 type:usage[:key]=path|url|asset,可重复传;音频参考用 audio:reference=./music.mp3' };
|
|
87
95
|
const RESOURCES_JSON_ARG = { name: 'resources-json', valueName: 'json|path', description: 'resources 数组 JSON 或 JSON 文件路径' };
|
|
96
|
+
const MODEL_PARAM_ARG = { name: 'model-param', valueName: 'key=value', description: '通用模型配置参数,可重复传;key 来自 model options.params[],例如 generation_effort=high' };
|
|
97
|
+
const MODEL_PARAMS_JSON_ARG = { name: 'model-params-json', valueName: 'json|path', description: '通用模型配置参数对象 JSON 或 JSON 文件路径;显式 --ratio/--quality 等命令参数优先' };
|
|
98
|
+
const MODEL_PARAM_ARGS = [MODEL_PARAM_ARG, MODEL_PARAMS_JSON_ARG];
|
|
88
99
|
const CREATE_WAIT_ARGS = [
|
|
89
100
|
{ name: 'wait-seconds', valueName: 'seconds', description: '提交后顺带等待结果的秒数;默认 0 不等待' },
|
|
90
101
|
{ name: 'poll-interval-ms', valueName: 'ms', description: '任务轮询间隔毫秒数,默认 5000' },
|
|
@@ -125,6 +136,25 @@ export function registerAwbCommands(cli) {
|
|
|
125
136
|
func: async (_ctx, kwargs) => doctor(kwargs),
|
|
126
137
|
});
|
|
127
138
|
|
|
139
|
+
cli({
|
|
140
|
+
name: 'update',
|
|
141
|
+
description: commandHelp('检查并更新 CLI 到最新版本;默认只在需要时安装新版本', {
|
|
142
|
+
examples: [
|
|
143
|
+
'lj-awb update --check',
|
|
144
|
+
'lj-awb update',
|
|
145
|
+
'lj-awb update --force',
|
|
146
|
+
],
|
|
147
|
+
hint: '普通命令只会做非阻塞更新检查;真正安装请显式运行 update。',
|
|
148
|
+
}),
|
|
149
|
+
args: [
|
|
150
|
+
{ name: 'check', description: '只检查是否有新版本,不安装' },
|
|
151
|
+
{ name: 'force', description: '强制重新检查并执行安装,忽略缓存' },
|
|
152
|
+
{ name: 'registry', valueName: 'url', description: 'npm registry 地址;默认读取环境变量或 npm 默认 registry' },
|
|
153
|
+
{ name: 'package-name', valueName: 'name', description: '要更新的包名;默认自动识别当前 CLI 包' },
|
|
154
|
+
],
|
|
155
|
+
func: async (_ctx, kwargs) => runCliUpdate(kwargs),
|
|
156
|
+
});
|
|
157
|
+
|
|
128
158
|
cli({
|
|
129
159
|
name: 'auth status',
|
|
130
160
|
description: commandHelp('查看本地 access key 是否已配置;不联网', {
|
|
@@ -163,50 +193,27 @@ export function registerAwbCommands(cli) {
|
|
|
163
193
|
|
|
164
194
|
cli({
|
|
165
195
|
name: 'auth login',
|
|
166
|
-
description: commandHelp('
|
|
196
|
+
description: commandHelp('登录:默认走浏览器授权登录;也支持直接传 access key 保存', {
|
|
167
197
|
examples: [
|
|
198
|
+
'lj-awb auth login',
|
|
199
|
+
'lj-awb auth login --no-wait',
|
|
200
|
+
'lj-awb auth login --flow-id <flowId>',
|
|
168
201
|
'lj-awb auth login --access-key <key>',
|
|
169
202
|
'LINGJING_AWB_ACCESS_KEY=<key> lj-awb auth login',
|
|
170
203
|
'lj-awb auth login --access-key <key> --skip-verify',
|
|
171
204
|
],
|
|
172
|
-
hint: '
|
|
205
|
+
hint: '不传 --access-key(且无 LINGJING_AWB_ACCESS_KEY 环境变量)时走浏览器授权:创建登录任务、展示链接、轮询直到授权成功并自动保存 access key。命令最长阻塞约 10 分钟;AI agent 可先用 --no-wait --json 拿 flow_id,再用 --flow-id <id> 续轮询,不要重复发起新的 login。',
|
|
173
206
|
}),
|
|
174
207
|
args: [
|
|
175
|
-
{ name: 'access-key', valueName: 'key', description: '平台 access key
|
|
208
|
+
{ name: 'access-key', valueName: 'key', description: '平台 access key;传了则跳过浏览器授权直接保存,不传时读取环境变量' },
|
|
209
|
+
{ name: 'flow-id', valueName: 'flowId', description: '复用已有登录任务的 flow_id 继续轮询;不传则新建登录任务' },
|
|
210
|
+
{ name: 'no-wait', description: '只创建登录任务并返回 flow_id / verify_url,不阻塞轮询;适合 AI agent / 脚本' },
|
|
211
|
+
{ name: 'wait-seconds', valueName: 'seconds', description: '浏览器授权最长轮询秒数,默认 600' },
|
|
212
|
+
{ name: 'poll-interval-ms', valueName: 'ms', description: '授权状态轮询间隔毫秒数,默认 3000' },
|
|
176
213
|
{ name: 'skip-verify', description: '只保存 key,不调用 userInfo 校验;仅用于本地调试' },
|
|
177
214
|
DRY_RUN_ARG,
|
|
178
215
|
],
|
|
179
|
-
func: async (_ctx, kwargs) =>
|
|
180
|
-
const skipVerify = toBool(kwargs.skipVerify);
|
|
181
|
-
const accessKey = trimSecret(kwargs.accessKey || process.env.LINGJING_AWB_ACCESS_KEY || '');
|
|
182
|
-
if (!accessKey) {
|
|
183
|
-
throw new LingjingAwbCliError('缺少 access key', {
|
|
184
|
-
type: 'argument_error',
|
|
185
|
-
exitCode: 2,
|
|
186
|
-
hint: '传 --access-key <key>,或设置 LINGJING_AWB_ACCESS_KEY 环境变量。',
|
|
187
|
-
});
|
|
188
|
-
}
|
|
189
|
-
if (toBool(kwargs.dryRun)) {
|
|
190
|
-
return {
|
|
191
|
-
dryRun: true,
|
|
192
|
-
saved: false,
|
|
193
|
-
verified: false,
|
|
194
|
-
accessKey: maskSecret(accessKey),
|
|
195
|
-
};
|
|
196
|
-
}
|
|
197
|
-
let user = null;
|
|
198
|
-
if (!skipVerify) {
|
|
199
|
-
process.env.LINGJING_AWB_ACCESS_KEY = accessKey;
|
|
200
|
-
user = normalizeUserInfo(await fetchUserInfo());
|
|
201
|
-
}
|
|
202
|
-
const { auth } = await saveAccessKey(accessKey, { verified: !skipVerify });
|
|
203
|
-
return {
|
|
204
|
-
auth: summarizeAuth(auth, { accessKey, source: 'saved', sourceName: 'auth' }),
|
|
205
|
-
accessKey: maskSecret(accessKey),
|
|
206
|
-
verified: !skipVerify,
|
|
207
|
-
user,
|
|
208
|
-
};
|
|
209
|
-
},
|
|
216
|
+
func: async (_ctx, kwargs) => authLogin(kwargs),
|
|
210
217
|
});
|
|
211
218
|
|
|
212
219
|
cli({
|
|
@@ -224,6 +231,16 @@ export function registerAwbCommands(cli) {
|
|
|
224
231
|
},
|
|
225
232
|
});
|
|
226
233
|
|
|
234
|
+
cli({
|
|
235
|
+
name: 'auth logout',
|
|
236
|
+
description: commandHelp('退出登录:清除本地保存的 access key', {
|
|
237
|
+
examples: ['lj-awb auth logout'],
|
|
238
|
+
hint: '只清本地认证文件,不清当前 shell 中的 LINGJING_AWB_ACCESS_KEY 环境变量;下次使用前重新运行 lj-awb auth login。',
|
|
239
|
+
}),
|
|
240
|
+
args: [],
|
|
241
|
+
func: async () => authLogout(),
|
|
242
|
+
});
|
|
243
|
+
|
|
227
244
|
cli({
|
|
228
245
|
name: 'account info',
|
|
229
246
|
description: commandHelp('查看当前 AWB 用户、团队、项目组和积分摘要', {
|
|
@@ -383,6 +400,33 @@ export function registerAwbCommands(cli) {
|
|
|
383
400
|
func: async (_ctx, kwargs) => creditsUsageSummary(kwargs),
|
|
384
401
|
});
|
|
385
402
|
|
|
403
|
+
cli({
|
|
404
|
+
name: 'credits buy',
|
|
405
|
+
description: commandHelp('引导购买 / 充值:按当前环境(预发 / 正式)输出充值页面链接', {
|
|
406
|
+
examples: ['lj-awb credits buy'],
|
|
407
|
+
hint: '只输出充值链接,不发起网络请求;请在浏览器中打开链接完成购买。链接随构建环境写死,预发与正式各自指向对应工作台域名。',
|
|
408
|
+
}),
|
|
409
|
+
args: [],
|
|
410
|
+
func: async () => creditsBuy(),
|
|
411
|
+
});
|
|
412
|
+
|
|
413
|
+
cli({
|
|
414
|
+
name: 'credits redeem',
|
|
415
|
+
description: commandHelp('兑换码兑换:等待输入兑换码并调用平台兑换接口,成功后展示最新积分余额', {
|
|
416
|
+
examples: [
|
|
417
|
+
'lj-awb credits redeem',
|
|
418
|
+
'lj-awb credits redeem --code <code>',
|
|
419
|
+
],
|
|
420
|
+
hint: '不传 --code 时进入交互模式,最长等待约 10 分钟读取兑换码(自动去除空格 / 换行);非交互终端必须用 --code 传入。兑换成功后会顺带展示当前积分余额。',
|
|
421
|
+
}),
|
|
422
|
+
args: [
|
|
423
|
+
{ name: 'code', valueName: 'code', description: '兑换码;不传则交互式等待输入' },
|
|
424
|
+
{ name: 'wait-seconds', valueName: 'seconds', description: '交互模式下等待输入兑换码的最长秒数,默认 600' },
|
|
425
|
+
DRY_RUN_ARG,
|
|
426
|
+
],
|
|
427
|
+
func: async (_ctx, kwargs) => creditsRedeem(kwargs),
|
|
428
|
+
});
|
|
429
|
+
|
|
386
430
|
cli({
|
|
387
431
|
name: 'model image-models',
|
|
388
432
|
description: commandHelp('查询可用生图模型', {
|
|
@@ -497,10 +541,12 @@ export function registerAwbCommands(cli) {
|
|
|
497
541
|
{ name: 'ratio', valueName: 'ratio', description: '画幅比例,如 9:16' },
|
|
498
542
|
{ name: 'quality', valueName: 'quality', description: '清晰度,如 2K' },
|
|
499
543
|
{ name: 'generate-num', valueName: 'n', description: '生成张数' },
|
|
544
|
+
...MODEL_PARAM_ARGS,
|
|
500
545
|
RESOURCE_ARG,
|
|
501
546
|
RESOURCES_JSON_ARG,
|
|
502
547
|
FEE_DRY_RUN_ARG,
|
|
503
548
|
],
|
|
549
|
+
allowDynamicModelParams: true,
|
|
504
550
|
func: async (_ctx, kwargs) => imageFee(kwargs),
|
|
505
551
|
});
|
|
506
552
|
|
|
@@ -521,6 +567,7 @@ export function registerAwbCommands(cli) {
|
|
|
521
567
|
{ name: 'ratio', valueName: 'ratio', description: '画幅比例' },
|
|
522
568
|
{ name: 'quality', valueName: 'quality', description: '清晰度' },
|
|
523
569
|
{ name: 'generate-num', valueName: 'n', description: '生成张数' },
|
|
570
|
+
...MODEL_PARAM_ARGS,
|
|
524
571
|
RESOURCE_ARG,
|
|
525
572
|
RESOURCES_JSON_ARG,
|
|
526
573
|
TASK_RECORD_ARG,
|
|
@@ -528,6 +575,7 @@ export function registerAwbCommands(cli) {
|
|
|
528
575
|
DRY_RUN_ARG,
|
|
529
576
|
YES_ARG,
|
|
530
577
|
],
|
|
578
|
+
allowDynamicModelParams: true,
|
|
531
579
|
func: async (_ctx, kwargs) => imageCreate(kwargs),
|
|
532
580
|
});
|
|
533
581
|
|
|
@@ -538,17 +586,19 @@ export function registerAwbCommands(cli) {
|
|
|
538
586
|
'lj-awb create image-batch --input-file ./prompts.txt --model-group-code <code> --dry-run',
|
|
539
587
|
'lj-awb create image-batch --input-file ./image-input.jsonl --model-group-code <code> --concurrency 3 --yes',
|
|
540
588
|
],
|
|
541
|
-
hint: 'JSON/JSONL 每项只写任务差异字段:prompt、ratio、quality、generate_num、resources、resource、customBizId
|
|
589
|
+
hint: 'JSON/JSONL 每项只写任务差异字段:prompt、ratio、quality、generate_num、resources、resource、model_params、customBizId;新增模型配置参数也可直接写入每项。',
|
|
542
590
|
}),
|
|
543
591
|
args: [
|
|
544
592
|
{ name: 'input-file', valueName: 'path', description: '批量输入文件' },
|
|
545
593
|
MODEL_GROUP_ARG,
|
|
546
594
|
PROJECT_GROUP_ARG,
|
|
595
|
+
...MODEL_PARAM_ARGS,
|
|
547
596
|
{ name: 'concurrency', valueName: 'n', description: '并发数,默认 1' },
|
|
548
597
|
TASK_RECORD_ARG,
|
|
549
598
|
DRY_RUN_ARG,
|
|
550
599
|
YES_ARG,
|
|
551
600
|
],
|
|
601
|
+
allowDynamicModelParams: true,
|
|
552
602
|
func: async (_ctx, kwargs) => imageCreateBatch(kwargs),
|
|
553
603
|
});
|
|
554
604
|
|
|
@@ -577,10 +627,12 @@ export function registerAwbCommands(cli) {
|
|
|
577
627
|
{ name: 'quality', valueName: 'quality', description: '清晰度,如 720' },
|
|
578
628
|
{ name: 'duration', valueName: 'seconds', description: '生成时长秒数' },
|
|
579
629
|
{ name: 'need-audio', valueName: 'bool', description: '输出音效开关:是否让模型在视频中生成音效(true/false)。不接收音频文件;参考音频请用 --resource audio:reference=...' },
|
|
630
|
+
...MODEL_PARAM_ARGS,
|
|
580
631
|
RESOURCE_ARG,
|
|
581
632
|
RESOURCES_JSON_ARG,
|
|
582
633
|
FEE_DRY_RUN_ARG,
|
|
583
634
|
],
|
|
635
|
+
allowDynamicModelParams: true,
|
|
584
636
|
func: async (_ctx, kwargs) => videoFee(kwargs),
|
|
585
637
|
});
|
|
586
638
|
|
|
@@ -604,6 +656,7 @@ export function registerAwbCommands(cli) {
|
|
|
604
656
|
{ name: 'quality', valueName: 'quality', description: '清晰度' },
|
|
605
657
|
{ name: 'duration', valueName: 'seconds', description: '生成时长秒数' },
|
|
606
658
|
{ name: 'need-audio', valueName: 'bool', description: '输出音效开关:是否让模型在视频中生成音效(true/false)。不接收音频文件;参考音频请用 --resource audio:reference=...' },
|
|
659
|
+
...MODEL_PARAM_ARGS,
|
|
607
660
|
RESOURCE_ARG,
|
|
608
661
|
RESOURCES_JSON_ARG,
|
|
609
662
|
TASK_RECORD_ARG,
|
|
@@ -611,6 +664,7 @@ export function registerAwbCommands(cli) {
|
|
|
611
664
|
DRY_RUN_ARG,
|
|
612
665
|
YES_ARG,
|
|
613
666
|
],
|
|
667
|
+
allowDynamicModelParams: true,
|
|
614
668
|
func: async (_ctx, kwargs) => videoCreate(kwargs),
|
|
615
669
|
});
|
|
616
670
|
|
|
@@ -621,17 +675,19 @@ export function registerAwbCommands(cli) {
|
|
|
621
675
|
'lj-awb create video-batch --input-file ./prompts.txt --model-group-code <code> --dry-run',
|
|
622
676
|
'lj-awb create video-batch --input-file ./video-input.jsonl --model-group-code <code> --concurrency 2 --yes',
|
|
623
677
|
],
|
|
624
|
-
hint: 'JSON/JSONL 每项只写任务差异字段:prompt、ratio、quality、duration、need_audio、resources、resource、customBizId
|
|
678
|
+
hint: 'JSON/JSONL 每项只写任务差异字段:prompt、ratio、quality、duration、need_audio、resources、resource、model_params、customBizId;新增模型配置参数也可直接写入每项。',
|
|
625
679
|
}),
|
|
626
680
|
args: [
|
|
627
681
|
{ name: 'input-file', valueName: 'path', description: '批量输入文件' },
|
|
628
682
|
MODEL_GROUP_ARG,
|
|
629
683
|
PROJECT_GROUP_ARG,
|
|
684
|
+
...MODEL_PARAM_ARGS,
|
|
630
685
|
{ name: 'concurrency', valueName: 'n', description: '并发数,默认 1' },
|
|
631
686
|
TASK_RECORD_ARG,
|
|
632
687
|
DRY_RUN_ARG,
|
|
633
688
|
YES_ARG,
|
|
634
689
|
],
|
|
690
|
+
allowDynamicModelParams: true,
|
|
635
691
|
func: async (_ctx, kwargs) => videoCreateBatch(kwargs),
|
|
636
692
|
});
|
|
637
693
|
|
|
@@ -660,6 +716,35 @@ export function registerAwbCommands(cli) {
|
|
|
660
716
|
func: async (_ctx, kwargs) => subtitleRemove(kwargs),
|
|
661
717
|
});
|
|
662
718
|
|
|
719
|
+
cli({
|
|
720
|
+
name: 'create video-super-resolution-fee',
|
|
721
|
+
description: commandHelp('计算视频超分预计积分;传入 objectName', {
|
|
722
|
+
examples: ['lj-awb create video-super-resolution-fee --object-name material/video-super/example.mp4 --project-group-no <no>'],
|
|
723
|
+
hint: 'objectName 通常是 material backendPath 或 COS 对象路径;正式超分前先看一次估价。',
|
|
724
|
+
}),
|
|
725
|
+
args: [
|
|
726
|
+
{ name: 'object-name', valueName: 'path', description: '视频对象路径;通常是 material backendPath 或 COS 对象路径' },
|
|
727
|
+
PROJECT_GROUP_ARG,
|
|
728
|
+
],
|
|
729
|
+
func: async (_ctx, kwargs) => videoSuperResolutionFee(kwargs),
|
|
730
|
+
});
|
|
731
|
+
|
|
732
|
+
cli({
|
|
733
|
+
name: 'create video-super-resolution',
|
|
734
|
+
description: commandHelp('基于 objectName 提交视频超分任务', {
|
|
735
|
+
examples: ['lj-awb create video-super-resolution --object-name material/video-super/example.mp4 --project-group-no <no> --dry-run'],
|
|
736
|
+
hint: '正式执行需要 --yes;会先按 objectName 读取视频信息,再选择 1080P / 2K 模型组。',
|
|
737
|
+
}),
|
|
738
|
+
args: [
|
|
739
|
+
{ name: 'object-name', valueName: 'path', description: '视频对象路径;通常是 material backendPath 或 COS 对象路径' },
|
|
740
|
+
PROJECT_GROUP_ARG,
|
|
741
|
+
TASK_RECORD_ARG,
|
|
742
|
+
DRY_RUN_ARG,
|
|
743
|
+
YES_ARG,
|
|
744
|
+
],
|
|
745
|
+
func: async (_ctx, kwargs) => videoSuperResolution(kwargs),
|
|
746
|
+
});
|
|
747
|
+
|
|
663
748
|
cli({
|
|
664
749
|
name: 'task video-subtitle-status',
|
|
665
750
|
description: commandHelp('查询 material 去字幕任务状态', {
|
|
@@ -672,13 +757,25 @@ export function registerAwbCommands(cli) {
|
|
|
672
757
|
func: async (_ctx, kwargs) => subtitleStatus(kwargs),
|
|
673
758
|
});
|
|
674
759
|
|
|
760
|
+
cli({
|
|
761
|
+
name: 'task video-super-resolution-status',
|
|
762
|
+
description: commandHelp('查询 material 视频超分任务状态', {
|
|
763
|
+
examples: ['lj-awb task video-super-resolution-status --task-id <superResolutionTaskId>'],
|
|
764
|
+
}),
|
|
765
|
+
args: [
|
|
766
|
+
{ name: 'task-id', valueName: 'id', description: 'material 视频超分任务 ID' },
|
|
767
|
+
PROJECT_GROUP_ARG,
|
|
768
|
+
],
|
|
769
|
+
func: async (_ctx, kwargs) => videoSuperResolutionStatus(kwargs),
|
|
770
|
+
});
|
|
771
|
+
|
|
675
772
|
cli({
|
|
676
773
|
name: 'task list',
|
|
677
774
|
description: commandHelp('查询项目组近期任务流', {
|
|
678
775
|
examples: ['lj-awb task list --task-type IMAGE_CREATE --project-group-no <no>'],
|
|
679
776
|
}),
|
|
680
777
|
args: [
|
|
681
|
-
{ name: 'task-type', valueName: 'type', description: 'IMAGE_CREATE / IMAGE_EDIT / VIDEO_GROUP' },
|
|
778
|
+
{ name: 'task-type', valueName: 'type', description: 'IMAGE_CREATE / IMAGE_EDIT / VIDEO_GROUP / VIDEO_SUPER_RESOLUTION / VIDEO_SUBTITLE_REMOVAL' },
|
|
682
779
|
PROJECT_GROUP_ARG,
|
|
683
780
|
{ name: 'page-size', valueName: 'n', description: '每页任务数' },
|
|
684
781
|
{ name: 'min-time', valueName: 'ms', description: '任务流 minTime,默认当前时间' },
|
|
@@ -694,7 +791,7 @@ export function registerAwbCommands(cli) {
|
|
|
694
791
|
}),
|
|
695
792
|
args: [
|
|
696
793
|
{ name: 'task-id', valueName: 'id', description: '任务 ID' },
|
|
697
|
-
{ name: 'task-type', valueName: 'type', description: 'IMAGE_CREATE / VIDEO_GROUP' },
|
|
794
|
+
{ name: 'task-type', valueName: 'type', description: 'IMAGE_CREATE / VIDEO_GROUP;material 扩展任务优先用 task video-subtitle-status / task video-super-resolution-status' },
|
|
698
795
|
PROJECT_GROUP_ARG,
|
|
699
796
|
...TASK_WAIT_ARGS,
|
|
700
797
|
],
|
|
@@ -811,7 +908,11 @@ export function registerAwbCommands(cli) {
|
|
|
811
908
|
cli({
|
|
812
909
|
name: 'create asset',
|
|
813
910
|
description: commandHelp('把 COS 路径 / URL / 本地文件注册成平台素材', {
|
|
814
|
-
examples: [
|
|
911
|
+
examples: [
|
|
912
|
+
'lj-awb create asset --group-id <id> --platform JIMENG --url "asset-review/upload/a.png" --name "女主正面" --dry-run',
|
|
913
|
+
'lj-awb create asset --group-id <id> --platform JIMENG --file ./clip.mp4 --name "参考视频" --dry-run',
|
|
914
|
+
],
|
|
915
|
+
hint: 'CLI 会按扩展名自动设置 assetType=Image/Video/Audio;本地文件会用 ffprobe 预校验图片/视频尺寸、视频时长/FPS/像素数和音频时长,缺少 ffprobe/ffmpeg 时 macOS + Homebrew 会自动安装 ffmpeg。',
|
|
815
916
|
}),
|
|
816
917
|
args: [
|
|
817
918
|
{ name: 'group-id', valueName: 'id', description: '素材组 ID' },
|
|
@@ -819,6 +920,7 @@ export function registerAwbCommands(cli) {
|
|
|
819
920
|
{ name: 'file', valueName: 'path', description: '本地素材文件;会先上传' },
|
|
820
921
|
{ name: 'url', valueName: 'url', description: '素材 URL 或 COS 路径' },
|
|
821
922
|
{ name: 'backend-path', valueName: 'path', description: 'upload files 返回的 backendPath' },
|
|
923
|
+
{ name: 'auto-convert', description: '本地素材不符合加白规格时自动转换为合法规格后继续' },
|
|
822
924
|
ASSET_PLATFORM_ARG,
|
|
823
925
|
DRY_RUN_ARG,
|
|
824
926
|
YES_ARG,
|
|
@@ -11,6 +11,18 @@ export const API_ORIGIN = (
|
|
|
11
11
|
|| process.env.AWB_BASE_URL
|
|
12
12
|
|| DEFAULT_API_ORIGIN
|
|
13
13
|
).replace(/\/+$/, '');
|
|
14
|
+
// 充值 / 购买引导页面链接:随构建环境写死,预发和正式分别指向各自的工作台域名。
|
|
15
|
+
export const PURCHASE_URL_PRE = 'https://animeworkbench-pre.lingjingai.cn/platform/creation?openModal=RechargeModal';
|
|
16
|
+
export const PURCHASE_URL_PROD = 'https://animeworkbench.lingjingai.cn/platform/creation?openModal=RechargeModal';
|
|
17
|
+
|
|
18
|
+
export function resolvePurchaseUrl() {
|
|
19
|
+
const isPre = API_ORIGIN.includes('animeworkbench-pre') || API_ORIGIN.includes('-pre.');
|
|
20
|
+
return {
|
|
21
|
+
environment: isPre ? 'pre' : 'prod',
|
|
22
|
+
purchaseUrl: isPre ? PURCHASE_URL_PRE : PURCHASE_URL_PROD,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
14
26
|
export const APP_HOME_DIR = process.env.LINGJING_AWB_STATE_DIR || process.env.ANIME_STATE_DIR || path.join(os.homedir(), '.lingjingai', 'awb');
|
|
15
27
|
export const AUTH_PATH = process.env.LINGJING_AWB_AUTH_PATH || process.env.ANIME_AUTH_PATH || path.join(APP_HOME_DIR, 'auth.json');
|
|
16
28
|
export const STATE_PATH = process.env.LINGJING_AWB_STATE_PATH || process.env.ANIME_STATE_PATH || path.join(APP_HOME_DIR, 'state.json');
|
|
@@ -318,11 +330,19 @@ export function guessMimeType(filePath) {
|
|
|
318
330
|
return 'image/png';
|
|
319
331
|
case '.jpg':
|
|
320
332
|
case '.jpeg':
|
|
333
|
+
case '.jfif':
|
|
321
334
|
return 'image/jpeg';
|
|
335
|
+
case '.tif':
|
|
336
|
+
case '.tiff':
|
|
337
|
+
return 'image/tiff';
|
|
322
338
|
case '.webp':
|
|
323
339
|
return 'image/webp';
|
|
324
340
|
case '.gif':
|
|
325
341
|
return 'image/gif';
|
|
342
|
+
case '.heic':
|
|
343
|
+
return 'image/heic';
|
|
344
|
+
case '.heif':
|
|
345
|
+
return 'image/heif';
|
|
326
346
|
case '.mp3':
|
|
327
347
|
return 'audio/mpeg';
|
|
328
348
|
case '.wav':
|