@lingjingai/lj-awb-cli-pre 0.3.15 → 0.3.17

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.
@@ -8,6 +8,7 @@ import {
8
8
  assetGroupList,
9
9
  assetGroupUpdate,
10
10
  assetMatchActor,
11
+ assetReviewModels,
11
12
  assetRegister,
12
13
  creditsBalance,
13
14
  creditsUsageSummary,
@@ -32,6 +33,9 @@ import {
32
33
  subjectList,
33
34
  subjectPublish,
34
35
  subjectPublishBatch,
36
+ subjectVoiceCreate,
37
+ subjectVoiceList,
38
+ subjectVoiceWait,
35
39
  subjectWait,
36
40
  subtitleRemove,
37
41
  subtitleStatus,
@@ -71,6 +75,7 @@ const PROJECT_ID_ARG = { name: 'project-id', valueName: 'projectId', description
71
75
  const PROJECT_GROUP_ARG = { name: 'project-group-no', valueName: 'no', description: '项目组编号;不传时读取当前项目组 / 环境变量 / 本地状态' };
72
76
  const CUSTOM_BIZ_ARG = { name: 'custom-biz-id', valueName: 'id', description: '外部追踪 ID;不传则请求不携带 customBizId' };
73
77
  const MODEL_GROUP_ARG = { name: 'model-group-code', valueName: 'code', description: '模型组编码;创建和参数查询只传这个字段' };
78
+ const ASSET_PLATFORM_ARG = { name: 'platform', valueName: 'platform', description: '素材加白平台,必须显式传 JIMENG 或 BYTEPLUS,不做别名推断' };
74
79
  const MODEL_LIST_ARGS = [
75
80
  { name: 'model', valueName: 'keyword', description: '按模型名、编码、供应商或输入方式过滤;不传时查询全部' },
76
81
  { name: 'limit', valueName: 'n', description: '默认文本最多展示 N 条,默认 8;JSON 输出始终返回全部匹配' },
@@ -396,6 +401,24 @@ export function registerAwbCommands(cli) {
396
401
  func: async (_ctx, kwargs) => listModels('video', kwargs),
397
402
  });
398
403
 
404
+ cli({
405
+ name: 'model asset-review-models',
406
+ description: commandHelp('查询支持素材加白的模型组与平台平铺关系', {
407
+ examples: [
408
+ 'lj-awb model asset-review-models',
409
+ 'lj-awb model asset-review-models --platform JIMENG',
410
+ 'lj-awb model asset-review-models --model-group-code <code>',
411
+ ],
412
+ hint: '该命令只负责发现 modelGroupCode 与 platform 的关系;资产组和素材创建仍通过 create asset-group / create asset 显式传 --platform。',
413
+ }),
414
+ args: [
415
+ MODEL_GROUP_ARG,
416
+ ASSET_PLATFORM_ARG,
417
+ INCLUDE_RAW_ARG,
418
+ ],
419
+ func: async (_ctx, kwargs) => assetReviewModels(kwargs),
420
+ });
421
+
399
422
  cli({
400
423
  name: 'model options',
401
424
  description: commandHelp('查询指定模型支持的 CLI 参数、枚举值、素材约束和条件约束', {
@@ -419,7 +442,7 @@ export function registerAwbCommands(cli) {
419
442
  examples: [
420
443
  'lj-awb model create-spec --model-group-code <code>',
421
444
  ],
422
- hint: '创建前先用 model input-guide 理解统一参数,再用 model options 查具体枚举和素材限制,最后按 create-spec 组装 image create / video create。',
445
+ hint: '创建前先用 model input-guide 理解统一参数,再用 model options 查具体枚举和素材限制,最后按 create-spec 组装 create image / create video。',
423
446
  }),
424
447
  args: [
425
448
  MODEL_GROUP_ARG,
@@ -445,7 +468,8 @@ export function registerAwbCommands(cli) {
445
468
  description: commandHelp('上传本地图片 / 视频 / 音频到平台 COS,并返回 backendPath / URL', {
446
469
  examples: [
447
470
  'lj-awb upload files --files ./a.png,./b.mp4 --dry-run',
448
- 'lj-awb upload files --file ./ref.png --scene-type material-video-create',
471
+ 'lj-awb upload files --file ./ref.png',
472
+ 'lj-awb upload files --file ./first-frame.png --scene-type material-video-create',
449
473
  ],
450
474
  hint: '不会暴露 COS 临时密钥;skill 只使用返回的 backendPath / url。',
451
475
  }),
@@ -453,7 +477,7 @@ export function registerAwbCommands(cli) {
453
477
  { name: 'file', valueName: 'path', description: '单个文件路径' },
454
478
  { name: 'files', valueName: 'paths', description: '多个文件路径,逗号分隔' },
455
479
  { name: 'files-json', valueName: 'path|json', description: '文件数组 JSON 或 JSON 文件路径' },
456
- { name: 'scene-type', valueName: 'scene', description: '上传场景,默认 material-image-edit' },
480
+ { name: 'scene-type', valueName: 'scene', description: '上传场景;未传时图片默认 material-image-draw,音视频默认 material-video-create;图片用于视频 / 主体复用时显式传 material-video-create' },
457
481
  { name: 'project-no', valueName: 'no', description: '可选项目组编号;不传时读取当前项目组 / 环境变量 / 本地状态' },
458
482
  DRY_RUN_ARG,
459
483
  ],
@@ -461,9 +485,9 @@ export function registerAwbCommands(cli) {
461
485
  });
462
486
 
463
487
  cli({
464
- name: 'image fee',
488
+ name: 'create image-fee',
465
489
  description: commandHelp('计算生图预计积分(必须有 --prompt;参考图通过 --resource 传入)', {
466
- examples: ['lj-awb image fee --model-group-code <code> --prompt "一只小狗" --ratio 9:16 --quality 2K'],
490
+ examples: ['lj-awb create image-fee --model-group-code <code> --prompt "一只小狗" --ratio 9:16 --quality 2K'],
467
491
  hint: '估价前先确认 quality、ratio、generate-num 等会影响积分的关键参数。',
468
492
  }),
469
493
  args: [
@@ -481,12 +505,12 @@ export function registerAwbCommands(cli) {
481
505
  });
482
506
 
483
507
  cli({
484
- name: 'image create',
508
+ name: 'create image',
485
509
  description: commandHelp('提交生图任务;正式执行需要 --yes', {
486
510
  examples: [
487
- 'lj-awb image create --model-group-code <code> --prompt "一只小狗" --dry-run',
488
- 'lj-awb image create --model-group-code <code> --prompt "参考图里的角色奔跑" --resource image:reference=./ref.png --project-group-no <no> --yes',
489
- 'lj-awb image create --model-group-code <code> --prompt "产品海报" --resources-json \'[{"type":"image","usage":"reference","source":{"kind":"url","value":"./product.jpg"}}]\' --dry-run',
511
+ 'lj-awb create image --model-group-code <code> --prompt "一只小狗" --dry-run',
512
+ 'lj-awb create image --model-group-code <code> --prompt "参考图里的角色奔跑" --resource image:reference=./ref.png --project-group-no <no> --yes',
513
+ 'lj-awb create image --model-group-code <code> --prompt "产品海报" --resources-json \'[{"type":"image","usage":"reference","source":{"kind":"url","value":"./product.jpg"}}]\' --dry-run',
490
514
  ],
491
515
  }),
492
516
  args: [
@@ -508,11 +532,11 @@ export function registerAwbCommands(cli) {
508
532
  });
509
533
 
510
534
  cli({
511
- name: 'image create-batch',
535
+ name: 'create image-batch',
512
536
  description: commandHelp('批量提交生图任务;输入支持 JSON / JSONL / 纯文本 prompt(每行一条)', {
513
537
  examples: [
514
- 'lj-awb image create-batch --input-file ./prompts.txt --model-group-code <code> --dry-run',
515
- 'lj-awb image create-batch --input-file ./image-input.jsonl --model-group-code <code> --concurrency 3 --yes',
538
+ 'lj-awb create image-batch --input-file ./prompts.txt --model-group-code <code> --dry-run',
539
+ 'lj-awb create image-batch --input-file ./image-input.jsonl --model-group-code <code> --concurrency 3 --yes',
516
540
  ],
517
541
  hint: 'JSON/JSONL 每项只写任务差异字段:prompt、ratio、quality、generate_num、resources、resource、customBizId。',
518
542
  }),
@@ -529,9 +553,9 @@ export function registerAwbCommands(cli) {
529
553
  });
530
554
 
531
555
  cli({
532
- name: 'image status',
556
+ name: 'task image-status',
533
557
  description: commandHelp('查询生图任务状态', {
534
- examples: ['lj-awb image status --task-id <id>'],
558
+ examples: ['lj-awb task image-status --task-id <id>'],
535
559
  }),
536
560
  args: [
537
561
  { name: 'task-id', valueName: 'id', description: '任务 ID' },
@@ -540,9 +564,9 @@ export function registerAwbCommands(cli) {
540
564
  });
541
565
 
542
566
  cli({
543
- name: 'video fee',
567
+ name: 'create video-fee',
544
568
  description: commandHelp('计算生视频预计积分(--prompt / --resource / --resources-json 至少传一个)', {
545
- examples: ['lj-awb video fee --model-group-code <code> --prompt "雨夜奔跑" --duration 5 --quality 720 --ratio 9:16'],
569
+ examples: ['lj-awb create video-fee --model-group-code <code> --prompt "雨夜奔跑" --duration 5 --quality 720 --ratio 9:16'],
546
570
  hint: '估价前先确认 quality、duration、ratio 等会影响积分的关键参数。',
547
571
  }),
548
572
  args: [
@@ -561,13 +585,13 @@ export function registerAwbCommands(cli) {
561
585
  });
562
586
 
563
587
  cli({
564
- name: 'video create',
588
+ name: 'create video',
565
589
  description: commandHelp('提交生视频任务;正式执行需要 --yes', {
566
590
  examples: [
567
- 'lj-awb video create --model-group-code <code> --prompt "雨夜奔跑" --dry-run',
568
- 'lj-awb video create --model-group-code <code> --prompt "镜头推进" --resource image:first_frame=./actor.png --duration 5 --yes',
569
- 'lj-awb video create --model-group-code <code> --prompt "首尾帧过渡" --duration 5 --resources-json \'[{"type":"image","usage":"first_frame","source":{"kind":"url","value":"./first.png"}},{"type":"image","usage":"last_frame","source":{"kind":"url","value":"./last.png"}}]\' --dry-run',
570
- 'lj-awb video create --model-group-code <code> --prompt "让 <<<hero>>> 跟随音乐节奏转身" --resource image:reference:hero=./actor.png --resource audio:reference=./music.mp3 --duration 5 --dry-run',
591
+ 'lj-awb create video --model-group-code <code> --prompt "雨夜奔跑" --dry-run',
592
+ 'lj-awb create video --model-group-code <code> --prompt "镜头推进" --resource image:first_frame=./actor.png --duration 5 --yes',
593
+ 'lj-awb create video --model-group-code <code> --prompt "首尾帧过渡" --duration 5 --resources-json \'[{"type":"image","usage":"first_frame","source":{"kind":"url","value":"./first.png"}},{"type":"image","usage":"last_frame","source":{"kind":"url","value":"./last.png"}}]\' --dry-run',
594
+ 'lj-awb create video --model-group-code <code> --prompt "让 <<<hero>>> 跟随音乐节奏转身" --resource image:reference:hero=./actor.png --resource audio:reference=./music.mp3 --duration 5 --dry-run',
571
595
  ],
572
596
  hint: '--prompt / --resource / --resources-json 至少传一个;fee / --dry-run 之前先确认 quality、duration、ratio 等关键参数。',
573
597
  }),
@@ -591,11 +615,11 @@ export function registerAwbCommands(cli) {
591
615
  });
592
616
 
593
617
  cli({
594
- name: 'video create-batch',
618
+ name: 'create video-batch',
595
619
  description: commandHelp('批量提交生视频任务;输入支持 JSON / JSONL / 纯文本 prompt(每行一条)', {
596
620
  examples: [
597
- 'lj-awb video create-batch --input-file ./prompts.txt --model-group-code <code> --dry-run',
598
- 'lj-awb video create-batch --input-file ./video-input.jsonl --model-group-code <code> --concurrency 2 --yes',
621
+ 'lj-awb create video-batch --input-file ./prompts.txt --model-group-code <code> --dry-run',
622
+ 'lj-awb create video-batch --input-file ./video-input.jsonl --model-group-code <code> --concurrency 2 --yes',
599
623
  ],
600
624
  hint: 'JSON/JSONL 每项只写任务差异字段:prompt、ratio、quality、duration、need_audio、resources、resource、customBizId。',
601
625
  }),
@@ -612,24 +636,24 @@ export function registerAwbCommands(cli) {
612
636
  });
613
637
 
614
638
  cli({
615
- name: 'video status',
639
+ name: 'task video-status',
616
640
  description: commandHelp('查询生视频任务状态', {
617
- examples: ['lj-awb video status --task-id <id>'],
641
+ examples: ['lj-awb task video-status --task-id <id>'],
618
642
  }),
619
643
  args: [{ name: 'task-id', valueName: 'id', description: '任务 ID' }],
620
644
  func: async (_ctx, kwargs) => taskStatus({ ...kwargs, taskType: 'VIDEO_GROUP' }),
621
645
  });
622
646
 
623
647
  cli({
624
- name: 'video subtitle-remove',
625
- description: commandHelp('提交视频去字幕 / 去水印任务', {
626
- examples: ['lj-awb video subtitle-remove --video-url "https://..." --dry-run'],
627
- hint: '该能力走 asset-edit.lingjingai.cn,适合 Seedance 原始结果后处理。',
648
+ name: 'create video-subtitle-removal',
649
+ description: commandHelp('基于 material 来源视频任务提交去字幕任务', {
650
+ examples: ['lj-awb create video-subtitle-removal --source-task-id <videoTaskId> --project-group-no <no> --dry-run'],
651
+ hint: '不再接收视频 URL;material 会根据来源任务读取原始视频、计费、落库和异步处理。',
628
652
  }),
629
653
  args: [
630
- { name: 'video-url', valueName: 'url', description: '待处理视频 URL' },
631
- { name: 'name', valueName: 'name', description: '可选任务名' },
632
- { name: 'callback-url', valueName: 'url', description: '可选回调 URL' },
654
+ { name: 'source-task-id', valueName: 'id', description: '来源视频任务 ID;必须是 material 中已成功的视频任务' },
655
+ PROJECT_GROUP_ARG,
656
+ TASK_RECORD_ARG,
633
657
  DRY_RUN_ARG,
634
658
  YES_ARG,
635
659
  ],
@@ -637,13 +661,13 @@ export function registerAwbCommands(cli) {
637
661
  });
638
662
 
639
663
  cli({
640
- name: 'video subtitle-status',
641
- description: commandHelp('查询去字幕 / 去水印任务状态', {
642
- examples: ['lj-awb video subtitle-status --remote-task-id <id>', 'lj-awb video subtitle-status --public-id <id>'],
664
+ name: 'task video-subtitle-status',
665
+ description: commandHelp('查询 material 去字幕任务状态', {
666
+ examples: ['lj-awb task video-subtitle-status --task-id <subtitleTaskId>'],
643
667
  }),
644
668
  args: [
645
- { name: 'remote-task-id', valueName: 'id', description: '远端任务 ID' },
646
- { name: 'public-id', valueName: 'id', description: '公开任务 ID' },
669
+ { name: 'task-id', valueName: 'id', description: 'material 去字幕任务 ID' },
670
+ PROJECT_GROUP_ARG,
647
671
  ],
648
672
  func: async (_ctx, kwargs) => subtitleStatus(kwargs),
649
673
  });
@@ -706,9 +730,9 @@ export function registerAwbCommands(cli) {
706
730
  });
707
731
 
708
732
  cli({
709
- name: 'asset match-actor',
733
+ name: 'create asset-match-actor',
710
734
  description: commandHelp('按描述和标签匹配平台素材库角色候选', {
711
- examples: ['lj-awb asset match-actor --description "十八岁少女,古风,清冷" --tags-json \'{"gender":"女"}\''],
735
+ examples: ['lj-awb create asset-match-actor --description "十八岁少女,古风,清冷" --tags-json \'{"gender":"女"}\''],
712
736
  }),
713
737
  args: [
714
738
  { name: 'description', valueName: 'text', description: '角色 / 状态描述' },
@@ -721,12 +745,13 @@ export function registerAwbCommands(cli) {
721
745
  });
722
746
 
723
747
  cli({
724
- name: 'asset groups',
748
+ name: 'create asset-groups',
725
749
  description: commandHelp('查询素材组', {
726
- examples: ['lj-awb asset groups --name "女主"'],
750
+ examples: ['lj-awb create asset-groups --platform JIMENG --name "女主"'],
727
751
  }),
728
752
  args: [
729
753
  { name: 'name', valueName: 'keyword', description: '素材组名称关键词' },
754
+ ASSET_PLATFORM_ARG,
730
755
  { name: 'group-ids', valueName: 'ids', description: '素材组 ID,逗号分隔' },
731
756
  { name: 'page-number', valueName: 'n', description: '页码' },
732
757
  { name: 'page-size', valueName: 'n', description: '每页数量' },
@@ -736,25 +761,29 @@ export function registerAwbCommands(cli) {
736
761
  });
737
762
 
738
763
  cli({
739
- name: 'asset group',
764
+ name: 'create asset-group-get',
740
765
  description: commandHelp('查看素材组详情', {
741
- examples: ['lj-awb asset group --group-id <id>'],
766
+ examples: ['lj-awb create asset-group-get --group-id <id> --platform JIMENG'],
742
767
  }),
743
- args: [{ name: 'group-id', valueName: 'id', description: '素材组 ID' }],
768
+ args: [
769
+ { name: 'group-id', valueName: 'id', description: '素材组 ID' },
770
+ ASSET_PLATFORM_ARG,
771
+ ],
744
772
  func: async (_ctx, kwargs) => assetGroupGet(kwargs),
745
773
  });
746
774
 
747
775
  cli({
748
- name: 'asset group-create',
776
+ name: 'create asset-group',
749
777
  description: commandHelp('创建素材组(用于素材注册时作为命名空间)', {
750
778
  examples: [
751
- 'lj-awb asset group-create --name "女主素材组" --dry-run',
752
- 'lj-awb asset group-create --name "女主素材组" --description "用于第二集女主相关素材" --yes',
779
+ 'lj-awb create asset-group --name "女主素材组" --platform JIMENG --dry-run',
780
+ 'lj-awb create asset-group --name "女主素材组" --platform JIMENG --description "用于第二集女主相关素材" --yes',
753
781
  ],
754
782
  }),
755
783
  args: [
756
784
  { name: 'name', valueName: 'name', description: '素材组名称' },
757
785
  { name: 'description', valueName: 'text', description: '素材组描述' },
786
+ ASSET_PLATFORM_ARG,
758
787
  { name: 'project-name', valueName: 'name', description: '项目名,默认 default' },
759
788
  DRY_RUN_ARG,
760
789
  YES_ARG,
@@ -763,14 +792,15 @@ export function registerAwbCommands(cli) {
763
792
  });
764
793
 
765
794
  cli({
766
- name: 'asset group-update',
795
+ name: 'create asset-group-update',
767
796
  description: commandHelp('更新素材组名称 / 描述', {
768
- examples: ['lj-awb asset group-update --group-id <id> --name "新名称" --dry-run'],
797
+ examples: ['lj-awb create asset-group-update --group-id <id> --platform JIMENG --name "新名称" --dry-run'],
769
798
  }),
770
799
  args: [
771
800
  { name: 'group-id', valueName: 'id', description: '素材组 ID' },
772
801
  { name: 'name', valueName: 'name', description: '新名称' },
773
802
  { name: 'description', valueName: 'text', description: '新描述' },
803
+ ASSET_PLATFORM_ARG,
774
804
  { name: 'project-name', valueName: 'name', description: '项目名' },
775
805
  DRY_RUN_ARG,
776
806
  YES_ARG,
@@ -779,9 +809,9 @@ export function registerAwbCommands(cli) {
779
809
  });
780
810
 
781
811
  cli({
782
- name: 'asset register',
812
+ name: 'create asset',
783
813
  description: commandHelp('把 COS 路径 / URL / 本地文件注册成平台素材', {
784
- examples: ['lj-awb asset register --group-id <id> --url "material/upload/a.png" --name "女主正面" --dry-run'],
814
+ examples: ['lj-awb create asset --group-id <id> --platform JIMENG --url "asset-review/upload/a.png" --name "女主正面" --dry-run'],
785
815
  }),
786
816
  args: [
787
817
  { name: 'group-id', valueName: 'id', description: '素材组 ID' },
@@ -789,7 +819,7 @@ export function registerAwbCommands(cli) {
789
819
  { name: 'file', valueName: 'path', description: '本地素材文件;会先上传' },
790
820
  { name: 'url', valueName: 'url', description: '素材 URL 或 COS 路径' },
791
821
  { name: 'backend-path', valueName: 'path', description: 'upload files 返回的 backendPath' },
792
- { name: 'platform', valueName: 'platform', description: '可选平台字段' },
822
+ ASSET_PLATFORM_ARG,
793
823
  DRY_RUN_ARG,
794
824
  YES_ARG,
795
825
  ],
@@ -1253,9 +1283,9 @@ export function registerAwbCommands(cli) {
1253
1283
  }
1254
1284
 
1255
1285
  cli({
1256
- name: 'subject list',
1286
+ name: 'create subject-list',
1257
1287
  description: commandHelp('查询可用于视频主体参考的元素 / 主体', {
1258
- examples: ['lj-awb subject list --name "女主"'],
1288
+ examples: ['lj-awb create subject-list --name "女主"'],
1259
1289
  }),
1260
1290
  args: [
1261
1291
  { name: 'name', valueName: 'keyword', description: '主体名称关键词' },
@@ -1267,18 +1297,18 @@ export function registerAwbCommands(cli) {
1267
1297
  });
1268
1298
 
1269
1299
  cli({
1270
- name: 'subject publish',
1271
- description: commandHelp('创建平台主体 element,用于 KeLing / 可灵 视频主体参考', {
1300
+ name: 'create subject',
1301
+ description: commandHelp('创建平台主体 element,用于 KeLing / 可灵 和 Vidu 视频主体参考', {
1272
1302
  examples: [
1273
- 'lj-awb subject publish --name 女主 --resource primary:./three-view.png --dry-run',
1274
- 'lj-awb subject publish --name 女主 --resource primary:material/assets/a.png --resource face:./face.png --yes',
1303
+ 'lj-awb create subject --model-code tx --name 女主 --resource primary:./three-view.png --dry-run',
1304
+ 'lj-awb create subject --model-code vidu --name 女主 --resource primary:material/assets/a.png --resource face:./face.png --yes',
1275
1305
  ],
1276
- hint: '参考图 slot:primary | three-view | face | side | back。无 primary 时 three-view 自动升为主图;本地路径(./ 或绝对路径)会自动上传,含 :// 或 material/ 前缀的视为已上传 URL。',
1306
+ hint: '参考图 slot:primary | three-view | face | side | back。主体 modelCode 只接受 tx / vidu:KeLing / 可灵主体明确传 tx,Vidu 主体明确传 vidu。无 primary 时 three-view 自动升为主图;本地路径(./ 或绝对路径)会自动上传,含 :// 或 material/ 前缀的视为已上传 URL。',
1277
1307
  }),
1278
1308
  args: [
1279
1309
  { name: 'name', valueName: 'name', description: '主体名称' },
1280
1310
  { name: 'description', valueName: 'text', description: '主体描述' },
1281
- { name: 'model-code', valueName: 'code', description: '主体创建模型编码,可选' },
1311
+ { name: 'model-code', valueName: 'code', description: '主体创建模型编码,仅 tx / vidu;KeLing / 可灵传 tx,Vidu 传 vidu' },
1282
1312
  { name: 'reference-type', valueName: 'type', description: '参考类型,默认 image_refer' },
1283
1313
  { name: 'voice-id', valueName: 'id', description: '参考音色 ID,可选' },
1284
1314
  { name: 'tags-json', valueName: 'json', description: '标签数组,例如 [{"tagId":"o_102"}]' },
@@ -1290,27 +1320,77 @@ export function registerAwbCommands(cli) {
1290
1320
  });
1291
1321
 
1292
1322
  cli({
1293
- name: 'subject wait',
1323
+ name: 'create subject-wait',
1294
1324
  description: commandHelp('等待主体 externalId 回填,用于后续视频主体参考', {
1295
- examples: ['lj-awb subject wait --element-id <elementId> --wait-seconds 300'],
1325
+ examples: ['lj-awb create subject-wait --element-id <elementId> --wait-seconds 300'],
1296
1326
  }),
1297
1327
  args: [
1298
- { name: 'element-id', valueName: 'id', description: 'subject publish 返回的 elementId' },
1328
+ { name: 'element-id', valueName: 'id', description: 'create subject 返回的 elementId' },
1299
1329
  ...SUBJECT_WAIT_ARGS,
1300
1330
  ],
1301
1331
  func: async (_ctx, kwargs) => subjectWait(kwargs),
1302
1332
  });
1303
1333
 
1304
1334
  cli({
1305
- name: 'subject publish-batch',
1335
+ name: 'create subject-voice-list',
1336
+ description: commandHelp('查询主体创建可引用的自定义音色', {
1337
+ examples: ['lj-awb create subject-voice-list --name "女主"'],
1338
+ }),
1339
+ args: [
1340
+ { name: 'name', valueName: 'keyword', description: '音色名称关键词' },
1341
+ { name: 'page-number', valueName: 'n', description: '页码' },
1342
+ { name: 'page-size', valueName: 'n', description: '每页数量' },
1343
+ INCLUDE_RAW_ARG,
1344
+ ],
1345
+ func: async (_ctx, kwargs) => subjectVoiceList(kwargs),
1346
+ });
1347
+
1348
+ cli({
1349
+ name: 'create subject-voice',
1350
+ description: commandHelp('创建主体自定义音色,成功后 externalId 可作为 create subject --voice-id', {
1351
+ examples: [
1352
+ 'lj-awb create subject-voice --name 女主音色 --file ./voice.mp3 --dry-run',
1353
+ 'lj-awb create subject-voice --name 女主音色 --voice-url material/video-create/audio.mp3 --yes',
1354
+ ],
1355
+ hint: '音色来源三选一:--file 本地音频会先上传;--voice-url/--audio-url 使用已上传 material 路径,外部 HTTP URL 会先转存上传;--video-id 使用已有视频 ID。',
1356
+ }),
1357
+ args: [
1358
+ { name: 'name', valueName: 'name', description: '音色名称' },
1359
+ { name: 'file', valueName: 'path', description: '本地音频文件,创建前自动上传' },
1360
+ { name: 'voice-url', valueName: 'url', description: '已上传的 material 音频路径或 COS URL' },
1361
+ { name: 'audio-url', valueName: 'url', description: '同 --voice-url,兼容音频命名' },
1362
+ { name: 'video-id', valueName: 'id', description: '已有视频 ID;与 --file / --voice-url 二选一' },
1363
+ { name: 'req-task-id', valueName: 'id', description: '可选外部追踪 ID' },
1364
+ DRY_RUN_ARG,
1365
+ YES_ARG,
1366
+ ],
1367
+ func: async (_ctx, kwargs) => subjectVoiceCreate(kwargs),
1368
+ });
1369
+
1370
+ cli({
1371
+ name: 'create subject-voice-wait',
1372
+ description: commandHelp('等待主体音色 externalId 回填,用于 create subject --voice-id', {
1373
+ examples: ['lj-awb create subject-voice-wait --voice-record-id <voiceRecordId> --wait-seconds 300'],
1374
+ }),
1375
+ args: [
1376
+ { name: 'voice-record-id', valueName: 'id', description: 'create subject-voice 返回的 voiceRecordId' },
1377
+ { name: 'req-task-id', valueName: 'id', description: '兼容 material getVoiceByReqTaskId 的 reqTaskId' },
1378
+ ...SUBJECT_WAIT_ARGS,
1379
+ ],
1380
+ func: async (_ctx, kwargs) => subjectVoiceWait(kwargs),
1381
+ });
1382
+
1383
+ cli({
1384
+ name: 'create subject-batch',
1306
1385
  description: commandHelp('批量发布主体资产;输入支持 JSON 数组文件或 JSONL(每行一条)', {
1307
1386
  examples: [
1308
- 'lj-awb subject publish-batch --input-file ./subjects.jsonl --dry-run',
1309
- 'lj-awb subject publish-batch --input-file ./subjects.json --concurrency 2 --yes',
1387
+ 'lj-awb create subject-batch --model-code tx --input-file ./subjects.jsonl --dry-run',
1388
+ 'lj-awb create subject-batch --model-code vidu --input-file ./subjects.json --concurrency 2 --yes',
1310
1389
  ],
1311
1390
  }),
1312
1391
  args: [
1313
1392
  { name: 'input-file', valueName: 'path', description: '批量输入文件' },
1393
+ { name: 'model-code', valueName: 'code', description: '默认主体创建模型编码,仅 tx / vidu;单条可覆盖' },
1314
1394
  { name: 'project-name', valueName: 'name', description: '默认项目名' },
1315
1395
  { name: 'concurrency', valueName: 'n', description: '并发数,默认 1' },
1316
1396
  DRY_RUN_ARG,
@@ -21,7 +21,8 @@ export const TASK_UPLOAD_SCENE = {
21
21
  VIDEO_CREATE: 'material-video-create',
22
22
  VIDEO_GROUP: 'material-video-create',
23
23
  SUBJECT: 'material-video-create',
24
- DEFAULT: 'material-image-edit',
24
+ ASSET_REVIEW: 'asset-review',
25
+ DEFAULT: 'material-image-draw',
25
26
  };
26
27
  export const TERMINAL_TASK_STATES = new Set([
27
28
  'SUCCESS',