























1+import { describe, expect, it } from "vitest";
2+import {
3+isOpenRouterDeepSeekV4ModelId,
4+isOpenRouterMistralModelId,
5+normalizeOpenRouterApiModelId,
6+normalizeOpenRouterModelId,
7+} from "./models.js";
8+9+describe("normalizeOpenRouterModelId", () => {
10+it("strips the openrouter/ provider qualifier", () => {
11+expect(normalizeOpenRouterModelId("openrouter/deepseek/deepseek-v4-flash")).toBe(
12+"deepseek/deepseek-v4-flash",
13+);
14+});
15+16+it("leaves non-openrouter refs unchanged", () => {
17+expect(normalizeOpenRouterModelId("deepseek/deepseek-v4-flash")).toBe(
18+"deepseek/deepseek-v4-flash",
19+);
20+});
21+22+it("returns undefined for non-strings", () => {
23+expect(normalizeOpenRouterModelId(null)).toBeUndefined();
24+});
25+});
26+27+describe("normalizeOpenRouterApiModelId", () => {
28+it.each([
29+["openrouter/deepseek-v4-flash", "deepseek/deepseek-v4-flash"],
30+["openrouter/deepseek-v4-pro", "deepseek/deepseek-v4-pro"],
31+["openrouter/DEEPSEEK-V4-FLASH", "deepseek/deepseek-v4-flash"],
32+])("expands short OpenRouter ref %s to %s", (input, expected) => {
33+expect(normalizeOpenRouterApiModelId(input)).toBe(expected);
34+});
35+36+it("strips provider prefix from already-namespaced refs", () => {
37+expect(normalizeOpenRouterApiModelId("openrouter/deepseek/deepseek-v4-flash")).toBe(
38+"deepseek/deepseek-v4-flash",
39+);
40+});
41+42+it.each([
43+["openrouter/auto", "openrouter/auto"],
44+["openrouter/auto:free", "openrouter/auto:free"],
45+["openrouter/free", "openrouter/free"],
46+])("preserves native OpenRouter route %s", (input, expected) => {
47+expect(normalizeOpenRouterApiModelId(input)).toBe(expected);
48+});
49+50+it("passes through refs without the openrouter prefix", () => {
51+expect(normalizeOpenRouterApiModelId("deepseek/deepseek-v4-flash")).toBe(
52+"deepseek/deepseek-v4-flash",
53+);
54+});
55+});
56+57+describe("isOpenRouterDeepSeekV4ModelId", () => {
58+it("matches namespaced DeepSeek V4 refs", () => {
59+expect(isOpenRouterDeepSeekV4ModelId("openrouter/deepseek/deepseek-v4-flash")).toBe(true);
60+expect(isOpenRouterDeepSeekV4ModelId("openrouter/deepseek/deepseek-v4-pro")).toBe(true);
61+expect(isOpenRouterDeepSeekV4ModelId("openrouter/anthropic/claude-sonnet-4-6")).toBe(false);
62+});
63+});
64+65+describe("isOpenRouterMistralModelId", () => {
66+it("matches Mistral-prefixed refs", () => {
67+expect(isOpenRouterMistralModelId("openrouter/mistral/ministral-8b")).toBe(true);
68+expect(isOpenRouterMistralModelId("openrouter/codestral-22b")).toBe(true);
69+});
70+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。