feat(POSTV1-02): 增加AI真实生成探测
Dada P0-A isolated Windows CI / validate-and-package (push) Waiting to run
Dada P0-A isolated Windows CI / validate-and-package (push) Waiting to run
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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];
|
||||
|
||||
Reference in New Issue
Block a user