fix: return original images from external image api

This commit is contained in:
134 2026-06-15 17:19:54 +08:00
parent 95d4bccceb
commit 65aac6c14d
2 changed files with 49 additions and 16 deletions

View File

@ -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,

View File

@ -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<ReturnType<typeof getEnabledAiModelsWithProvider>>[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,
};
});