@coralai/sps-cli 0.65.74 → 0.65.76
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/dist/commands/artCommand.d.ts.map +1 -1
- package/dist/commands/artCommand.js +13 -3
- package/dist/commands/artCommand.js.map +1 -1
- package/dist/console/index.d.ts.map +1 -1
- package/dist/console/index.js +8 -0
- package/dist/console/index.js.map +1 -1
- package/dist/console/lib/artPaths.d.ts +29 -0
- package/dist/console/lib/artPaths.d.ts.map +1 -0
- package/dist/console/lib/artPaths.js +170 -0
- package/dist/console/lib/artPaths.js.map +1 -0
- package/dist/console/lib/artRunRequest.d.ts +46 -0
- package/dist/console/lib/artRunRequest.d.ts.map +1 -0
- package/dist/console/lib/artRunRequest.js +107 -0
- package/dist/console/lib/artRunRequest.js.map +1 -0
- package/dist/console/routes/art.d.ts +3 -0
- package/dist/console/routes/art.d.ts.map +1 -0
- package/dist/console/routes/art.js +355 -0
- package/dist/console/routes/art.js.map +1 -0
- package/dist/console/routes/artPipeline.d.ts +15 -0
- package/dist/console/routes/artPipeline.d.ts.map +1 -0
- package/dist/console/routes/artPipeline.js +83 -0
- package/dist/console/routes/artPipeline.js.map +1 -0
- package/dist/core/art/artConcurrency.d.ts +63 -0
- package/dist/core/art/artConcurrency.d.ts.map +1 -0
- package/dist/core/art/artConcurrency.js +63 -0
- package/dist/core/art/artConcurrency.js.map +1 -0
- package/dist/core/art/artRunLauncher.d.ts +6 -0
- package/dist/core/art/artRunLauncher.d.ts.map +1 -0
- package/dist/core/art/artRunLauncher.js +91 -0
- package/dist/core/art/artRunLauncher.js.map +1 -0
- package/dist/core/art/artRunService.d.ts +102 -0
- package/dist/core/art/artRunService.d.ts.map +1 -0
- package/dist/core/art/artRunService.js +181 -0
- package/dist/core/art/artRunService.js.map +1 -0
- package/dist/core/art/assetLocator.d.ts +33 -0
- package/dist/core/art/assetLocator.d.ts.map +1 -0
- package/dist/core/art/assetLocator.js +61 -0
- package/dist/core/art/assetLocator.js.map +1 -0
- package/dist/providers/art/artDriver.d.ts +71 -0
- package/dist/providers/art/artDriver.d.ts.map +1 -0
- package/dist/providers/art/artDriver.js +119 -0
- package/dist/providers/art/artDriver.js.map +1 -0
- package/dist/providers/art/artEvents.d.ts +23 -0
- package/dist/providers/art/artEvents.d.ts.map +1 -0
- package/dist/providers/art/artEvents.js +40 -0
- package/dist/providers/art/artEvents.js.map +1 -0
- package/dist/providers/art/artGen.d.ts +253 -0
- package/dist/providers/art/artGen.d.ts.map +1 -0
- package/dist/providers/art/artGen.js +1263 -0
- package/dist/providers/art/artGen.js.map +1 -0
- package/dist/providers/art/artPrompt.d.ts +42 -0
- package/dist/providers/art/artPrompt.d.ts.map +1 -0
- package/dist/providers/art/artPrompt.js +41 -0
- package/dist/providers/art/artPrompt.js.map +1 -0
- package/dist/providers/art/artRunChild.d.ts +3 -0
- package/dist/providers/art/artRunChild.d.ts.map +1 -0
- package/dist/providers/art/artRunChild.js +127 -0
- package/dist/providers/art/artRunChild.js.map +1 -0
- package/dist/providers/art/atomicWrite.d.ts +16 -0
- package/dist/providers/art/atomicWrite.d.ts.map +1 -0
- package/dist/providers/art/atomicWrite.js +62 -0
- package/dist/providers/art/atomicWrite.js.map +1 -0
- package/dist/providers/art/cancelMarker.d.ts +9 -0
- package/dist/providers/art/cancelMarker.d.ts.map +1 -0
- package/dist/providers/art/cancelMarker.js +60 -0
- package/dist/providers/art/cancelMarker.js.map +1 -0
- package/dist/providers/art/composeAsset.d.ts +52 -0
- package/dist/providers/art/composeAsset.d.ts.map +1 -0
- package/dist/providers/art/composeAsset.js +73 -0
- package/dist/providers/art/composeAsset.js.map +1 -0
- package/dist/providers/art/imageSize.d.ts +31 -0
- package/dist/providers/art/imageSize.d.ts.map +1 -0
- package/dist/providers/art/imageSize.js +92 -0
- package/dist/providers/art/imageSize.js.map +1 -0
- package/dist/providers/art/jobContext.d.ts +25 -0
- package/dist/providers/art/jobContext.d.ts.map +1 -0
- package/dist/providers/art/jobContext.js +5 -0
- package/dist/providers/art/jobContext.js.map +1 -0
- package/dist/providers/art/rateLimitRetry.d.ts +25 -0
- package/dist/providers/art/rateLimitRetry.d.ts.map +1 -0
- package/dist/providers/art/rateLimitRetry.js +40 -0
- package/dist/providers/art/rateLimitRetry.js.map +1 -0
- package/dist/providers/art/uiKit.d.ts +61 -0
- package/dist/providers/art/uiKit.d.ts.map +1 -0
- package/dist/providers/art/uiKit.js +331 -0
- package/dist/providers/art/uiKit.js.map +1 -0
- package/dist/providers/art/visionJudge.d.ts +26 -0
- package/dist/providers/art/visionJudge.d.ts.map +1 -0
- package/dist/providers/art/visionJudge.js +127 -0
- package/dist/providers/art/visionJudge.js.map +1 -0
- package/dist/providers/art/withinDir.d.ts +2 -0
- package/dist/providers/art/withinDir.d.ts.map +1 -0
- package/dist/providers/art/withinDir.js +19 -0
- package/dist/providers/art/withinDir.js.map +1 -0
- package/dist/providers/media/gatewayMediaProviders.d.ts +58 -0
- package/dist/providers/media/gatewayMediaProviders.d.ts.map +1 -0
- package/dist/providers/media/gatewayMediaProviders.js +46 -0
- package/dist/providers/media/gatewayMediaProviders.js.map +1 -0
- package/dist/providers/media/generateAsset.d.ts +9 -0
- package/dist/providers/media/generateAsset.d.ts.map +1 -1
- package/dist/providers/media/generateAsset.js +7 -1
- package/dist/providers/media/generateAsset.js.map +1 -1
- package/dist/providers/media/mediaProviders.d.ts +31 -1
- package/dist/providers/media/mediaProviders.d.ts.map +1 -1
- package/dist/providers/media/mediaProviders.js +33 -1
- package/dist/providers/media/mediaProviders.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/art/composeAsset
|
|
3
|
+
* @description 原图 → 成品的**抠图决策树**(批④)。由 studio `imageGen.ts:1086-1104` 移交。
|
|
4
|
+
* @layer provider
|
|
5
|
+
* @boundedContext art
|
|
6
|
+
*
|
|
7
|
+
* 结构上它是新的(studio 那边这段长在 `generateImage` 里,而那 1791 行的 provider 适配**不搬**);
|
|
8
|
+
* **行为上它必须逐字一致** —— 下面每个条件、每个阈值、每个 catch 都是一次事故的化石。
|
|
9
|
+
*
|
|
10
|
+
* ══════════════════════════════════════════════════════════════════════════
|
|
11
|
+
* 🔴 **这段唯一的网是它自己的决策树测试。**
|
|
12
|
+
* 上次美术链移交时建的一致性测试测的是**单个算子**(chromaKey 出来的像素一样吗)——
|
|
13
|
+
* **它不测这个组合**。决策树走错分支时,**每个算子仍然是"算得对的"**,
|
|
14
|
+
* 于是产物变差而所有算子级检查全绿。
|
|
15
|
+
* ══════════════════════════════════════════════════════════════════════════
|
|
16
|
+
*/
|
|
17
|
+
/** 生产实现:走 sps 已有算子(上次移交时全部拿到,不需要再搬)。 */
|
|
18
|
+
export async function defaultPixelOps() {
|
|
19
|
+
const m = await import('./pixels.js');
|
|
20
|
+
return {
|
|
21
|
+
alreadyTransparent: m.alreadyTransparent,
|
|
22
|
+
chromaKey: (b) => m.chromaKey(b),
|
|
23
|
+
magentaResidue: m.magentaResidue,
|
|
24
|
+
rembgRemove: m.rembgRemove,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 抠图:原图 → 成品。`transparent` 未开 → **原样返回**。
|
|
29
|
+
*
|
|
30
|
+
* 决策树(顺序与嵌套**不许动**):
|
|
31
|
+
* ```
|
|
32
|
+
* ① 模型已输出真透明(原生 RGBA) → 跳过抠图
|
|
33
|
+
* ② 否则色键:chromaKey(提示词已强制洋红底)
|
|
34
|
+
* ③ 色键后仍不透明 **且** 品红残留 > 0.005 → 退回 rembg 语义兜底
|
|
35
|
+
* ```
|
|
36
|
+
*
|
|
37
|
+
* 🔴 **③ 的判据必须是「品红残留量」,不能是「四角透明」**:
|
|
38
|
+
* 前景条带类资产(`fg_near` 草丛贴满下缘)下角天然不透明 —— 按四角判会把**抠干净的图误判失败**,
|
|
39
|
+
* 于是 rembg 把"一排草丛"当背景整体吞掉、只留语义主体
|
|
40
|
+
* (像素跑酷 `fg_near` 只剩一根蕨叶的事故)。
|
|
41
|
+
*
|
|
42
|
+
* 🔴 **rembg 喂的是「原图」不是色键结果** —— 两条是**互斥备选**,不是串联工序。
|
|
43
|
+
*
|
|
44
|
+
* 🔴 **失败一律保守**:
|
|
45
|
+
* - 整段抛错 → 返回**原图**(抠不动也不能毁掉产物)
|
|
46
|
+
* - rembg 不可用 → 用**色键结果**
|
|
47
|
+
* - `magentaResidue` 读图失败时**返回 1**(在 `pixels.ts` 里)→ 判定为"有残留" → **走 rembg**
|
|
48
|
+
* ⚠️ 这个保守取向是算子给的,组合层不要"顺手加一个 try 把它变成不走"。
|
|
49
|
+
*/
|
|
50
|
+
export async function composeAsset(raw, opts, ops) {
|
|
51
|
+
if (!opts.transparent)
|
|
52
|
+
return raw;
|
|
53
|
+
let buf = raw;
|
|
54
|
+
try {
|
|
55
|
+
if (!(await ops.alreadyTransparent(buf))) {
|
|
56
|
+
let keyed = await ops.chromaKey(buf);
|
|
57
|
+
if (!(await ops.alreadyTransparent(keyed)) && (await ops.magentaResidue(keyed)) > 0.005) {
|
|
58
|
+
try {
|
|
59
|
+
keyed = await ops.rembgRemove(buf); // 🔴 原图,不是 keyed
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
/* rembg 不可用 → 用色键结果 */
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
buf = keyed;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
/* 抠图失败/服务不可用:保留原图 */
|
|
70
|
+
}
|
|
71
|
+
return buf;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=composeAsset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"composeAsset.js","sourceRoot":"","sources":["../../../src/providers/art/composeAsset.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,wCAAwC;AACxC,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;IACtC,OAAO;QACL,kBAAkB,EAAE,CAAC,CAAC,kBAAkB;QACxC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QAChC,cAAc,EAAE,CAAC,CAAC,cAAc;QAChC,WAAW,EAAE,CAAC,CAAC,WAAW;KAC3B,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,GAAW,EACX,IAA+B,EAC/B,GAAa;IAEb,IAAI,CAAC,IAAI,CAAC,WAAW;QAAE,OAAO,GAAG,CAAC;IAClC,IAAI,GAAG,GAAG,GAAG,CAAC;IACd,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACzC,IAAI,KAAK,GAAG,MAAM,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACrC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC;gBACxF,IAAI,CAAC;oBACH,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB;gBACvD,CAAC;gBAAC,MAAM,CAAC;oBACP,uBAAuB;gBACzB,CAAC;YACH,CAAC;YACD,GAAG,GAAG,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,qBAAqB;IACvB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** 解析 "WxH"/"W*H" → {w,h};失败返 null。 */
|
|
2
|
+
export declare function parseSize(size?: unknown): {
|
|
3
|
+
w: number;
|
|
4
|
+
h: number;
|
|
5
|
+
} | null;
|
|
6
|
+
/** 计算"生成尺寸":模型多有下限(百炼总像素 ≥589824,wan2.6 要 1280²),游戏 sprite 又常很小 →
|
|
7
|
+
* 用满足各家下限的尺寸(取 1280² 兼顾 wan2.6)出图,保持目标宽高比、/8 取整;之后再缩放到目标。 */
|
|
8
|
+
export declare function genSizeFor(target: {
|
|
9
|
+
w: number;
|
|
10
|
+
h: number;
|
|
11
|
+
}): {
|
|
12
|
+
w: number;
|
|
13
|
+
h: number;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* 按 buffer 的**真实格式**压缩文件体积,保持原格式(不转格式)。sharp 底层 libvips 内置同一批算法:
|
|
17
|
+
* - PNG → `libimagequant` 调色板量化(= pngquant 同库,有损降到 ≤256 色;扁平卡通无感,alpha 保留)
|
|
18
|
+
* - JPEG → `mozjpeg`
|
|
19
|
+
* - WebP → `libwebp`
|
|
20
|
+
* - 其它/未知格式:不瞎压,仅在需要 resize 时重编码,否则原样返回。
|
|
21
|
+
* 可选 `resize`:与压缩合并成**同一次(也是最后一次)编码**,零额外开销。
|
|
22
|
+
* 任何失败都回退原 buffer——压缩是优化,不该让生成流程崩。
|
|
23
|
+
*/
|
|
24
|
+
export declare function compressKeepFormat(buf: Buffer, opts?: {
|
|
25
|
+
resize?: {
|
|
26
|
+
w: number;
|
|
27
|
+
h: number;
|
|
28
|
+
};
|
|
29
|
+
quality?: number;
|
|
30
|
+
}): Promise<Buffer>;
|
|
31
|
+
//# sourceMappingURL=imageSize.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageSize.d.ts","sourceRoot":"","sources":["../../../src/providers/art/imageSize.ts"],"names":[],"mappings":"AA8BA,uCAAuC;AACvC,wBAAgB,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAWzE;AAED;8DAC8D;AAC9D,wBAAgB,UAAU,CAAC,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAcrF;AAED;;;;;;;;GAQG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D,OAAO,CAAC,MAAM,CAAC,CAmBjB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/art/imageSize
|
|
3
|
+
* @description 生成尺寸策略 + 最后一次编码(缩放/压缩)。由 studio `imageGen.ts:382/982/1007` 移交。
|
|
4
|
+
* @layer provider
|
|
5
|
+
* @boundedContext art
|
|
6
|
+
*
|
|
7
|
+
* ══════════════════════════════════════════════════════════════════════════
|
|
8
|
+
* 🔴 **接缝地图里没有这一段 —— 它是接线时才露头的。**
|
|
9
|
+
*
|
|
10
|
+
* 接缝表把 `generateImage` 整条记成"provider 适配,换成 media 层的 `generateAsset`"。
|
|
11
|
+
* 但真读那 40 行会发现它是**三件事**叠在一起:
|
|
12
|
+
* ```
|
|
13
|
+
* ① provider 适配 + 限流重试 → media 层已有(generateAsset)
|
|
14
|
+
* ② 抠图决策树 → 已搬(composeAsset,批④)
|
|
15
|
+
* ③ **生成尺寸放大 → 出图后缩回目标** → 就是本文件,谁都没认领
|
|
16
|
+
* ```
|
|
17
|
+
* ③ 不是 provider 的事:模型各有像素下限(百炼 ≥589824、wan2.6 要 1280²),而游戏 sprite
|
|
18
|
+
* 常常只有 128px —— 直接按 `a.size` 去要图,**小图要么被拒、要么出一张糊的**;
|
|
19
|
+
* 而"出大图再缩回目标"正是 `a.size` 这个字段今天唯一被兑现的地方
|
|
20
|
+
* (`finalizeAsset` 的 downscale 按 `logical`/type 档,**不看 `a.size`**;
|
|
21
|
+
* 背景的 1536x1024 画幅契约就落在这条路上)。
|
|
22
|
+
*
|
|
23
|
+
* ⚠️ 丢掉它的症状:**图照样出得来** —— 只是尺寸不对、体积大一档。
|
|
24
|
+
* 没有报错,没有测试会红。所以它必须跟着搬,而不是"顺手简化掉"。
|
|
25
|
+
*
|
|
26
|
+
* 🔴 **按只读件对待**:三个函数从 studio 机械抽取,一字未改。
|
|
27
|
+
* ══════════════════════════════════════════════════════════════════════════
|
|
28
|
+
*/
|
|
29
|
+
import sharp from 'sharp';
|
|
30
|
+
/** 解析 "WxH"/"W*H" → {w,h};失败返 null。 */
|
|
31
|
+
export function parseSize(size) {
|
|
32
|
+
// 容错:size 可能是 "WxH" 字符串,也可能是 {width,height} 对象(设计师/工厂 manifest 两种写法都有);
|
|
33
|
+
// 非字符串绝不能直接 .match(会抛、连累整局美术全失败)。
|
|
34
|
+
if (size && typeof size === 'object') {
|
|
35
|
+
const o = size;
|
|
36
|
+
const w = Number(o.width ?? o.w);
|
|
37
|
+
const h = Number(o.height ?? o.h);
|
|
38
|
+
return Number.isFinite(w) && Number.isFinite(h) && w > 0 && h > 0 ? { w, h } : null;
|
|
39
|
+
}
|
|
40
|
+
const m = (typeof size === 'string' ? size : '').match(/^(\d+)\s*[x*]\s*(\d+)$/i);
|
|
41
|
+
return m ? { w: Number(m[1]), h: Number(m[2]) } : null;
|
|
42
|
+
}
|
|
43
|
+
/** 计算"生成尺寸":模型多有下限(百炼总像素 ≥589824,wan2.6 要 1280²),游戏 sprite 又常很小 →
|
|
44
|
+
* 用满足各家下限的尺寸(取 1280² 兼顾 wan2.6)出图,保持目标宽高比、/8 取整;之后再缩放到目标。 */
|
|
45
|
+
export function genSizeFor(target) {
|
|
46
|
+
const MIN_PX = 1638400; // 1280²(兼顾 wan2.6 下限)
|
|
47
|
+
const MAX_PX = 4_000_000;
|
|
48
|
+
const MAX_AR = 4; // 百炼要求宽高比 ∈ [1:4, 4:1] → 生成尺寸的比例钳到这个范围(目标更极端则最终缩放阶段拉伸)
|
|
49
|
+
const ar = Math.min(MAX_AR, Math.max(1 / MAX_AR, target.w / target.h));
|
|
50
|
+
const px = Math.min(MAX_PX, Math.max(MIN_PX, target.w * target.h));
|
|
51
|
+
let h = Math.sqrt(px / ar);
|
|
52
|
+
let w = h * ar;
|
|
53
|
+
// 单边上限 2048(MiniMax 等要求每边 ≤2048;宽幅 UI 如按钮/面板会超)→ 等比缩到边界内。
|
|
54
|
+
const DIM_MAX = 2048;
|
|
55
|
+
const over = Math.max(w / DIM_MAX, h / DIM_MAX, 1);
|
|
56
|
+
w /= over;
|
|
57
|
+
h /= over;
|
|
58
|
+
const r8 = (n) => Math.max(64, Math.round(n / 8) * 8);
|
|
59
|
+
return { w: r8(w), h: r8(h) };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 按 buffer 的**真实格式**压缩文件体积,保持原格式(不转格式)。sharp 底层 libvips 内置同一批算法:
|
|
63
|
+
* - PNG → `libimagequant` 调色板量化(= pngquant 同库,有损降到 ≤256 色;扁平卡通无感,alpha 保留)
|
|
64
|
+
* - JPEG → `mozjpeg`
|
|
65
|
+
* - WebP → `libwebp`
|
|
66
|
+
* - 其它/未知格式:不瞎压,仅在需要 resize 时重编码,否则原样返回。
|
|
67
|
+
* 可选 `resize`:与压缩合并成**同一次(也是最后一次)编码**,零额外开销。
|
|
68
|
+
* 任何失败都回退原 buffer——压缩是优化,不该让生成流程崩。
|
|
69
|
+
*/
|
|
70
|
+
export async function compressKeepFormat(buf, opts) {
|
|
71
|
+
const q = opts?.quality ?? 80;
|
|
72
|
+
try {
|
|
73
|
+
const meta = await sharp(buf).metadata();
|
|
74
|
+
let img = sharp(buf);
|
|
75
|
+
if (opts?.resize)
|
|
76
|
+
img = img.resize(opts.resize.w, opts.resize.h, { fit: 'fill' });
|
|
77
|
+
switch (meta.format) {
|
|
78
|
+
case 'png':
|
|
79
|
+
return await img.png({ palette: true, quality: q, effort: 8, compressionLevel: 9 }).toBuffer(); // alpha 保留(alphaQuality 默认 100)
|
|
80
|
+
case 'jpeg':
|
|
81
|
+
return await img.jpeg({ quality: q, mozjpeg: true }).toBuffer();
|
|
82
|
+
case 'webp':
|
|
83
|
+
return await img.webp({ quality: q }).toBuffer();
|
|
84
|
+
default:
|
|
85
|
+
return opts?.resize ? await img.toBuffer() : buf; // 其它格式:只在需要 resize 时重编码,否则原样
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
return buf;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=imageSize.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imageSize.js","sourceRoot":"","sources":["../../../src/providers/art/imageSize.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/art/jobContext
|
|
3
|
+
* @description 计量归因上下文 —— **sps 侧显式空实现**。
|
|
4
|
+
* @layer provider
|
|
5
|
+
* @boundedContext art
|
|
6
|
+
*
|
|
7
|
+
* 🔴 **故意是空的,而且故意留着这个函数。**
|
|
8
|
+
*
|
|
9
|
+
* studio 侧 `runWithJob` 用 AsyncLocalStorage 把 `{jobId, projectId}` 传给下游,
|
|
10
|
+
* 供它把用量写进**自己的**台账(`usage_records`)。sps 不记那本账 ——
|
|
11
|
+
* 计量随**网关 token** 走(token 里已带归因),这是设计定的边界。
|
|
12
|
+
*
|
|
13
|
+
* ⚠️ 那为什么不直接把调用点删掉?因为**删掉之后就看不出这里曾经有一个归因上下文**。
|
|
14
|
+
* 留一个显式空实现 + 这段注释,下一个接计量的人会在**正确的位置**看到它;
|
|
15
|
+
* 删掉的话他要重新发现"归因该在哪注入"。
|
|
16
|
+
* **"这里什么都不做"和"这里没有东西"是两回事,而代码默认表达后者。**
|
|
17
|
+
*/
|
|
18
|
+
export interface JobContext {
|
|
19
|
+
/** per-attempt,给计量归因;🔴 与 projectId 是两个概念,不可互推。 */
|
|
20
|
+
jobId: string;
|
|
21
|
+
projectId: string;
|
|
22
|
+
}
|
|
23
|
+
/** 直接执行 fn。归因经网关 token 传递,sps 不维护 ALS 上下文。 */
|
|
24
|
+
export declare function runWithJob<T>(_ctx: JobContext, fn: () => T): T;
|
|
25
|
+
//# sourceMappingURL=jobContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobContext.d.ts","sourceRoot":"","sources":["../../../src/providers/art/jobContext.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,UAAU;IACzB,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,8CAA8C;AAC9C,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAE9D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jobContext.js","sourceRoot":"","sources":["../../../src/providers/art/jobContext.ts"],"names":[],"mappings":"AAuBA,8CAA8C;AAC9C,MAAM,UAAU,UAAU,CAAI,IAAgB,EAAE,EAAW;IACzD,OAAO,EAAE,EAAE,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/art/rateLimitRetry
|
|
3
|
+
* @description 单次生成调用内的**限流退让**。由 studio `imageGen.ts:1033` 移交(一字未改)。
|
|
4
|
+
* @layer provider
|
|
5
|
+
* @boundedContext art
|
|
6
|
+
*
|
|
7
|
+
* ══════════════════════════════════════════════════════════════════════════
|
|
8
|
+
* 🔴 **它和 `genOne` 的外层重试不是一回事 —— 两层治的是两件事。**
|
|
9
|
+
* ```
|
|
10
|
+
* 本文件 单次调用内的**限流退让**:只认 429/限流,等一等就过去了
|
|
11
|
+
* genOne 外层 **供应商级**重试 + 换家:什么错都算一次,5 次用完就换下一家
|
|
12
|
+
* ```
|
|
13
|
+
* 丢掉这层的后果不是"重试次数少了",而是:
|
|
14
|
+
* **限流从"等一等就过去"变成了"消耗一次供应商配额"** —— 更快走到换家那一步。
|
|
15
|
+
* 而换家的代价 studio 那条注释写死过:
|
|
16
|
+
* > 星际防线事故:20 单张 → codex 限流 → **回退差供应商**
|
|
17
|
+
*
|
|
18
|
+
* ⚠️ 所以不是限流的错误**立刻抛**(别浪费时间在必然失败的重试上),
|
|
19
|
+
* 这也正是它能安全套在外层里面的原因:两层不会互相放大。
|
|
20
|
+
* ══════════════════════════════════════════════════════════════════════════
|
|
21
|
+
*/
|
|
22
|
+
/** 限流退避重试:遇 429 / 频率限制时指数退避重试(火山等账号级 QPS 限流常见,尤其并发生图;
|
|
23
|
+
* 3D 概念图也走这条 generateImage,所以一并受益)。非限流错误直接抛、不浪费时间。 */
|
|
24
|
+
export declare function withRateLimitRetry<T>(fn: () => Promise<T>): Promise<T>;
|
|
25
|
+
//# sourceMappingURL=rateLimitRetry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimitRetry.d.ts","sourceRoot":"","sources":["../../../src/providers/art/rateLimitRetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;uDACuD;AACvD,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAa5E"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module providers/art/rateLimitRetry
|
|
3
|
+
* @description 单次生成调用内的**限流退让**。由 studio `imageGen.ts:1033` 移交(一字未改)。
|
|
4
|
+
* @layer provider
|
|
5
|
+
* @boundedContext art
|
|
6
|
+
*
|
|
7
|
+
* ══════════════════════════════════════════════════════════════════════════
|
|
8
|
+
* 🔴 **它和 `genOne` 的外层重试不是一回事 —— 两层治的是两件事。**
|
|
9
|
+
* ```
|
|
10
|
+
* 本文件 单次调用内的**限流退让**:只认 429/限流,等一等就过去了
|
|
11
|
+
* genOne 外层 **供应商级**重试 + 换家:什么错都算一次,5 次用完就换下一家
|
|
12
|
+
* ```
|
|
13
|
+
* 丢掉这层的后果不是"重试次数少了",而是:
|
|
14
|
+
* **限流从"等一等就过去"变成了"消耗一次供应商配额"** —— 更快走到换家那一步。
|
|
15
|
+
* 而换家的代价 studio 那条注释写死过:
|
|
16
|
+
* > 星际防线事故:20 单张 → codex 限流 → **回退差供应商**
|
|
17
|
+
*
|
|
18
|
+
* ⚠️ 所以不是限流的错误**立刻抛**(别浪费时间在必然失败的重试上),
|
|
19
|
+
* 这也正是它能安全套在外层里面的原因:两层不会互相放大。
|
|
20
|
+
* ══════════════════════════════════════════════════════════════════════════
|
|
21
|
+
*/
|
|
22
|
+
/** 限流退避重试:遇 429 / 频率限制时指数退避重试(火山等账号级 QPS 限流常见,尤其并发生图;
|
|
23
|
+
* 3D 概念图也走这条 generateImage,所以一并受益)。非限流错误直接抛、不浪费时间。 */
|
|
24
|
+
export async function withRateLimitRetry(fn) {
|
|
25
|
+
const MAX = 4;
|
|
26
|
+
for (let attempt = 0;; attempt++) {
|
|
27
|
+
try {
|
|
28
|
+
return await fn();
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
32
|
+
const isRate = /\b429\b|rate.?limit|too\s*frequent|频繁|AccountRateLimitExceeded|RequestThrottled|限流|QPS/i.test(msg);
|
|
33
|
+
if (!isRate || attempt >= MAX)
|
|
34
|
+
throw e;
|
|
35
|
+
// 退避(含抖动,错开并发请求):≈1.5s / 3.3s / 6.6s / 13s
|
|
36
|
+
await new Promise((r) => setTimeout(r, Math.round(2 ** attempt * 1500 + Math.random() * 800)));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=rateLimitRetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimitRetry.js","sourceRoot":"","sources":["../../../src/providers/art/rateLimitRetry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH;uDACuD;AACvD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAI,EAAoB;IAC9D,MAAM,GAAG,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,yFAAyF,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnH,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,GAAG;gBAAE,MAAM,CAAC,CAAC;YACvC,2CAA2C;YAC3C,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;QACjG,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export interface UiKitFrame {
|
|
2
|
+
name: string;
|
|
3
|
+
label: string;
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
w: number;
|
|
7
|
+
h: number;
|
|
8
|
+
}
|
|
9
|
+
export declare const UI_KIT_CANVAS: {
|
|
10
|
+
w: number;
|
|
11
|
+
h: number;
|
|
12
|
+
};
|
|
13
|
+
export declare const UI_INSET = 12;
|
|
14
|
+
export declare const UI_BAR: {
|
|
15
|
+
frameW: number;
|
|
16
|
+
frameH: number;
|
|
17
|
+
inset: number;
|
|
18
|
+
border: number;
|
|
19
|
+
fillRectW: number;
|
|
20
|
+
fillRectH: number;
|
|
21
|
+
fillW: number;
|
|
22
|
+
fillH: number;
|
|
23
|
+
};
|
|
24
|
+
export declare const UI_KIT_FRAMES: UiKitFrame[];
|
|
25
|
+
/** 渲染灰阶块面原型(参考图 + 占位资产双用途)。确定性:同版本契约逐像素一致。
|
|
26
|
+
* v1.1:所有控件在契约矩形内统一内缩 UI_INSET 绘制——图生图的风格装饰(外描边/贴纸边/发光)
|
|
27
|
+
* 会贴着原轮廓外扩,零边距时必溢出矩形、切分即被硬切(合成大西瓜局白色贴纸边全切平的事故)。 */
|
|
28
|
+
export declare function renderUiWireframe(): Promise<Buffer>;
|
|
29
|
+
export declare function contentFitFrames(png: Buffer): Promise<{
|
|
30
|
+
name: string;
|
|
31
|
+
x: number;
|
|
32
|
+
y: number;
|
|
33
|
+
w: number;
|
|
34
|
+
h: number;
|
|
35
|
+
}[]>;
|
|
36
|
+
/**
|
|
37
|
+
* 裁切重组(v1.3,用户定案):bbox 逐帧裁出 → 按契约 4 行紧凑重排成新图集。
|
|
38
|
+
* ① atlas 尺寸 = 实际内容尺寸(帧名/语义仍固定);② 挤掉画布里的大片空隙(1536×1024 → 紧凑)。
|
|
39
|
+
* 行分组按标称 y(行1 按钮/行2 圆钮/行3 面板血条/行4 图标),行内左起排、GAP 间隔。
|
|
40
|
+
*/
|
|
41
|
+
export declare const UIKIT_STRUCTURE_BROKEN = "uikit-structure-broken";
|
|
42
|
+
/**
|
|
43
|
+
* v1.5 切割改【连通域 + 名义位置命名】(位置锚定窗口切分退役):
|
|
44
|
+
* - 连通域保证控件整块切出,永不夹断(风格画多大都完整);
|
|
45
|
+
* - 语义命名靠契约名义中心:含住该中心的组件 = 该帧主体(纯边缘切割给不了名字,位置才是语义源);
|
|
46
|
+
* - 结构失守确定性识破:一个组件含住 ≥2 个名义中心(自由排版的大控件横跨多位)或 >3 帧无主体 → 拒切上抛。
|
|
47
|
+
* - 帧内容框 = 主体 bbox ∪ 搜索窗内的小卫星组件(音量弧线/装饰星点这类离体笔画)。
|
|
48
|
+
*/
|
|
49
|
+
export declare function fitAndRepackUiKit(png: Buffer): Promise<{
|
|
50
|
+
buf: Buffer;
|
|
51
|
+
frames: {
|
|
52
|
+
name: string;
|
|
53
|
+
x: number;
|
|
54
|
+
y: number;
|
|
55
|
+
w: number;
|
|
56
|
+
h: number;
|
|
57
|
+
}[];
|
|
58
|
+
}>;
|
|
59
|
+
/** 图生图 prompt(结构靠参考图,这里只点名控件语义 + 注入风格;绝不描述布局)。 */
|
|
60
|
+
export declare function uiKitPrompt(style?: string): string;
|
|
61
|
+
//# sourceMappingURL=uiKit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uiKit.d.ts","sourceRoot":"","sources":["../../../src/providers/art/uiKit.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;CAC5C;AAGD,eAAO,MAAM,aAAa;;;CAAuB,CAAC;AAKlD,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,eAAO,MAAM,MAAM;;;;;;;;;CAAgH,CAAC;AAGpI,eAAO,MAAM,aAAa,EAAE,UAAU,EAyBrC,CAAC;AA8CF;;oDAEoD;AACpD,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAmBzD;AAuCD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAoB3H;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAsC/D;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,CAAC,CA8DrJ;AAED,kDAAkD;AAClD,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAQlD"}
|