Files
ttstd-infinite-canvas/web/src/pages/admin/components/channel-model-price-tier-form.test.ts
T
VicoHu 25e78fe4f8 fix(models): 系统渠道模型 - 上游 ID 重命名级联价格档并补管理端可见性
根因:价格档 provider_model_key 非空时优先于模型级上游键发往供应商,统一价格档曾把当时的顶层上游键固化为档位显式值,模型级重命名后被旧值静默遮蔽,任务请求继续发往旧上游模型(Agent 及其他入口共用该解析路径)。

- SaveAdminChannelModel 在模型级上游键变更时,把与旧值相同的档位键级联为新值;管理员显式配置的其他上游 SKU 不受影响
- 编辑无价格档旧模型不再预填顶层上游键;统一价格档检测到与模型级不一致的存量上游键时展示告警并支持一键清除恢复跟随模型默认;模型身份区提示档位独立上游键数量,比较口径统一剥 models/ 前缀
- 新增后端级联与请求解析回归测试、前端价格档表单单测
- 同步 backend-database.mdx 价格档语义与 pending-test.mdx 待验收项
2026-09-16 13:19:11 +08:00

50 lines
1.8 KiB
TypeScript

import assert from "node:assert/strict";
import test from "node:test";
import type { ChannelModel, ChannelModelPriceTier } from "@/services/api/wallet";
// Node 原生 TypeScript 测试运行器要求保留扩展名,项目编译器不允许该写法。
// @ts-expect-error -- Node 原生 TypeScript 测试运行器需要保留扩展名。
import { defaultPriceTier, legacyPriceTierToForm, priceTierToForm } from "./channel-model-price-tier-form.ts";
test("编辑无价格档的旧模型时不再把顶层上游键固化进统一价格档", () => {
const legacy: ChannelModel = {
id: "model-1",
modelKey: "deepseek-v4.1-flash",
providerModelKey: "deepseek-v4.1-flash",
billingMode: "fixed_request",
unitPriceMicrocredits: 10,
priceConfigured: true,
enabled: true,
} as unknown as ChannelModel;
const tier = legacyPriceTierToForm(legacy);
assert.equal(tier.providerModelKey, "");
assert.equal(tier.matchMode, "default");
});
test("已存档位键在回显时保持原值,清除与否交给管理端告警处理", () => {
const tier = priceTierToForm({
selector: {},
resolution: "*",
videoSeconds: 0,
providerModelKey: "sku-preview",
billingMode: "fixed_request",
unitPriceMicrocredits: 10,
inputTokenPriceMicrocredits: 0,
outputTokenPriceMicrocredits: 0,
cachedTokenPriceMicrocredits: 0,
priceConfigured: true,
enabled: true,
} as unknown as ChannelModelPriceTier);
assert.equal(tier.providerModelKey, "sku-preview");
assert.equal(tier.matchMode, "default");
});
test("新建默认价格档不携带上游键", () => {
assert.equal(defaultPriceTier().providerModelKey, "");
assert.equal(defaultPriceTier("advanced").providerModelKey, "");
});