价目对照保留仍在预览中的专业档,以及非快闪、非专业的代号档。

否则当前在用的型号会被整档滤掉,统计对不上实际调用。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-10-15 01:38:34 +08:00
co-authored by Cursor
parent e683df28dc
commit ba5485a9be
2 changed files with 43 additions and 1 deletions
+7 -1
View File
@@ -117,6 +117,7 @@ export function isOpenRouterModelsUrl(url: string): boolean {
/**
* 对比用的当前档:每个家族只留最新一档(DeepSeek / Claude / GLM / Gemini / GPT / Grok)。
* Gemini 另留非 flash/pro 的代号档(如 gemini-4-argon);Pro 若只有 preview 也算当前档。
* 同一档有多个 id 时留 created 更新的那个。
*/
export function usualOpenRouterBucket(modelId: string): string | null {
@@ -132,7 +133,11 @@ export function usualOpenRouterBucket(modelId: string): string | null {
return null;
}
const parts = name.split(/[^a-z0-9.]+/);
if (parts.some((part) => USUAL_SKIP_PARTS.has(part))) return null;
const skipped = parts.filter((part) => USUAL_SKIP_PARTS.has(part));
// Gemini 当前 Pro 在 OpenRouter 上仍带 preview,不能整档丢掉。
const geminiPreviewOnly =
name.includes("gemini") && skipped.length > 0 && skipped.every((part) => part === "preview");
if (skipped.length && !geminiPreviewOnly) return null;
if (name.includes("claude-haiku")) return "claude-haiku";
if (name.includes("claude-sonnet")) return "claude-sonnet";
if (name.includes("claude-opus")) return "claude-opus";
@@ -148,6 +153,7 @@ export function usualOpenRouterBucket(modelId: string): string | null {
}
if (name.includes("gemini") && name.includes("pro")) return "gemini-pro";
if (name.includes("gemini") && name.includes("flash")) return "gemini-flash";
if (name.includes("gemini")) return "gemini";
if (name.startsWith("gpt-") && name.includes("luna-pro")) return "gpt-luna-pro";
if (name.startsWith("gpt-") && name.includes("luna")) return "gpt-luna";
if (name.startsWith("gpt-") && name.includes("sol-pro")) return "gpt-sol-pro";
+36
View File
@@ -255,6 +255,9 @@ describe("trimOpenRouterUsualCatalog", () => {
);
expect(usualOpenRouterBucket("google/gemini-3.8-flash")).toBe("gemini-flash");
expect(usualOpenRouterBucket("google/gemini-2.5-pro")).toBe("gemini-pro");
expect(usualOpenRouterBucket("google/gemini-3.1-pro-preview")).toBe("gemini-pro");
expect(usualOpenRouterBucket("google/gemini-4-argon")).toBe("gemini");
expect(usualOpenRouterBucket("google/gemini-3.5-flash-lite")).toBeNull();
expect(usualOpenRouterBucket("openai/gpt-4o:batch")).toBeNull();
const trimmed = JSON.parse(
trimOpenRouterUsualCatalog(
@@ -293,6 +296,39 @@ describe("trimOpenRouterUsualCatalog", () => {
"anthropic/claude-haiku-5.5",
"openai/gpt-6-luna",
]);
const gemini = JSON.parse(
trimOpenRouterUsualCatalog(
JSON.stringify({
data: [
{
id: "google/gemini-2.5-pro",
created: 10,
pricing: { prompt: "0.000001", completion: "0.000005" },
},
{
id: "google/gemini-3.1-pro-preview",
created: 20,
pricing: { prompt: "0.000002", completion: "0.000008" },
},
{
id: "google/gemini-3.8-flash",
created: 30,
pricing: { prompt: "0.0000003", completion: "0.000001" },
},
{
id: "google/gemini-4-argon",
created: 40,
pricing: { prompt: "0.000003", completion: "0.000012" },
},
],
}),
),
) as { data: Array<{ id: string }> };
expect(gemini.data.map((row) => row.id).sort()).toEqual([
"google/gemini-3.1-pro-preview",
"google/gemini-3.8-flash",
"google/gemini-4-argon",
]);
const pinned = JSON.parse(
trimOpenRouterUsualCatalog(
JSON.stringify({