Merge c4b434967afaa09e02f59ae09fb4ba1a61481a24 into 5e417b44e1540f528d2ae63e3e20229a902d1db2

This commit is contained in:
SnowSky1 2026-03-21 09:58:48 +08:00 committed by GitHub
commit e20b8387e6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 56 additions and 0 deletions

View File

@ -21,6 +21,19 @@ describe("chat-model-ref helpers", () => {
});
});
it("preserves nested OpenRouter model ids in option values", () => {
expect(
buildChatModelOption({
id: "anthropic/claude-opus-4.6",
name: "Claude Opus 4.6",
provider: "openrouter",
}),
).toEqual({
value: "openrouter/anthropic/claude-opus-4.6",
label: "anthropic/claude-opus-4.6 · openrouter",
});
});
it("normalizes raw overrides when the catalog match is unique", () => {
expect(normalizeChatModelOverrideValue(createChatModelOverride("gpt-5-mini"), catalog)).toBe(
"openai/gpt-5-mini",
@ -45,6 +58,9 @@ describe("chat-model-ref helpers", () => {
it("resolves server session data to qualified option values", () => {
expect(resolveServerChatModelValue("gpt-5-mini", "openai")).toBe("openai/gpt-5-mini");
expect(resolveServerChatModelValue("anthropic/claude-opus-4.6", "openrouter")).toBe(
"openrouter/anthropic/claude-opus-4.6",
);
expect(resolveServerChatModelValue("alias-only", null)).toBe("alias-only");
});
});

View File

@ -706,6 +706,46 @@ describe("chat view", () => {
vi.unstubAllGlobals();
});
it("preserves OpenRouter-prefixed model refs from the chat header picker", async () => {
vi.stubGlobal(
"fetch",
vi.fn().mockResolvedValue({
ok: false,
} satisfies Partial<Response>),
);
const { state, request } = createChatHeaderState({
models: [
{
id: "anthropic/claude-opus-4.6",
name: "Claude Opus 4.6",
provider: "openrouter",
},
],
});
const container = document.createElement("div");
render(renderChatSessionSelect(state), container);
const modelSelect = container.querySelector<HTMLSelectElement>(
'select[data-chat-model-select="true"]',
);
expect(modelSelect).not.toBeNull();
expect(
Array.from(modelSelect?.querySelectorAll("option") ?? []).map((option) => option.value),
).toContain("openrouter/anthropic/claude-opus-4.6");
modelSelect!.value = "openrouter/anthropic/claude-opus-4.6";
modelSelect!.dispatchEvent(new Event("change", { bubbles: true }));
await flushTasks();
expect(request).toHaveBeenCalledWith("sessions.patch", {
key: "main",
model: "openrouter/anthropic/claude-opus-4.6",
});
expect(state.sessionsResult?.sessions[0]?.model).toBe("anthropic/claude-opus-4.6");
expect(state.sessionsResult?.sessions[0]?.modelProvider).toBe("openrouter");
vi.unstubAllGlobals();
});
it("clears the session model override back to the default model", async () => {
vi.stubGlobal(
"fetch",