mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-06-16 13:34:04 +08:00
3a15420770
Bump default model names project-wide: gpt-5.4 -> gpt-5.5,
gemini-3.x -> gemini-3.5-flash, glm-5 -> glm-5.1, and
grok-code-fast-1 -> grok-build-0.1 across all provider presets
(claude, codex, gemini, hermes, openclaw, opencode, universal),
Gemini config, and stream check defaults.
Pricing:
- Seed gemini-3.5-flash, gemini-3.1-flash-lite, step-3.5-flash-2603,
doubao-seed-2.0-code, mimo-v2.5(/pro), qwen3-coder-480b, grok-build-0.1.
- Correct deepseek-v4-flash/pro, glm-5/5.1, grok pricing.
- Add repair_current_model_pricing: idempotent pass that fixes only
rows still equal to the outdated built-in values, preserving any
user-customized prices (seed uses INSERT OR IGNORE and cannot update
existing rows).
Fixes from review:
- opencode: drop duplicate gemini-3.5-flash variant (unreachable via
.find), keep the entry with the full minimal/low/medium/high set.
- Align stale display names/costs to gemini-3.5-flash (hermes, openclaw,
opencode); openclaw cost -> {1.5, 9, 0.15} to match seed.
- i18n (zh/en/ja/zh-TW): refresh OMO category tooltips for new model
names; fix writing tooltip to Kimi K2.5 to match its recommended.
Update tests accordingly and add a regression test asserting unique
model ids in the Google opencode preset variants.
70 lines
3.1 KiB
TypeScript
70 lines
3.1 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { providerPresets } from "@/config/claudeProviderPresets";
|
|
import { codexProviderPresets } from "@/config/codexProviderPresets";
|
|
import { geminiProviderPresets } from "@/config/geminiProviderPresets";
|
|
|
|
describe("TheRouter provider presets", () => {
|
|
it("uses the Anthropic-compatible root endpoint for Claude", () => {
|
|
const preset = providerPresets.find((item) => item.name === "TheRouter");
|
|
|
|
expect(preset).toBeDefined();
|
|
expect(preset?.websiteUrl).toBe("https://therouter.ai");
|
|
expect(preset?.apiKeyUrl).toBe("https://dashboard.therouter.ai");
|
|
expect(preset?.category).toBe("aggregator");
|
|
expect(preset?.endpointCandidates).toEqual(["https://api.therouter.ai"]);
|
|
|
|
const env = (preset?.settingsConfig as { env: Record<string, string> }).env;
|
|
expect(env.ANTHROPIC_BASE_URL).toBe("https://api.therouter.ai");
|
|
expect(env.ANTHROPIC_AUTH_TOKEN).toBe("");
|
|
expect(env.ANTHROPIC_API_KEY).toBe("");
|
|
expect(env.ANTHROPIC_MODEL).toBe("anthropic/claude-sonnet-4.6");
|
|
expect(env.ANTHROPIC_DEFAULT_HAIKU_MODEL).toBe(
|
|
"anthropic/claude-haiku-4.5",
|
|
);
|
|
expect(env.ANTHROPIC_DEFAULT_SONNET_MODEL).toBe(
|
|
"anthropic/claude-sonnet-4.6",
|
|
);
|
|
expect(env.ANTHROPIC_DEFAULT_OPUS_MODEL).toBe("anthropic/claude-opus-4.8");
|
|
});
|
|
|
|
it("uses the OpenAI-compatible v1 endpoint for Codex", () => {
|
|
const preset = codexProviderPresets.find(
|
|
(item) => item.name === "TheRouter",
|
|
);
|
|
|
|
expect(preset).toBeDefined();
|
|
expect(preset?.websiteUrl).toBe("https://therouter.ai");
|
|
expect(preset?.apiKeyUrl).toBe("https://dashboard.therouter.ai");
|
|
expect(preset?.category).toBe("aggregator");
|
|
expect(preset?.endpointCandidates).toEqual(["https://api.therouter.ai/v1"]);
|
|
expect(preset?.auth).toEqual({ OPENAI_API_KEY: "" });
|
|
expect(preset?.config).toContain('model_provider = "custom"');
|
|
expect(preset?.config).toContain("[model_providers.custom]");
|
|
expect(preset?.config).toContain('name = "therouter"');
|
|
expect(preset?.config).toContain('model = "openai/gpt-5.3-codex"');
|
|
expect(preset?.config).not.toContain("goals = true");
|
|
expect(preset?.config).toContain(
|
|
'base_url = "https://api.therouter.ai/v1"',
|
|
);
|
|
expect(preset?.config).toContain('wire_api = "responses"');
|
|
});
|
|
|
|
it("uses the Gemini-native root endpoint for Gemini", () => {
|
|
const preset = geminiProviderPresets.find(
|
|
(item) => item.name === "TheRouter",
|
|
);
|
|
|
|
expect(preset).toBeDefined();
|
|
expect(preset?.websiteUrl).toBe("https://therouter.ai");
|
|
expect(preset?.apiKeyUrl).toBe("https://dashboard.therouter.ai");
|
|
expect(preset?.category).toBe("aggregator");
|
|
expect(preset?.endpointCandidates).toEqual(["https://api.therouter.ai"]);
|
|
expect(preset?.baseURL).toBe("https://api.therouter.ai");
|
|
expect(preset?.model).toBe("gemini-3.5-flash");
|
|
|
|
const env = (preset?.settingsConfig as { env: Record<string, string> }).env;
|
|
expect(env.GOOGLE_GEMINI_BASE_URL).toBe("https://api.therouter.ai");
|
|
expect(env.GEMINI_MODEL).toBe("gemini-3.5-flash");
|
|
});
|
|
});
|