import {dataUrl} from './images.mjs'; const escape = (value) => String(value).replace(/[&<>"']/gu, (c) => ({'&': '&', '<': '<', '>': '>', '"': '"', "'": '''}[c])); export function annotatedSvg(image, parts) { const {width: w, height: h} = image; const stroke = Math.max(w, h) / 400; const font = Math.max(w, h) / 65; const byId = new Map(parts.map((part) => [part.id, part])); const overlays = parts.map((part, index) => { const color = `hsl(${(index * 137.5) % 360} 85% 55%)`; const [px, py] = [part.pivot_norm[0] * w, part.pivot_norm[1] * h]; const parent = byId.get(part.parent); const line = parent ? `` : ''; let box = ''; if (part.bbox_norm_xyxy) { const [x0, y0, x1, y1] = part.bbox_norm_xyxy; box = ``; } const points = part.positive_points_norm.map(([x, y]) => ``).join(''); return `${line}${box}${points}${escape(part.id)}`; }).join('\n'); return `${overlays}`; } export function understandingReport(image, data, validation, metadata) { const svg = data && validation.valid ? annotatedSvg(image, data.parts) : `source`; const rows = data && validation.valid ? data.parts.map((part) => `${escape(part.id)}${escape(part.parent ?? 'root')}${escape(part.visibility)}${escape(part.occluded_by.join(', '))}${part.confidence}`).join('') : ''; return `角色结构理解检查

角色结构理解

此图仅包含模型预测的粗框、关节点(空心圆)和正点(实心圆),尚未执行 SAM 分割或补全。结构校验通过不代表语义正确。

状态:${validation.valid ? 'needs_review(待检查)' : 'failed'}

${svg}

校验

${escape(JSON.stringify(validation, null, 2))}

部件

${rows}
ID父部件可见性遮挡物自报置信度

模型说明

${escape(JSON.stringify(data?.notes || [], null, 2))}

请求记录

${escape(JSON.stringify(metadata, null, 2))}
`; }