fix(agents): honor heartbeat.model override instead of session model (#14181)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: f19b789057
Co-authored-by: 0xRaini <190923101+0xRaini@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
This commit is contained in:
0xRain
2026-02-12 01:46:51 +08:00
committed by GitHub
parent 8c963dc5a6
commit 6d723c9f8a
5 changed files with 122 additions and 1 deletions

View File

@@ -271,6 +271,9 @@ export async function createModelSelectionState(params: {
provider: string;
model: string;
hasModelDirective: boolean;
/** True when heartbeat.model was explicitly resolved for this run.
* In that case, skip session-stored overrides so the heartbeat selection wins. */
hasResolvedHeartbeatModelOverride?: boolean;
}): Promise<ModelSelectionState> {
const {
cfg,
@@ -343,7 +346,11 @@ export async function createModelSelectionState(params: {
sessionKey,
parentSessionKey,
});
if (storedOverride?.model) {
// Skip stored session model override only when an explicit heartbeat.model
// was resolved. Heartbeat runs without heartbeat.model should still inherit
// the regular session/parent model override behavior.
const skipStoredOverride = params.hasResolvedHeartbeatModelOverride === true;
if (storedOverride?.model && !skipStoredOverride) {
const candidateProvider = storedOverride.provider || defaultProvider;
const key = modelKey(candidateProvider, storedOverride.model);
if (allowedModelKeys.size === 0 || allowedModelKeys.has(key)) {