fix(wp7-02): normalize generated image dimensions
Dada P0-A isolated Windows CI / validate-and-package (push) Failing after 2m17s

This commit is contained in:
suyx
2026-08-04 17:19:41 +08:00
parent 9d6f4ac24b
commit ae725a2d01
11 changed files with 153 additions and 17 deletions
+1
View File
@@ -44,6 +44,7 @@ export const frozenPackages = {
dependencies: {
"better-sqlite3": "13.0.1",
"drizzle-orm": "0.45.2",
sharp: "0.35.3",
},
devDependencies: {
typescript: "7.0.2",
+25 -8
View File
@@ -1,16 +1,14 @@
import { createHash } from "node:crypto";
import {
gptImageRequestSizeForRatio,
normalizeImageOutputToRatio,
} from "../../apps/worker/src/image-output-normalizer.mjs";
import { WP7_02_MODEL_IDS, buildModelContractPlan } from "./wp7-02-external-contract.mjs";
export const WP7_02_CONTROLLED_REAL_LIMIT = 120;
const ratios = ["3:4", "1:1", "4:3", "9:16"];
const openAiSizes = Object.freeze({
"3:4": "1080x1440",
"1:1": "1080x1080",
"4:3": "1440x1080",
"9:16": "1080x1920",
});
const allowedMimeTypes = new Set(["image/jpeg", "image/png", "image/webp"]);
const forbiddenEvidenceKeys = /(?:^|_)(?:absolute_path|authorization|body|credential|credential_value|image_bytes|image_data|original_image|password|path|prompt|raw|raw_provider_payload|raw_prompt|secret|token)(?:_|$)/i;
@@ -87,7 +85,7 @@ export function buildProviderRequest({ modelConfig, prompt, ratio, reference })
model: config.model_id,
prompt,
response_format: "b64_json",
size: openAiSizes[ratio],
size: gptImageRequestSizeForRatio(ratio),
};
if (reference) body.image = `data:${reference.mime_type};base64,${reference.bytes.toString("base64")}`;
return { body, headers, method: "POST", url: config.route_profile.endpoint };
@@ -221,6 +219,7 @@ export function buildSanitizedResponseEvidence(normalized) {
dimensions: structuredClone(normalized.dimensions),
evidence_hash: normalized.evidence_hash,
mime: normalized.mime,
...(normalized.normalization ? { normalization: structuredClone(normalized.normalization) } : {}),
usage_summary: structuredClone(normalized.usage_summary),
};
return validateSanitizedEvidence(evidence);
@@ -264,7 +263,25 @@ export async function executeProviderRequest({ fetchImpl = fetch, modelConfig, p
const providerResponse = await response.json();
let normalized;
try {
normalized = normalizeProviderResponse(modelConfig, providerResponse);
const providerNormalized = normalizeProviderResponse(modelConfig, providerResponse);
const adapted = await normalizeImageOutputToRatio({
bytes: providerNormalized.bytes,
mimeType: providerNormalized.mime,
pixelHeight: providerNormalized.dimensions.height,
pixelWidth: providerNormalized.dimensions.width,
ratio,
});
normalized = {
...providerNormalized,
bytes: adapted.bytes,
dimensions: { height: adapted.pixelHeight, width: adapted.pixelWidth },
evidence_hash: `sha256:${sha256(adapted.bytes)}`,
mime: adapted.mimeType,
normalization: {
applied: adapted.normalized,
upstream_dimensions: { height: adapted.upstreamPixelHeight, width: adapted.upstreamPixelWidth },
},
};
} catch (error) {
if (error instanceof Error && /^WP7_02_[A-Z0-9_]+$/.test(error.message)) {
error.safe_response_shape = describeProviderResponseShape(providerResponse);