fix(media,canvas): 对象存储参考素材优先 URL,并同步清理图片引用提示词 (#434)
* fix(media): 对象存储参考素材 - 协议支持 URL 时优先发送签名链接 开启对象存储后,支持 URL 的上游协议优先发送 OSS/COS/七牛/S3 签名链接;必须传字节的协议仍走 Base64 或 multipart。本地资源回退字节,签发失败直接报错,不自动重发生成。 * fix(canvas): 图片引用清理 - 取消引用时同步移除提示词引用
This commit is contained in:
@@ -93,4 +93,16 @@ describe("canvas node generation position mentions", () => {
|
||||
expect(context.prompt).toBe("让 @图片1 进入画面");
|
||||
expect(context.prompt).not.toContain("@[node:");
|
||||
});
|
||||
|
||||
test("取消引用后的提示词不再因为悬挂 @图片1 阻断生成", () => {
|
||||
const target = targetNode();
|
||||
const image = node("image-a", CanvasNodeType.Image, "data:image/png;base64,a");
|
||||
const { applyCanvasConnectionPromptSync } = require("../src/lib/canvas/canvas-resource-references") as typeof import("../src/lib/canvas/canvas-resource-references");
|
||||
const [nextTarget] = applyCanvasConnectionPromptSync([image, target], [connection(image.id)], [image, target], []).filter((item: typeof target) => item.id === target.id);
|
||||
const context = buildNodeGenerationContext(nextTarget.id, [image, nextTarget], [], nextTarget.metadata?.composerContent || "", []);
|
||||
|
||||
expect(nextTarget.metadata?.composerContent).toBe("让 进入画面");
|
||||
expect(context.referenceImages).toEqual([]);
|
||||
expect(context.prompt).toBe("让 进入画面");
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
|
||||
import { buildAssetMentionReferences, buildCanvasNodeMentionReferenceMap, buildNodeMentionReferences, buildOrderedCanvasResourceReferences, canvasResourceMentionToken, collectUpstreamVideoNodes } from "../src/lib/canvas/canvas-resource-references";
|
||||
import { applyCanvasConnectionPromptSync, buildAssetMentionReferences, buildCanvasNodeMentionReferenceMap, buildNodeMentionReferences, buildOrderedCanvasResourceReferences, canvasResourceMentionToken, collectUpstreamVideoNodes } from "../src/lib/canvas/canvas-resource-references";
|
||||
import { canvasNodeToAsset } from "../src/lib/canvas/canvas-node-asset";
|
||||
import { buildNodeGenerationInputs } from "../src/components/canvas/canvas-node-generation";
|
||||
import { CanvasNodeType, type CanvasConnection, type CanvasNodeData } from "../src/types/canvas";
|
||||
@@ -205,3 +205,45 @@ describe("canvas resource mention slots", () => {
|
||||
})).toBe("@[asset:asset-a]");
|
||||
});
|
||||
});
|
||||
|
||||
describe("remove canvas resource mention tokens", () => {
|
||||
test("取消引用后会清掉对应的 @图片N", () => {
|
||||
const image = imageNode("image-a");
|
||||
const target = {
|
||||
...videoNode("target"),
|
||||
metadata: { composerContent: "@图片1 生成角色设定图:保持同一角色身份。" },
|
||||
};
|
||||
const previousConnections = [connection(image.id, target.id)];
|
||||
const [nextTarget] = applyCanvasConnectionPromptSync([image, target], previousConnections, [image, target], []).filter((node) => node.id === target.id);
|
||||
|
||||
expect(nextTarget.metadata?.composerContent).toBe("生成角色设定图:保持同一角色身份。");
|
||||
expect(nextTarget.metadata?.composerContent).not.toContain("@图片1");
|
||||
});
|
||||
|
||||
test("同时存在节点 token 时一并清掉", () => {
|
||||
const image = imageNode("image-a");
|
||||
const target = {
|
||||
...videoNode("target"),
|
||||
metadata: { composerContent: "让 @图片1 和 @[node:image-a] 一起进入画面" },
|
||||
};
|
||||
const [nextTarget] = applyCanvasConnectionPromptSync([image, target], [connection(image.id, target.id)], [image, target], []).filter((node) => node.id === target.id);
|
||||
expect(nextTarget.metadata?.composerContent).toBe("让 和 一起进入画面");
|
||||
expect(nextTarget.metadata?.composerContent).not.toContain("@图片1");
|
||||
expect(nextTarget.metadata?.composerContent).not.toContain("@[node:image-a]");
|
||||
});
|
||||
|
||||
test("多图时只清被移除的那张,并把剩余引用重新编号", () => {
|
||||
const imageA = imageNode("image-a");
|
||||
const imageB = imageNode("image-b");
|
||||
const target = {
|
||||
...videoNode("target"),
|
||||
metadata: { composerContent: "比较 @图片1 和 @图片2" },
|
||||
};
|
||||
const previousConnections = [connection(imageA.id, target.id), connection(imageB.id, target.id)];
|
||||
const nextConnections = [connection(imageB.id, target.id)];
|
||||
const [nextTarget] = applyCanvasConnectionPromptSync([imageA, imageB, target], previousConnections, [imageA, imageB, target], nextConnections).filter((node) => node.id === target.id);
|
||||
|
||||
expect(nextTarget.metadata?.composerContent).toBe("比较 和 @图片1");
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user