feat(FN-3892): honor assigned runtime model for merger sessions
- Add resolveMergerSessionModel helper to centralize merger model selection precedence - Route merger session creation paths through the helper for commit, push/rebase, and autostash recovery flows - Add comprehensive engine tests for merger model resolution and fallback behavior - Document merger model hierarchy in settings reference and add a patch changeset for @runfusion/fusion Fusion-Task-Id: FN-3892
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { extractRuntimeHint } from "../agent-session-helpers.js";
|
||||
import { extractRuntimeHint, resolveMergerSessionModel } from "../agent-session-helpers.js";
|
||||
|
||||
describe("extractRuntimeHint", () => {
|
||||
it("returns undefined for undefined config", () => {
|
||||
@@ -22,3 +22,92 @@ describe("extractRuntimeHint", () => {
|
||||
expect(extractRuntimeHint({ runtimeHint: 42 })).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe("resolveMergerSessionModel", () => {
|
||||
it("uses assigned agent runtime model when both provider and modelId are present", () => {
|
||||
expect(
|
||||
resolveMergerSessionModel(
|
||||
{
|
||||
defaultProviderOverride: "openai",
|
||||
defaultModelIdOverride: "gpt-4.1",
|
||||
defaultProvider: "anthropic",
|
||||
defaultModelId: "claude-3-5-sonnet",
|
||||
},
|
||||
{ model: " anthropic/claude-3-5-sonnet-20241022 " },
|
||||
),
|
||||
).toEqual({
|
||||
provider: "anthropic",
|
||||
modelId: "claude-3-5-sonnet-20241022",
|
||||
});
|
||||
});
|
||||
|
||||
it("falls back to default override pair when runtime model is not fully specified", () => {
|
||||
expect(
|
||||
resolveMergerSessionModel(
|
||||
{
|
||||
defaultProviderOverride: "openai",
|
||||
defaultModelIdOverride: "gpt-4.1",
|
||||
defaultProvider: "anthropic",
|
||||
defaultModelId: "claude-3-5-sonnet",
|
||||
},
|
||||
{ modelProvider: "anthropic" },
|
||||
),
|
||||
).toEqual({
|
||||
provider: "openai",
|
||||
modelId: "gpt-4.1",
|
||||
});
|
||||
});
|
||||
|
||||
it("falls back to global defaults when no override pair is configured", () => {
|
||||
expect(
|
||||
resolveMergerSessionModel(
|
||||
{
|
||||
defaultProvider: "anthropic",
|
||||
defaultModelId: "claude-3-5-sonnet",
|
||||
},
|
||||
{ modelId: "claude-3-opus" },
|
||||
),
|
||||
).toEqual({
|
||||
provider: "anthropic",
|
||||
modelId: "claude-3-5-sonnet",
|
||||
});
|
||||
});
|
||||
|
||||
it("ignores partial override pairs and falls back to global defaults", () => {
|
||||
expect(
|
||||
resolveMergerSessionModel({
|
||||
defaultProviderOverride: "openai",
|
||||
defaultProvider: "anthropic",
|
||||
defaultModelId: "claude-3-5-sonnet",
|
||||
}),
|
||||
).toEqual({
|
||||
provider: "anthropic",
|
||||
modelId: "claude-3-5-sonnet",
|
||||
});
|
||||
|
||||
expect(
|
||||
resolveMergerSessionModel({
|
||||
defaultModelIdOverride: "gpt-4.1",
|
||||
defaultProvider: "anthropic",
|
||||
defaultModelId: "claude-3-5-sonnet",
|
||||
}),
|
||||
).toEqual({
|
||||
provider: "anthropic",
|
||||
modelId: "claude-3-5-sonnet",
|
||||
});
|
||||
});
|
||||
|
||||
it("works when assignedAgentRuntimeConfig is undefined", () => {
|
||||
expect(
|
||||
resolveMergerSessionModel({
|
||||
defaultProviderOverride: "openai",
|
||||
defaultModelIdOverride: "gpt-4.1",
|
||||
defaultProvider: "anthropic",
|
||||
defaultModelId: "claude-3-5-sonnet",
|
||||
}),
|
||||
).toEqual({
|
||||
provider: "openai",
|
||||
modelId: "gpt-4.1",
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user