feat(POSTV1-02): 增加AI真实生成探测
Dada P0-A isolated Windows CI / validate-and-package (push) Waiting to run

This commit is contained in:
suyx
2026-08-05 13:14:40 +08:00
parent 99fd3b1802
commit b1f143c238
6 changed files with 163 additions and 3 deletions
+47
View File
@@ -0,0 +1,47 @@
import type { GenerationAdapter } from "./ai-adapter-contract.js";
export type AiRuntimeProbeResult =
| {
code: "ai_probe_passed";
mime_type: "image/jpeg" | "image/png" | "image/webp";
pixel_height: number;
pixel_width: number;
real_calls: 1;
success: true;
}
| {
code: "ai_probe_failed";
error_category: string;
real_calls: 1;
success: false;
};
export async function runAiRuntimeProbe(adapter: GenerationAdapter): Promise<AiRuntimeProbeResult> {
const result = await adapter.start({
configSnapshot: { probe: true },
generationId: "00000000-0000-4000-8000-000000000002",
modelId: "gemini-3.1-flash-image-preview",
prompt: "生成一张简洁的红蓝几何色块测试图,不含文字。",
ratio: "1:1",
referenceAssetIds: [],
});
if (result.status === "failed") {
return { code: "ai_probe_failed", error_category: result.category, real_calls: 1, success: false };
}
if (result.status !== "completed" || result.outputs.length !== 1) {
return { code: "ai_probe_failed", error_category: "gateway_contract_invalid", real_calls: 1, success: false };
}
const output = result.outputs[0]!;
try {
return {
code: "ai_probe_passed",
mime_type: output.mimeType,
pixel_height: output.pixelHeight,
pixel_width: output.pixelWidth,
real_calls: 1,
success: true,
};
} finally {
output.bytes.fill(0);
}
}
+17 -1
View File
@@ -2,6 +2,7 @@ import { parentPort } from "node:worker_threads";
import { join } from "node:path";
import { WorkerAiCallGate } from "./ai-call-gate.js";
import { runAiRuntimeProbe } from "./ai-runtime-probe.js";
import { GenerationProcessor } from "./generation-processor.js";
import { OneApiGenerationAdapter } from "./oneapi-generation-adapter.js";
import { readConfiguredLocalDataRoot } from "./runtime-config.js";
@@ -23,7 +24,22 @@ if (workerPort) {
});
}
if (!workerPort && process.argv.includes("--dada-credential-stdin")) {
if (!workerPort && process.argv.includes("--dada-ai-probe")) {
const credentialClient = initializeWorkerCredentialClient(await receiveWorkerCredentials());
let adapter: OneApiGenerationAdapter | undefined;
try {
adapter = new OneApiGenerationAdapter({ credential: credentialClient.aiGatewayCredential });
const result = await runAiRuntimeProbe(adapter);
process.stdout.write(JSON.stringify(result));
if (!result.success) process.exitCode = 2;
} catch {
process.stdout.write(JSON.stringify({ code: "ai_probe_failed", error_category: "upstream_failed", real_calls: 0, success: false }));
process.exitCode = 2;
} finally {
credentialClient.aiGatewayCredential.fill(0);
adapter?.dispose();
}
} else if (!workerPort && process.argv.includes("--dada-credential-stdin")) {
const credentialClient = initializeWorkerCredentialClient(await receiveWorkerCredentials());
const controlPipeIndex = process.argv.indexOf("--dada-control-pipe");
const controlPipe = process.argv[controlPipeIndex + 1];