chore: add agent scene generation diagnostics
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

This commit is contained in:
Your Name 2026-03-24 15:21:22 +08:00
parent d73f6d6a29
commit bd0928c135
2 changed files with 150 additions and 20 deletions

View File

@ -6974,6 +6974,7 @@ export async function POST(request: Request) {
slotTitle: selectedAgentPreset.name,
userSupplementPrompt: sanitizedUserSupplementPrompt || null,
});
const sceneGenerationStartedAt = Date.now();
try {
const mergedImageParams = {
@ -6987,6 +6988,27 @@ export async function POST(request: Request) {
? String(selectedChatModel || "").trim()
: presetModelId;
const resolvedImageCount = Math.max(1, effectiveImageParams?.imageCount || 1);
console.info("[Chat API] Agent scene generation started:", {
chatId: id,
agentPresetId: selectedAgentPreset.id,
agentPresetName: selectedAgentPreset.name,
agentExecutionSnapshotId: presetSnapshot.id,
projectId: contextPayload?.projectId || null,
selectedChatModel: String(selectedChatModel || "").trim() || "auto",
resolvedModelRef,
resolvedImageCount,
sourceImageCount: sourceImageUrls.length,
sourceAssetCount: sourceAssetIds.length,
promptLength: String(scenePrompt || `生成${selectedAgentPreset.name}`).length,
aspectRatio:
typeof mergedImageParams.aspectRatio === "string"
? mergedImageParams.aspectRatio
: effectiveImageParams?.aspectRatio || defaultImageQualityParams.aspectRatio,
imageSize:
typeof mergedImageParams.imageSize === "string"
? mergedImageParams.imageSize
: effectiveImageParams?.imageSize || defaultImageQualityParams.imageSize,
});
const result = await generateCanvasImage({
prompt: scenePrompt || `生成${selectedAgentPreset.name}`,
negativePrompt:
@ -7004,6 +7026,24 @@ export async function POST(request: Request) {
: effectiveImageParams?.imageSize || defaultImageQualityParams.imageSize,
imageCount: resolvedImageCount,
referenceImages: sourceImageUrls,
debugLabel: "agent-scene-generation",
debugMeta: {
chatId: id,
agentPresetId: selectedAgentPreset.id,
agentPresetName: selectedAgentPreset.name,
agentExecutionSnapshotId: presetSnapshot.id,
projectId: contextPayload?.projectId || null,
},
});
console.info("[Chat API] Agent scene generation model completed:", {
chatId: id,
agentPresetId: selectedAgentPreset.id,
agentPresetName: selectedAgentPreset.name,
agentExecutionSnapshotId: presetSnapshot.id,
resultImageCount: result.images.length,
resultModelName: result.model,
resultModelRef: result.modelRef,
elapsedMs: Date.now() - sceneGenerationStartedAt,
});
const imageMarkdown = buildAgentToolImagesMarkdown(
@ -7058,6 +7098,14 @@ export async function POST(request: Request) {
requestedImageCount: resolvedImageCount,
},
);
console.info("[Chat API] Agent scene generation persisted:", {
chatId: id,
agentPresetId: selectedAgentPreset.id,
agentPresetName: selectedAgentPreset.name,
agentExecutionSnapshotId: presetSnapshot.id,
savedImageCount: result.images.length,
elapsedMs: Date.now() - sceneGenerationStartedAt,
});
writeAssistantTextChunk(
writer,
@ -7085,10 +7133,26 @@ export async function POST(request: Request) {
"agent-preset:image:scene-generation:canvas-media",
);
}
console.info("[Chat API] Agent scene generation response streamed:", {
chatId: id,
agentPresetId: selectedAgentPreset.id,
agentPresetName: selectedAgentPreset.name,
agentExecutionSnapshotId: presetSnapshot.id,
resultImageCount: result.images.length,
elapsedMs: Date.now() - sceneGenerationStartedAt,
});
successCount = result.images.length;
} catch (sceneError) {
console.error("[Chat API] Agent preset scene generation failed:", sceneError);
console.error("[Chat API] Agent scene generation failed detail:", {
chatId: id,
agentPresetId: selectedAgentPreset.id,
agentPresetName: selectedAgentPreset.name,
agentExecutionSnapshotId: presetSnapshot.id,
elapsedMs: Date.now() - sceneGenerationStartedAt,
error: sceneError instanceof Error ? sceneError.message : String(sceneError),
});
const errorMessage = `### ${selectedAgentPreset.name}\n\n执行失败:${
sceneError instanceof Error ? sceneError.message : "请稍后重试"
}`;

View File

@ -19,6 +19,8 @@ export interface CanvasGenerateImageRequest {
imageCount?: number;
referenceImage?: string;
referenceImages?: string[];
debugLabel?: string;
debugMeta?: Record<string, unknown>;
}
export interface ParsedImage {
@ -93,6 +95,7 @@ function getProviderBatchLimit(providerType: string) {
export async function generateCanvasImage(
request: CanvasGenerateImageRequest
): Promise<CanvasGenerateImageResult> {
const startedAt = Date.now();
const prompt = String(request.prompt || "").trim();
if (!prompt) {
throw new Error("请输入提示词");
@ -118,6 +121,11 @@ export async function generateCanvasImage(
const referenceImages = Array.isArray(request.referenceImages)
? request.referenceImages
: [];
const debugLabel = String(request.debugLabel || "").trim() || "canvas-image";
const debugMeta =
request.debugMeta && typeof request.debugMeta === "object"
? request.debugMeta
: undefined;
const allModels = await getEnabledAiModelsWithProvider();
const imageModels = allModels.filter((m) => m.model.supportsImageGen);
@ -191,6 +199,20 @@ export async function generateCanvasImage(
throw new Error("参考图片链接不可访问,请重新上传后再试");
}
console.info("[Canvas Generate Image] Started:", {
debugLabel,
promptLength: prompt.length,
aspectRatio,
imageSize,
imageCount,
requestedReferenceImageCount: normalizedReferenceImages.length,
reachableReferenceImageCount: reachableReferenceImages.length,
selectedModelRef: selectedModel.model.id,
selectedModelId: selectedModel.model.modelId,
providerType: provider.type,
...debugMeta,
});
const messages = [
{
role: "user" as const,
@ -338,29 +360,73 @@ export async function generateCanvasImage(
const collectedImages: ParsedImage[] = [];
const maxBatches = Math.max(1, Math.ceil(targetImageCount / providerBatchLimit));
for (let batchIndex = 0; batchIndex < maxBatches; batchIndex += 1) {
const remaining = targetImageCount - collectedImages.length;
if (remaining <= 0) break;
const batchImageCount = Math.min(providerBatchLimit, remaining);
const imageMarkdown = await executeGenerateBatch(batchImageCount);
const parsedImages = parseImagesFromMarkdown(imageMarkdown);
if (parsedImages.length === 0) {
if (collectedImages.length > 0) {
break;
try {
for (let batchIndex = 0; batchIndex < maxBatches; batchIndex += 1) {
const remaining = targetImageCount - collectedImages.length;
if (remaining <= 0) break;
const batchImageCount = Math.min(providerBatchLimit, remaining);
const batchStartedAt = Date.now();
console.info("[Canvas Generate Image] Batch started:", {
debugLabel,
batchIndex: batchIndex + 1,
totalBatches: maxBatches,
batchImageCount,
currentCollectedCount: collectedImages.length,
providerType: provider.type,
selectedModelId: selectedModel.model.modelId,
...debugMeta,
});
const imageMarkdown = await executeGenerateBatch(batchImageCount);
const parsedImages = parseImagesFromMarkdown(imageMarkdown);
console.info("[Canvas Generate Image] Batch completed:", {
debugLabel,
batchIndex: batchIndex + 1,
totalBatches: maxBatches,
batchImageCount,
parsedImageCount: parsedImages.length,
elapsedMs: Date.now() - batchStartedAt,
...debugMeta,
});
if (parsedImages.length === 0) {
if (collectedImages.length > 0) {
break;
}
throw new Error("图片生成失败");
}
collectedImages.push(...parsedImages.slice(0, batchImageCount));
}
if (collectedImages.length === 0) {
throw new Error("图片生成失败");
}
collectedImages.push(...parsedImages.slice(0, batchImageCount));
}
if (collectedImages.length === 0) {
throw new Error("图片生成失败");
}
const finalImages = collectedImages.slice(0, targetImageCount);
console.info("[Canvas Generate Image] Completed:", {
debugLabel,
elapsedMs: Date.now() - startedAt,
finalImageCount: finalImages.length,
providerType: provider.type,
selectedModelRef: selectedModel.model.id,
selectedModelId: selectedModel.model.modelId,
...debugMeta,
});
return {
images: collectedImages.slice(0, targetImageCount),
model: selectedModel.model.displayName,
modelRef: selectedModel.model.id,
prompt,
};
return {
images: finalImages,
model: selectedModel.model.displayName,
modelRef: selectedModel.model.id,
prompt,
};
} catch (error) {
console.error("[Canvas Generate Image] Failed:", {
debugLabel,
elapsedMs: Date.now() - startedAt,
providerType: provider.type,
selectedModelRef: selectedModel.model.id,
selectedModelId: selectedModel.model.modelId,
error: error instanceof Error ? error.message : String(error),
...debugMeta,
});
throw error;
}
}