

















@@ -804,4 +804,107 @@ describe("gateway sessions patch", () => {
804804expect(entry.providerOverride).toBe("synthetic");
805805expect(entry.modelOverride).toBe("hf:moonshotai/Kimi-K2.5");
806806});
807+808+test("persists trailing @profile suffix as authProfileOverride on model patch", async () => {
809+const entry = expectPatchOk(
810+await runPatch({
811+cfg: createAllowlistedAnthropicModelCfg(),
812+patch: { key: MAIN_SESSION_KEY, model: "anthropic/claude-sonnet-4-6@myprofile" },
813+loadGatewayModelCatalog: async () => [
814+{ provider: "anthropic", id: "claude-sonnet-4-6", name: "claude-sonnet-4-6" },
815+],
816+}),
817+);
818+expect(entry.providerOverride).toBe("anthropic");
819+expect(entry.modelOverride).toBe("claude-sonnet-4-6");
820+expect(entry.authProfileOverride).toBe("myprofile");
821+expect(entry.authProfileOverrideSource).toBe("user");
822+expect(entry.liveModelSwitchPending).toBe(true);
823+});
824+825+test("marks same-model @profile patches as pending live model switches", async () => {
826+const store: Record<string, SessionEntry> = {
827+[MAIN_SESSION_KEY]: {
828+sessionId: "sess-live-profile-only",
829+updatedAt: 1,
830+providerOverride: "anthropic",
831+modelOverride: "claude-sonnet-4-6",
832+authProfileOverride: "oldprofile",
833+authProfileOverrideSource: "user",
834+} as SessionEntry,
835+};
836+const entry = expectPatchOk(
837+await runPatch({
838+ store,
839+cfg: createAllowlistedAnthropicModelCfg(),
840+patch: { key: MAIN_SESSION_KEY, model: "anthropic/claude-sonnet-4-6@newprofile" },
841+loadGatewayModelCatalog: async () => [
842+{ provider: "anthropic", id: "claude-sonnet-4-6", name: "claude-sonnet-4-6" },
843+],
844+}),
845+);
846+expect(entry.providerOverride).toBe("anthropic");
847+expect(entry.modelOverride).toBe("claude-sonnet-4-6");
848+expect(entry.authProfileOverride).toBe("newprofile");
849+expect(entry.liveModelSwitchPending).toBe(true);
850+});
851+852+test("does not set authProfileOverride when profile suffix is missing", async () => {
853+const entry = expectPatchOk(
854+await runPatch({
855+cfg: createAllowlistedAnthropicModelCfg(),
856+patch: { key: MAIN_SESSION_KEY, model: "anthropic/claude-sonnet-4-6" },
857+loadGatewayModelCatalog: async () => [
858+{ provider: "anthropic", id: "claude-sonnet-4-6", name: "claude-sonnet-4-6" },
859+],
860+}),
861+);
862+expect(entry.providerOverride).toBe("anthropic");
863+expect(entry.modelOverride).toBe("claude-sonnet-4-6");
864+expect(entry.authProfileOverride).toBeUndefined();
865+});
866+867+test("persists full provider:profile authProfileOverride on model patch", async () => {
868+const entry = expectPatchOk(
869+await runPatch({
870+cfg: createAllowlistedAnthropicModelCfg(),
871+patch: {
872+key: MAIN_SESSION_KEY,
873+model: "anthropic/claude-sonnet-4-6@openai-codex:user@example.com",
874+},
875+loadGatewayModelCatalog: async () => [
876+{ provider: "anthropic", id: "claude-sonnet-4-6", name: "claude-sonnet-4-6" },
877+],
878+}),
879+);
880+expect(entry.providerOverride).toBe("anthropic");
881+expect(entry.modelOverride).toBe("claude-sonnet-4-6");
882+expect(entry.authProfileOverride).toBe("openai-codex:user@example.com");
883+expect(entry.authProfileOverrideSource).toBe("user");
884+});
885+886+test("resolves bare allowlisted model ids before persisting @profile suffix", async () => {
887+const entry = expectPatchOk(
888+await runPatch({
889+cfg: {
890+agents: {
891+defaults: {
892+model: { primary: "openai/gpt-5.4" },
893+models: {
894+"opencode-go/kimi-k2.6": {},
895+},
896+},
897+},
898+} as OpenClawConfig,
899+patch: { key: MAIN_SESSION_KEY, model: "kimi-k2.6@work" },
900+loadGatewayModelCatalog: async () => [
901+{ provider: "openai", id: "gpt-5.4", name: "gpt-5.4" },
902+{ provider: "opencode-go", id: "kimi-k2.6", name: "kimi-k2.6" },
903+],
904+}),
905+);
906+expect(entry.providerOverride).toBe("opencode-go");
907+expect(entry.modelOverride).toBe("kimi-k2.6");
908+expect(entry.authProfileOverride).toBe("work");
909+});
807910});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。