feat(models): 统一模型规格价格与路由

This commit is contained in:
kinoko committed 2026-08-22 17:00:08 +08:00
1 parent d268a938e5
commit 236b850177
36 files changed
+3404 -421

No files matched your search

+56 -1
View File
@@ -4,7 +4,7 @@ import { canvasConnectionError } from "../src/lib/canvas/canvas-connection-polic
import { assertCanvasImageReferenceLimit, buildGenerationConfig, canvasImageReferenceLimitError, resolveCanvasGenerationModel } from "../src/lib/canvas/canvas-project-generation";
import { defaultModelCapabilityConfig } from "../src/lib/model-capabilities";
import { groupModelsByDisplayName, modelCompatibilityError, modelGroupReferenceLimits, resolveCompatibleModel, resolveModelGenerationDefaults } from "../src/lib/model-selection";
import { defaultConfig, type AiConfig, type ModelChannel } from "../src/stores/use-config-store";
import { defaultConfig, normalizeModelOptionValue, type AiConfig, type ModelChannel } from "../src/stores/use-config-store";
import { CanvasNodeType, type CanvasConnection, type CanvasNodeData } from "../src/types/canvas";
function policyConfig(): AiConfig {
@@ -167,6 +167,61 @@ describe("逻辑模型选择", () => {
expect(modelCompatibilityError(config, "relay::cinema-image", requirements)).toContain("参考音频");
});
test("逻辑视频模型将 720 与 720p 视为同一分辨率", () => {
const model = "cinema-720p";
const channel: ModelChannel = {
id: "logical-video",
name: "平台视频模型",
baseUrl: "/api",
apiKey: "system",
apiFormat: "openai",
scope: "system",
models: [model],
modelCosts: [{
model,
capability: "video",
billingMode: "per_second",
unitPriceMicrocredits: 1,
logicalCapabilitySpec: {
version: 1,
capability: "video",
operations: ["text_to_video"],
inputs: {},
options: {
videoSeconds: { min: 1, max: 15, step: 1 },
size: { values: ["16:9"] },
vquality: { values: ["720p"] },
videoGenerateAudio: { values: [false] },
videoWatermark: { values: [false] },
},
},
}],
};
const value = `logical-video::${model}`;
const config = { ...defaultConfig, channels: [channel], models: [value], videoModels: [value], videoModel: value };
expect(modelCompatibilityError(config, value, {
capability: "video",
input: { textCount: 1, imageCount: 0, videoCount: 0, audioCount: 0, characterCount: 0 },
options: { size: "16:9", videoSeconds: 6, vquality: "720", videoGenerateAudio: false, videoWatermark: false },
})).toBe("");
});
test("已保存的旧 SKU 选择会解析到新的模型家族", () => {
const channel: ModelChannel = {
id: "managed",
name: "平台模型",
baseUrl: "/api",
apiKey: "system",
apiFormat: "openai",
scope: "system",
models: ["family-seedance-2-5"],
modelAliases: { "legacy-seedance-720": "family-seedance-2-5" },
};
expect(normalizeModelOptionValue("managed::legacy-seedance-720", [channel])).toBe("managed::family-seedance-2-5");
});
test("逻辑模型容量使用同名细分模型的最大值", () => {
const config = policyConfig();
expect(modelGroupReferenceLimits(config, "relay::cinema-text", "video")).toEqual({ maxImages: 1, maxVideos: 0, maxAudios: 1 });