Prefer source images for MSR analysis

This commit is contained in:
OpenClaw Agent
2026-07-10 11:36:38 +00:00
parent b059974544
commit 2da1de2f6d

View File

@@ -27,12 +27,9 @@ function coercePreviewUrl(value) {
return ""; return "";
} }
function resolvePreviewUrlFromOrigin(originNode) { function resolveFileWidgetUrlFromOrigin(originNode) {
if (!originNode) return ""; if (!originNode) return "";
const preview = Array.isArray(originNode.imgs) ? coercePreviewUrl(originNode.imgs[0]) : "";
if (preview) return preview;
const widgets = originNode.widgets || []; const widgets = originNode.widgets || [];
const fileWidget = widgets.find((widget) => ["image", "filename", "file"].includes(widget.name)); const fileWidget = widgets.find((widget) => ["image", "filename", "file"].includes(widget.name));
const subfolderWidget = widgets.find((widget) => widget.name === "subfolder"); const subfolderWidget = widgets.find((widget) => widget.name === "subfolder");
@@ -45,22 +42,47 @@ function resolvePreviewUrlFromOrigin(originNode) {
); );
} }
function resolvePreviewUrlFromOrigin(originNode) {
if (!originNode) return "";
const preview = Array.isArray(originNode.imgs) ? coercePreviewUrl(originNode.imgs[0]) : "";
return preview || "";
}
function resolveCandidateImageUrls(originNode) {
const urls = [];
const fileUrl = resolveFileWidgetUrlFromOrigin(originNode);
const previewUrl = resolvePreviewUrlFromOrigin(originNode);
if (fileUrl) urls.push(fileUrl);
if (previewUrl && previewUrl !== fileUrl) urls.push(previewUrl);
return urls;
}
async function imageInputToDataUrl(node, inputName) { async function imageInputToDataUrl(node, inputName) {
const originNode = getOriginNodeForInput(node, inputName); const originNode = getOriginNodeForInput(node, inputName);
const previewUrl = resolvePreviewUrlFromOrigin(originNode); const candidateUrls = resolveCandidateImageUrls(originNode);
if (!previewUrl) return null; if (!candidateUrls.length) return null;
try {
const response = await fetch(previewUrl); for (const imageUrl of candidateUrls) {
const blob = await response.blob(); try {
return await new Promise((resolve) => { const response = await fetch(imageUrl);
const reader = new FileReader(); if (!response.ok) {
reader.onloadend = () => resolve(reader.result); throw new Error(`HTTP ${response.status}`);
reader.readAsDataURL(blob); }
}); const blob = await response.blob();
} catch (error) { if (!blob.type.startsWith("image/")) {
console.error("[MSRCharacter] Failed to load preview image", error); throw new Error(`Unexpected blob type: ${blob.type || "unknown"}`);
return null; }
return await new Promise((resolve) => {
const reader = new FileReader();
reader.onloadend = () => resolve(reader.result);
reader.readAsDataURL(blob);
});
} catch (error) {
console.warn("[MSRCharacter] Failed candidate image source", imageUrl, error);
}
} }
return null;
} }
function setWidgetValue(node, widget, value) { function setWidgetValue(node, widget, value) {
@@ -120,7 +142,11 @@ function refreshCharacterPreview(node) {
const inputNames = ["image_1", "image_2"]; const inputNames = ["image_1", "image_2"];
const previewUrls = inputNames const previewUrls = inputNames
.map((inputName) => resolvePreviewUrlFromOrigin(getOriginNodeForInput(node, inputName))) .map((inputName) => {
const originNode = getOriginNodeForInput(node, inputName);
const candidates = resolveCandidateImageUrls(originNode);
return candidates[0] || "";
})
.filter(Boolean); .filter(Boolean);
const previewRow = node._msrPreviewRow; const previewRow = node._msrPreviewRow;