maoda-commander-tt 0.0.51 → 0.0.52

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 CHANGED
@@ -331,7 +331,7 @@ tt ai image '画一片绿色树叶'
331
331
 
332
332
  # 统一参考图入口;提示词按传入顺序使用图1、图2
333
333
  tt ai image --images ./composition.png --images ./palette.png \
334
- --aspect-ratio 16:9 --resolution 2K --model-id gpt_image_2 --effort low \
334
+ --aspect-ratio 16:9 --model-id gpt_image_2 \
335
335
  '使用图1的构图和图2的配色'
336
336
 
337
337
  # 一次调用等待并保存;也可仅用 --wait 返回归档图片路径
@@ -355,6 +355,13 @@ XYQ 的 `status` / `--wait` 会在 `outputs[]` 返回
355
355
  写入生成上下文,XYQ 实现先上传图片,再把对应 `pippitAssetId` 按顺序放进
356
356
  `pippit_asset_ids` 槽位。因此切换 source 时调用命令和“图1/图2”提示词都不用变化。
357
357
  旧的“直接把绝对路径写进提示词”仍只作为本地实现的兼容用法。
358
+ 两种实现都提供 2K 图片,无需在 prompt 中声明分辨率。XYQ 推理强度默认
359
+ `medium`,通常无需设置 `--effort`。支持的比例为 `21:9`、`16:9`、`3:2`、
360
+ `4:3`、`1:1`、`3:4`、`2:3`、`9:16` 和 `auto`。XYQ 未设置时默认 `16:9`;
361
+ 非 XYQ 未设置时不追加比例。修图时使用
362
+ `--aspect-ratio auto`,无需在 prompt 重复比例;需要枚举外的特殊比例时使用
363
+ `auto`,并在 prompt 中描述目标比例。非 XYQ 实现会把显式设置的具体比例加入生成
364
+ 上下文,`auto` 不追加。
358
365
  `--quiet` 关闭提交进度;stdout 始终只有一个最终 JSON envelope。
359
366
 
360
367
  本地任务记录默认位于 `~/.tt/ai/image-tasks`,可用 `TT_AI_IMAGE_TASKS_DIR` 指定持久目录。
@@ -369,7 +376,7 @@ XYQ 的 `status` / `--wait` 会在 `outputs[]` 返回
369
376
  能接回同一次远端生成。Codex 会话会保留,便于后续诊断。
370
377
 
371
378
  迁移旧调用:`tt ai image '...'` 若需要直接拿文件,改为
372
- `tt ai image --wait '...'`,读取 `data.outputs[0].localPath`,不再读取旧 `imagePath`。
379
+ `tt ai image --output ./result.png '...'`,读取 `data.outputs[0].localPath`,不再读取旧 `imagePath`。
373
380
  外部 `generate` 技能中依赖同步行为的命令也需在升级 tt 时加 `--wait`。
374
381
 
375
382
  ## AI 音频生成
@@ -2094,8 +2094,8 @@ function normalizeImageInput(input) {
2094
2094
  imageCount,
2095
2095
  model: normalizeString2(input.model) ?? "gpt_image_2",
2096
2096
  aspectRatio: normalizeString2(input.aspectRatio) ?? "16:9",
2097
- resolution: normalizeString2(input.resolution) ?? "2K",
2098
- effort: normalizeString2(input.effort) ?? "low"
2097
+ resolution: "2K",
2098
+ effort: normalizeString2(input.effort) ?? "medium"
2099
2099
  });
2100
2100
  }
2101
2101
  function buildSubmitImageBody(input) {
@@ -3635,10 +3635,7 @@ function buildLocalImagePrompt(input) {
3635
3635
  (filePath, index) => `\u56FE${index + 1}: ${JSON.stringify(path7.resolve(filePath))}`
3636
3636
  );
3637
3637
  const constraints = [
3638
- input.aspectRatio ? `\u5BBD\u9AD8\u6BD4: ${input.aspectRatio}` : void 0,
3639
- input.resolution ? `\u5206\u8FA8\u7387: ${input.resolution}` : void 0,
3640
- input.modelId ? `\u4F18\u5148\u6A21\u578B: ${input.modelId}` : void 0,
3641
- input.effort ? `\u751F\u6210\u5F3A\u5EA6: ${input.effort}` : void 0
3638
+ input.aspectRatio && input.aspectRatio !== "auto" ? `\u5BBD\u9AD8\u6BD4: ${input.aspectRatio}` : void 0
3642
3639
  ].filter((value) => value !== void 0);
3643
3640
  return [
3644
3641
  input.prompt,
@@ -3688,7 +3685,6 @@ var XyqImageTaskService = class {
3688
3685
  imageCount: 1,
3689
3686
  model: request.modelId,
3690
3687
  aspectRatio: request.aspectRatio,
3691
- resolution: request.resolution,
3692
3688
  effort: request.effort
3693
3689
  });
3694
3690
  if (!submit.ok) return submit;
@@ -3999,6 +3995,17 @@ var AiImageWaitCommand = class extends BaseCommand {
3999
3995
  };
4000
3996
 
4001
3997
  // src/commands/ai/ai-image-command.ts
3998
+ var IMAGE_ASPECT_RATIOS = [
3999
+ "21:9",
4000
+ "16:9",
4001
+ "3:2",
4002
+ "4:3",
4003
+ "1:1",
4004
+ "3:4",
4005
+ "2:3",
4006
+ "9:16",
4007
+ "auto"
4008
+ ];
4002
4009
  var AiImageCommand = class extends BaseCommandGroup {
4003
4010
  constructor(_service = createDefaultImageTaskService()) {
4004
4011
  super();
@@ -4018,10 +4025,11 @@ var AiImageCommand = class extends BaseCommandGroup {
4018
4025
  cmd.addOption(
4019
4026
  new Option6("--images <path>", "\u53C2\u8003\u56FE\u7247\u8DEF\u5F84\uFF0C\u53EF\u91CD\u590D\uFF1B\u63D0\u793A\u8BCD\u4F7F\u7528\u201C\u56FE1\u3001\u56FE2\u201D\u6307\u4EE3").argParser(appendImagePath).default([])
4020
4027
  );
4021
- cmd.addOption(new Option6("--aspect-ratio <ratio>", "\u56FE\u7247\u5BBD\u9AD8\u6BD4\uFF1BXYQ \u9ED8\u8BA4 16:9"));
4022
- cmd.addOption(new Option6("--resolution <resolution>", "\u56FE\u7247\u5206\u8FA8\u7387\uFF1BXYQ \u9ED8\u8BA4 2K"));
4028
+ cmd.addOption(
4029
+ new Option6("--aspect-ratio <ratio>", `\u56FE\u7247\u5BBD\u9AD8\u6BD4\uFF0C\u53EF\u9009 ${IMAGE_ASPECT_RATIOS.join("\u3001")}\uFF1BXYQ \u9ED8\u8BA4 16:9`)
4030
+ );
4023
4031
  cmd.addOption(new Option6("--model-id <model-id>", "\u56FE\u7247\u6A21\u578B\uFF1BXYQ \u9ED8\u8BA4 gpt_image_2"));
4024
- cmd.addOption(new Option6("--effort <effort>", "\u56FE\u7247\u751F\u6210\u5F3A\u5EA6\uFF1BXYQ \u9ED8\u8BA4 low"));
4032
+ cmd.addOption(new Option6("--effort <effort>", "XYQ \u63A8\u7406\u5F3A\u5EA6\uFF0C\u9ED8\u8BA4 medium\uFF0C\u901A\u5E38\u65E0\u9700\u8BBE\u7F6E"));
4025
4033
  cmd.addOption(new Option6("--wait", "\u63D0\u4EA4\u540E\u7EE7\u7EED\u7B49\u5F85\u56FE\u7247\u751F\u6210\u5B8C\u6210").default(false));
4026
4034
  cmd.addOption(new Option6("--quiet", "\u5173\u95ED\u63D0\u4EA4\u9636\u6BB5\u7684 stderr \u8FDB\u5EA6\u4E0E\u5FC3\u8DF3").default(false));
4027
4035
  cmd.addOption(new Option6("--timeout-seconds <seconds>", `\u6700\u591A\u7B49\u5F85\u79D2\u6570\uFF0C\u8303\u56F4 1-${MAX_IMAGE_WAIT_SECONDS}`).argParser(Number).default(DEFAULT_IMAGE_WAIT_SECONDS));
@@ -4033,18 +4041,20 @@ var AiImageCommand = class extends BaseCommandGroup {
4033
4041
  this._addSubcommand(new AiImageListCommand(this._service));
4034
4042
  }
4035
4043
  _helpExample() {
4036
- return "tt ai image '\u753B\u4E00\u7247\u7EFF\u8272\u6811\u53F6'\n tt ai image --images ./ref.png --output ./result.png '\u53C2\u8003\u56FE1\u7684\u6784\u56FE'\n tt ai image wait --task-id '<task-id>' --output ./result.png";
4044
+ return "tt ai image '\u753B\u4E00\u7247\u7EFF\u8272\u6811\u53F6'\n tt ai image --images ./ref.png --aspect-ratio auto --output ./result.png '\u628A\u56FE1\u4E2D\u7684\u5929\u7A7A\u6539\u4E3A\u665A\u971E'\n tt ai image wait --task-id '<task-id>' --output ./result.png";
4037
4045
  }
4038
4046
  _agentContract() {
4039
4047
  return [
4040
4048
  "data \u5FC5\u9009\u5B57\u6BB5: taskId:string\u3001state:string\u3001outputs:Array\uFF1B\u53EF\u9009\u5B57\u6BB5\uFF08?\uFF09: source?:local|xyq\u3001createdAt?:string\u3001updatedAt?:string\u3001retryAfterSeconds?:number\u3001timedOut?:true\u3001failReason?:string\u3001nextCommand?:string\u3002",
4041
4049
  "imagegen.source \u7CBE\u786E\u4E3A xyq\uFF08\u5FFD\u7565\u5927\u5C0F\u5199\u4E0E\u9996\u5C3E\u7A7A\u683C\uFF09\u65F6\u8D70 XYQ HTTP\uFF1B\u672A\u914D\u7F6E\u3001\u5176\u4ED6\u503C\u6216\u8BBE\u7F6E\u8BFB\u53D6\u5931\u8D25\u65F6\u4FDD\u6301\u672C\u5730\u5B9E\u73B0\u3002taskId \u4E3A local-image:<uuid> \u6216 xyq-image:<threadId>\u3002",
4042
4050
  "\u53C2\u8003\u56FE\u7EDF\u4E00\u901A\u8FC7\u53EF\u91CD\u590D --images \u4F20\u5165\uFF0C\u63D0\u793A\u8BCD\u4EE5\u56FE1\u3001\u56FE2\u6307\u4EE3\uFF1BXYQ \u4F1A\u5148\u4E0A\u4F20\u518D\u5199\u5165 pippit_asset_ids\uFF0C\u672C\u5730\u5B9E\u73B0\u4F1A\u628A\u6709\u5E8F\u7EDD\u5BF9\u8DEF\u5F84\u52A0\u5165\u751F\u6210\u4E0A\u4E0B\u6587\u3002",
4051
+ "\u4E24\u79CD\u5B9E\u73B0\u90FD\u63D0\u4F9B 2K \u56FE\u7247\uFF0C\u65E0\u9700\u5728 prompt \u4E2D\u58F0\u660E\u5206\u8FA8\u7387\u3002--effort \u4EC5\u7528\u4E8E XYQ\uFF0C\u9ED8\u8BA4 medium\uFF0C\u901A\u5E38\u65E0\u9700\u8BBE\u7F6E\u3002",
4052
+ `--aspect-ratio \u652F\u6301 ${IMAGE_ASPECT_RATIOS.join("\u3001")}\uFF1BXYQ \u672A\u8BBE\u7F6E\u65F6\u9ED8\u8BA4 16:9\uFF0C\u975E XYQ \u672A\u8BBE\u7F6E\u65F6\u4E0D\u8FFD\u52A0\u6BD4\u4F8B\u3002\u4FEE\u56FE\u65F6\u4F7F\u7528 auto\uFF0C\u65E0\u9700\u5728 prompt \u91CD\u590D\u6BD4\u4F8B\uFF1B\u9700\u8981\u679A\u4E3E\u5916\u7684\u7279\u6B8A\u6BD4\u4F8B\u65F6\u4F7F\u7528 auto\uFF0C\u5E76\u5728 prompt \u4E2D\u63CF\u8FF0\u76EE\u6807\u6BD4\u4F8B\u3002\u975E XYQ \u5B9E\u73B0\u4F1A\u628A\u663E\u5F0F\u8BBE\u7F6E\u7684\u5177\u4F53\u6BD4\u4F8B\u52A0\u5165\u672C\u5730\u751F\u6210\u4E0A\u4E0B\u6587\uFF0Cauto \u4E0D\u8FFD\u52A0\u3002`,
4043
4053
  "state \u679A\u4E3E: submitted/working/completed/failed/unknown\u3002code=0 \u53EA\u8868\u793A\u547D\u4EE4\u6210\u529F\u8FD4\u56DE\u7ED3\u679C\uFF0C\u751F\u6210\u662F\u5426\u6210\u529F\u987B\u68C0\u67E5 state\u3002",
4044
4054
  "outputs \u65E0\u53EF\u7528\u56FE\u7247\u65F6\u4E3A []\uFF1B\u672C\u5730\u5B8C\u6210\u65F6 localPath \u662F\u56FE\u7247\u7EDD\u5BF9\u8DEF\u5F84\uFF1BXYQ \u67E5\u8BE2\u53EF\u8FD4\u56DE remoteUrl\u3001assetId\u3001pippitAssetId\u3001width\u3001height\u3001name\uFF0C\u53EA\u6709 --output \u4F1A\u4E0B\u8F7D\u8FDC\u7AEF\u4EA7\u7269\u5E76\u8865\u5145 localPath\u3002",
4045
4055
  "createdAt/updatedAt \u662F\u4EFB\u52A1\u8BB0\u5F55\u521B\u5EFA/\u6700\u540E\u5199\u5165\u65F6\u95F4\uFF08ISO 8601 UTC\uFF09\uFF0C\u4E0D\u662F\u672C\u6B21\u67E5\u8BE2\u65F6\u95F4\uFF1Bsubmitted/working \u53EF\u8FD4\u56DE retryAfterSeconds\uFF0C\u5355\u4F4D\u79D2\uFF1Bfailed/unknown \u53EF\u8FD4\u56DE failReason\u3002",
4046
4056
  "nextCommand \u5728 submitted/working \u65F6\u4E3A wait \u547D\u4EE4\uFF08\u4FDD\u7559\u672C\u6B21 --output\uFF09\uFF0Cunknown \u65F6\u4E3A status \u547D\u4EE4\uFF0Ccompleted/failed \u65F6\u7701\u7565\u3002",
4047
- "\u9ED8\u8BA4\u5148\u4FDD\u5B58\u8BB0\u5F55\u5E76\u542F\u52A8\u540E\u53F0\u8FDB\u7A0B\u540E\u8FD4\u56DE\uFF1B--wait \u6216 --output \u7B49\u5F85\u540C\u4E00\u4EFB\u52A1\uFF0C\u4EC5\u7B49\u5F85\u8D85\u65F6\u65F6\u8FD4\u56DE timedOut=true\uFF0C\u540E\u53F0\u4EFB\u52A1\u7EE7\u7EED\u8FD0\u884C\u3002",
4057
+ "\u9ED8\u8BA4\u5728\u5F53\u524D provider \u63A5\u53D7\u4EFB\u52A1\u540E\u8FD4\u56DE\uFF1B--wait \u6216 --output \u7B49\u5F85\u540C\u4E00\u4EFB\u52A1\uFF0C\u4EC5\u7B49\u5F85\u8D85\u65F6\u65F6\u8FD4\u56DE timedOut=true\uFF0C\u4EFB\u52A1\u7EE7\u7EED\u8FD0\u884C\u3002",
4048
4058
  'data \u793A\u4F8B\uFF08\u7701\u7565\u90E8\u5206\u53EF\u9009\u5B57\u6BB5\uFF09: {"taskId":"local-image:00000000-0000-4000-8000-000000000001","state":"working","outputs":[],"retryAfterSeconds":1,"nextCommand":"tt ai image wait --task-id local-image:00000000-0000-4000-8000-000000000001"}',
4049
4059
  '\u547D\u4EE4\u5931\u8D25\u65F6 error.stage \u6807\u8BB0 input/submit/wait\uFF1B\u672C\u5730\u63D0\u4EA4\u5931\u8D25\u7ED9\u51FA nextCommand="tt ai image list"\uFF0CXYQ \u63D0\u4EA4\u5931\u8D25\u4E0D\u4F2A\u9020\u53EF\u6062\u590D taskId\uFF1B\u7B49\u5F85\u6216\u4FDD\u5B58\u5931\u8D25\u9644 taskId\u3001recoverable:true\u3001\u4FDD\u7559 --output \u7684 nextCommand\u3002',
4050
4060
  "status/wait \u6309 taskId \u524D\u7F00\u81EA\u52A8\u9009\u62E9\u539F provider\uFF0C\u4E0D\u53D7\u5F53\u524D imagegen.source \u5F71\u54CD\uFF1Blist \u53EA\u5217\u672C\u673A local-image \u8BB0\u5F55\u3002",
@@ -4055,6 +4065,9 @@ var AiImageCommand = class extends BaseCommandGroup {
4055
4065
  const prompt = joinTextArgs(ctx.args);
4056
4066
  if (!prompt) return fail(1, "\u8BF7\u8F93\u5165\u751F\u56FE\u63D0\u793A\u8BCD", { stage: "input" });
4057
4067
  const options = ctx.options;
4068
+ if (options.aspectRatio && !IMAGE_ASPECT_RATIOS.includes(options.aspectRatio)) {
4069
+ return fail(1, `--aspect-ratio \u5FC5\u987B\u662F ${IMAGE_ASPECT_RATIOS.join("\u3001")} \u4E4B\u4E00`, { stage: "input" });
4070
+ }
4058
4071
  const validation = validateImageWaitOptions(options.timeoutSeconds, options.output);
4059
4072
  if (!validation.ok) return validation;
4060
4073
  const outputPath = options.output === void 0 ? void 0 : path10.resolve(options.output.trim());
@@ -4071,7 +4084,6 @@ var AiImageCommand = class extends BaseCommandGroup {
4071
4084
  prompt,
4072
4085
  imagePaths: options.images,
4073
4086
  aspectRatio: options.aspectRatio,
4074
- resolution: options.resolution,
4075
4087
  modelId: options.modelId,
4076
4088
  effort: options.effort
4077
4089
  });
@@ -8621,4 +8633,4 @@ export {
8621
8633
  ToolCommand,
8622
8634
  createRootCommands
8623
8635
  };
8624
- //# sourceMappingURL=chunk-EQ6SKTNQ.js.map
8636
+ //# sourceMappingURL=chunk-ED7FLAXM.js.map