fix(POSTV1-04): 修复生成服务运行时装配
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,100 @@
|
||||
import { readFileSync } from "node:fs";
|
||||
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import { GenerationModelConfigurationCatalog, type ModelConfigurationView } from "../../apps/api/src/model-configuration.js";
|
||||
|
||||
describe("POSTV1-04 generation runtime wiring", () => {
|
||||
it("constructs, injects and closes the production generation submission service", () => {
|
||||
const main = readFileSync("apps/api/src/main.ts", "utf8");
|
||||
|
||||
expect(main).toContain('import { GenerationSubmissionService } from "./generation-submission.js";');
|
||||
expect(main).toContain("let generations: GenerationSubmissionService | undefined;");
|
||||
expect(main).toContain("generations = new GenerationSubmissionService({");
|
||||
expect(main).toContain("models: new GenerationModelConfigurationCatalog(models),");
|
||||
expect(main).toContain("...(generations ? { generations } : {}),");
|
||||
expect(main).toContain("generations?.close();");
|
||||
});
|
||||
|
||||
it("maps the current model configuration into the generation submission contract", () => {
|
||||
const configuration: ModelConfigurationView = {
|
||||
config_set_version: 7,
|
||||
configured_default_model_id: "gemini-3.1-flash-image-preview",
|
||||
recommended_model_id: "gemini-3.1-flash-image-preview",
|
||||
models: [{
|
||||
config_version: 3,
|
||||
contract_evidence_ref: "fixture-contract",
|
||||
contract_validation_status: "verified",
|
||||
credit_cost: 2,
|
||||
display_name: "Fixture model",
|
||||
enabled: true,
|
||||
error_mapping_profile: {},
|
||||
gateway_account_ref: "fixture-gateway",
|
||||
is_default: true,
|
||||
model_id: "gemini-3.1-flash-image-preview",
|
||||
prompt_max_length: 1_000,
|
||||
recommendation_priority: 1,
|
||||
reference_limits: { max_file_bytes: 10, max_files: 2, max_total_bytes: 20 },
|
||||
route_profile: {},
|
||||
runtime_availability: { available_for_new_jobs: true, checked_at: "2026-08-05T00:00:00.000Z", reason: "available" },
|
||||
safety_source: "provider",
|
||||
supported_ratios: ["3:4", "invalid"],
|
||||
}],
|
||||
};
|
||||
const catalog = new GenerationModelConfigurationCatalog({ read: () => configuration });
|
||||
|
||||
expect(catalog.readModel("gemini-3.1-flash-image-preview")).toEqual({
|
||||
configSetVersion: 7,
|
||||
configVersion: 3,
|
||||
contractValidationStatus: "verified",
|
||||
creditCost: 2,
|
||||
enabled: true,
|
||||
modelId: "gemini-3.1-flash-image-preview",
|
||||
promptMaxLength: 1_000,
|
||||
referenceLimits: { maxFileBytes: 10, maxFiles: 2, maxTotalBytes: 20 },
|
||||
runtimeAvailability: { availableForNewJobs: true, reason: null },
|
||||
supportedRatios: ["3:4"],
|
||||
});
|
||||
expect(catalog.readModel("missing")).toBeUndefined();
|
||||
});
|
||||
|
||||
it("maps model and contract blocks into generation error categories", () => {
|
||||
const configuration = {
|
||||
config_set_version: 1,
|
||||
configured_default_model_id: "gemini-3.1-flash-image-preview",
|
||||
recommended_model_id: null,
|
||||
models: [],
|
||||
} satisfies ModelConfigurationView;
|
||||
const catalog = new GenerationModelConfigurationCatalog({ read: () => configuration });
|
||||
const base = {
|
||||
config_version: 1,
|
||||
contract_evidence_ref: null,
|
||||
contract_validation_status: "verified" as const,
|
||||
credit_cost: 1,
|
||||
display_name: "Fixture model",
|
||||
enabled: true,
|
||||
error_mapping_profile: {},
|
||||
gateway_account_ref: "fixture-gateway",
|
||||
is_default: true,
|
||||
model_id: "gemini-3.1-flash-image-preview" as const,
|
||||
prompt_max_length: 1_000,
|
||||
recommendation_priority: 1,
|
||||
reference_limits: { max_file_bytes: 10, max_files: 2, max_total_bytes: 20 },
|
||||
route_profile: {},
|
||||
safety_source: "provider",
|
||||
supported_ratios: ["3:4"],
|
||||
};
|
||||
|
||||
configuration.models = [{
|
||||
...base,
|
||||
runtime_availability: { available_for_new_jobs: false, checked_at: "2026-08-05T00:00:00.000Z", reason: "contract_blocked" },
|
||||
}];
|
||||
expect(catalog.readModel(base.model_id)?.runtimeAvailability.reason).toBe("gateway_contract_invalid");
|
||||
|
||||
configuration.models = [{
|
||||
...base,
|
||||
runtime_availability: { available_for_new_jobs: false, checked_at: "2026-08-05T00:00:00.000Z", reason: "worker_degraded" },
|
||||
}];
|
||||
expect(catalog.readModel(base.model_id)?.runtimeAvailability.reason).toBe("model_disabled");
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user