From 65aac6c14d605567646b8aeb39c91dca4afa71a9 Mon Sep 17 00:00:00 2001 From: 134 Date: Mon, 15 Jun 2026 17:19:54 +0800 Subject: [PATCH] fix: return original images from external image api --- app/api/external/image/generate/route.ts | 12 ++++++ lib/external-image-api/service.ts | 53 +++++++++++++++++------- 2 files changed, 49 insertions(+), 16 deletions(-) diff --git a/app/api/external/image/generate/route.ts b/app/api/external/image/generate/route.ts index 2a11501db..b37f18ef6 100644 --- a/app/api/external/image/generate/route.ts +++ b/app/api/external/image/generate/route.ts @@ -351,6 +351,8 @@ export async function POST(request: Request) { const actualModel = generationResult.usedModel; const hostedMarkdown = generationResult.markdown; const images = generationResult.images; + const originalImageUrls = images.map((image) => image.originalUrl || image.url); + const thumbnailImageUrls = images.map((image) => image.thumbnailUrl); const persistResult = await saveGeneratedImages( hostedMarkdown, @@ -384,6 +386,8 @@ export async function POST(request: Request) { model: serializeExternalImageApiModel(actualModel), markdown: hostedMarkdown, images, + imageUrls: originalImageUrls, + thumbnailUrls: thumbnailImageUrls, attempts: generationResult.attempts, }, generatedImageIds: persistResult.savedImageIds, @@ -400,6 +404,14 @@ export async function POST(request: Request) { data: { requestId: logId, model: serializeExternalImageApiModel(actualModel), + imageUrl: originalImageUrls[0] || null, + image_url: originalImageUrls[0] || null, + imageUrls: originalImageUrls, + image_urls: originalImageUrls, + originalUrls: originalImageUrls, + original_urls: originalImageUrls, + thumbnailUrls: thumbnailImageUrls, + thumbnail_urls: thumbnailImageUrls, images, generatedImageIds: persistResult.savedImageIds, generatedAssetIds: persistResult.savedAssetIds, diff --git a/lib/external-image-api/service.ts b/lib/external-image-api/service.ts index f37280991..4d244ac60 100644 --- a/lib/external-image-api/service.ts +++ b/lib/external-image-api/service.ts @@ -13,7 +13,11 @@ import { normalizeExternalImageApiConfig, type ExternalImageApiAccessKey, } from "@/lib/external-image-api/config"; -import { extractImageUrlsFromText } from "@/lib/image-url"; +import { + extractImageUrlsFromText, + extractOriginalImageUrlFromAlt, + inferOriginalImageUrl, +} from "@/lib/image-url"; import { uploadFile } from "@/lib/storage/service"; type ImageModelEntry = Awaited>[number]; @@ -53,7 +57,10 @@ type ExternalImageApiGeneratedImage = { id: number; url: string; originalUrl: string; + original_url: string; thumbnailUrl: string; + thumbnail_url: string; + previewUrl: string; imageSize: string; }; @@ -485,15 +492,28 @@ function filterCompatibleCandidates( return acceptedCandidates; } -function parseGeneratedImageMarkdownMeta(alt: string) { - const metaMatch = alt.match(/thumb\|\|\|([^|]+)\|\|\|(.+)$/i); - if (!metaMatch) { - return null; +function parseGeneratedImageMarkdownMeta(alt: string, fallbackUrl = "") { + const normalizedAlt = normalizeText(alt); + const fallbackOriginalUrl = inferOriginalImageUrl(normalizeText(fallbackUrl)); + const originalUrl = + extractOriginalImageUrlFromAlt(normalizedAlt, fallbackUrl) || fallbackOriginalUrl; + let imageSize = "2K"; + + if (normalizedAlt.includes("thumb|||")) { + const parts = normalizedAlt + .substring(normalizedAlt.indexOf("thumb|||") + 8) + .split("|||"); + imageSize = normalizeText(parts[1]) || imageSize; + } else if (normalizedAlt.includes("thumb$$")) { + const parts = normalizedAlt + .substring(normalizedAlt.indexOf("thumb$$") + 7) + .split("$$"); + imageSize = normalizeText(parts[1]) || imageSize; } return { - originalUrl: normalizeText(metaMatch[1]), - imageSize: normalizeText(metaMatch[2]), + originalUrl: normalizeText(originalUrl) || fallbackOriginalUrl, + imageSize, }; } @@ -525,8 +545,9 @@ export async function ensureHostedImageMarkdown( const raw = match[0]; const alt = match[1] || ""; const thumbnailSourceUrl = normalizeText(match[2]); - const metadata = parseGeneratedImageMarkdownMeta(alt); - const originalSourceUrl = metadata?.originalUrl || thumbnailSourceUrl; + const metadata = parseGeneratedImageMarkdownMeta(alt, thumbnailSourceUrl); + const originalSourceUrl = + metadata.originalUrl || inferOriginalImageUrl(thumbnailSourceUrl); const resolvedImageSize = metadata?.imageSize || imageSize; const start = match.index ?? -1; if (start < 0) continue; @@ -552,18 +573,18 @@ export function extractGeneratedImagesFromMarkdown(markdown: string) { return matches.map((match, index) => { const alt = match[1] || ""; const thumbnailUrl = match[2] || ""; - let originalUrl = thumbnailUrl; - let imageSize = "2K"; - const metadata = parseGeneratedImageMarkdownMeta(alt); - if (metadata) { - originalUrl = metadata.originalUrl || thumbnailUrl; - imageSize = metadata.imageSize || imageSize; - } + const metadata = parseGeneratedImageMarkdownMeta(alt, thumbnailUrl); + const originalUrl = + metadata.originalUrl || inferOriginalImageUrl(thumbnailUrl) || thumbnailUrl; + const imageSize = metadata.imageSize || "2K"; return { id: index + 1, url: originalUrl, originalUrl, + original_url: originalUrl, thumbnailUrl, + thumbnail_url: thumbnailUrl, + previewUrl: thumbnailUrl, imageSize, }; });