fix(canvas): 媒体提示词 - 统一 Agent 更新与画布生成读取生成合同
This commit is contained in:
@@ -3,6 +3,7 @@ import { CanvasNodeType, type CanvasNodeData } from "@/types/canvas";
|
||||
import { getNodeDefinition } from "./node-registry";
|
||||
import { isPluginEffectivelyEnabled } from "@/stores/use-plugin-store";
|
||||
import { inspectStoryboardReadiness } from "./canvas-storyboard-context";
|
||||
import { nodeGenerationPrompt } from "./generation-contract";
|
||||
|
||||
export type CanvasResourceInsight = {
|
||||
nodeId: string;
|
||||
@@ -68,7 +69,7 @@ export function findCanvasNodes(snapshot: CanvasSnapshot, input: { query?: strin
|
||||
if (statuses && !statuses.has(String(metadata.status || "idle"))) return false;
|
||||
if (input.resourceOnly && !resourceFromNode(node)) return false;
|
||||
if (!query) return true;
|
||||
return [node.id, node.title, metadata.content, metadata.prompt, metadata.composerContent, metadata.assetId, Array.isArray(metadata.assetTags) ? metadata.assetTags.join(" ") : "", metadata.workflowKind, metadata.workflowTitle, metadata.characterName]
|
||||
return [node.id, node.title, metadata.content, nodeGenerationPrompt(node), metadata.assetId, Array.isArray(metadata.assetTags) ? metadata.assetTags.join(" ") : "", metadata.workflowKind, metadata.workflowTitle, metadata.characterName]
|
||||
.some((value) => String(value || "").toLocaleLowerCase().includes(query));
|
||||
});
|
||||
return { query: input.query || "", total: nodes.length, truncated: nodes.length > limit, nodes: nodes.slice(0, limit).map(compactNode) };
|
||||
@@ -248,7 +249,7 @@ function compactNode(node: CanvasNodeData) {
|
||||
parentId: node.parentId,
|
||||
status: String(metadata.status || "idle"),
|
||||
content: preview(metadata.content, 240),
|
||||
prompt: preview(metadata.prompt || metadata.composerContent, 300),
|
||||
prompt: preview(nodeGenerationPrompt(node), 300),
|
||||
generation: metadata.generationMode || metadata.workflowKind || metadata.taskId ? { mode: metadata.generationMode, model: metadata.model, workflowKind: metadata.workflowKind, workflowTitle: metadata.workflowTitle, taskId: metadata.taskId, status: metadata.taskStatus || metadata.status, progress: numberValue(metadata.taskProgress ?? metadata.progress), stage: metadata.taskStage, provider: metadata.taskProvider, errorCode: metadata.taskErrorCode || metadata.generationErrorCode } : undefined,
|
||||
error: metadata.status === "error" ? preview(metadata.errorDetails || metadata.generationErrorCode, 360) : undefined,
|
||||
asset: metadata.assetId || metadata.characterAssetId ? { assetId: metadata.assetId || metadata.characterAssetId, versionId: metadata.characterVersionId, category: metadata.assetCategory, tags: metadata.assetTags, characterName: metadata.characterName } : undefined,
|
||||
|
||||
@@ -3,7 +3,7 @@ import { producedModelLabel, producedModelSearchTerms } from "@/lib/canvas/produ
|
||||
import type { AiConfig } from "@/stores/use-config-store";
|
||||
import { canvasNodeCreatedAt, canvasNodeUpdatedAt } from "@/lib/canvas/canvas-node-timestamps";
|
||||
import { CanvasNodeType, type CanvasNodeData } from "@/types/canvas";
|
||||
|
||||
import { nodeGenerationPrompt } from "@/lib/canvas/generation-contract";
|
||||
const searchTimeFormatter = new Intl.DateTimeFormat("zh-CN", {
|
||||
month: "2-digit",
|
||||
day: "2-digit",
|
||||
@@ -25,7 +25,7 @@ export function canvasNodeSearchContext(node: CanvasNodeData) {
|
||||
const textContent = node.type === CanvasNodeType.Text || node.type === CanvasNodeType.Markdown || node.type === CanvasNodeType.Script || node.type === CanvasNodeType.Skill
|
||||
? node.metadata?.content
|
||||
: undefined;
|
||||
return location || node.metadata?.prompt || node.metadata?.composerContent || node.metadata?.workflowDescription || textContent || getNodeListLabel(node.type);
|
||||
return location || nodeGenerationPrompt(node) || node.metadata?.workflowDescription || textContent || getNodeListLabel(node.type);
|
||||
}
|
||||
|
||||
export function canvasNodeMaterialSummary(node: CanvasNodeData, config?: AiConfig) {
|
||||
@@ -56,8 +56,7 @@ function canvasNodeSearchTerms(node: CanvasNodeData, config?: AiConfig) {
|
||||
node.title,
|
||||
node.type,
|
||||
getNodeListLabel(node.type),
|
||||
node.metadata?.prompt,
|
||||
node.metadata?.composerContent,
|
||||
nodeGenerationPrompt(node),
|
||||
node.metadata?.model,
|
||||
...producedModelSearchTerms(node.metadata, config),
|
||||
node.metadata?.chapterTitle,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { imageReferenceLabel } from "@/lib/image-reference-prompt";
|
||||
import { normalizeCharacterImageMentions } from "@/lib/canvas/canvas-character-reference";
|
||||
import { canvasNodeVideoPreviewUrl, canvasVideoAssetPreviewUrl } from "@/lib/canvas/canvas-media-preview";
|
||||
import { nodeGenerationPrompt } from "@/lib/canvas/generation-contract";
|
||||
import { writeCanvasNodePrompt } from "@/lib/canvas/canvas-node-prompt";
|
||||
import { getNodeResourceKind } from "@/lib/canvas/node-registry";
|
||||
import { seedanceReferenceLabel } from "@/lib/seedance-video";
|
||||
@@ -264,7 +265,7 @@ export function applyCanvasConnectionPromptSync(previousNodes: CanvasNodeData[],
|
||||
const nextMap = buildCanvasNodeMentionReferenceMap(nextNodes, nextConnections, nextNodes);
|
||||
let changed = false;
|
||||
const mapped = nextNodes.map((node) => {
|
||||
const previousPrompt = node.metadata?.composerContent ?? node.metadata?.prompt ?? "";
|
||||
const previousPrompt = nodeGenerationPrompt(node);
|
||||
const nextPrompt = rewriteCanvasPromptAfterReferenceChange(previousPrompt, previousMap.get(node.id) || [], nextMap.get(node.id) || []);
|
||||
if (nextPrompt === previousPrompt) return node;
|
||||
changed = true;
|
||||
@@ -387,7 +388,7 @@ export function buildCanvasAgentMentionReferences(nodes: CanvasNodeData[]): Canv
|
||||
previewStorageKey: node.type === CanvasNodeType.Video ? node.metadata?.videoPreview?.storageKey : undefined,
|
||||
drawingId: node.type === CanvasNodeType.Drawing ? node.metadata?.drawingId : undefined,
|
||||
drawingRevision: node.type === CanvasNodeType.Drawing ? node.metadata?.drawingRevision : undefined,
|
||||
text: node.metadata?.content || node.metadata?.composerContent || node.metadata?.prompt || node.title,
|
||||
text: node.metadata?.content || nodeGenerationPrompt(node) || node.title,
|
||||
active: true,
|
||||
sourceType: node.type,
|
||||
mentionToken: canvasNodeMentionToken(node.id),
|
||||
|
||||
@@ -120,6 +120,20 @@ export function readNodeGenerationSpec(node: Pick<CanvasNodeData, "type" | "meta
|
||||
}
|
||||
|
||||
|
||||
export function nodeGenerationPrompt(node: Pick<CanvasNodeData, "type" | "metadata">): string {
|
||||
const mode = canvasGenerationMode(node.type);
|
||||
if (mode) {
|
||||
try {
|
||||
const spec = readNodeGenerationSpec(node);
|
||||
if (spec?.mode === mode) return spec.prompt;
|
||||
} catch {
|
||||
// A malformed legacy contract should not make canvas discovery fail.
|
||||
}
|
||||
}
|
||||
const metadata = node.metadata || {};
|
||||
return typeof metadata.composerContent === "string" ? metadata.composerContent : typeof metadata.prompt === "string" ? metadata.prompt : "";
|
||||
}
|
||||
|
||||
export function canonicalGenerationMetadata(node: CanvasNodeData, mode: string): CanvasNodeMetadata {
|
||||
if (!canvasGenerationMode(mode)) return { ...node.metadata };
|
||||
const spec = readNodeGenerationSpec(node);
|
||||
|
||||
Reference in New Issue
Block a user