Skip to content

Commit ea02a96

Browse files
committed
fix(auto-reply): guard heartbeat hints for runtime refs
1 parent fc45d4f commit ea02a96

2 files changed

Lines changed: 42 additions & 10 deletions

File tree

src/auto-reply/reply/agent-runner-execution.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -875,6 +875,33 @@ describe("buildContextOverflowRecoveryText", () => {
875875
expect(text).not.toContain("heartbeat model bleed");
876876
});
877877

878+
it("does not use stale heartbeat bleed hints for different explicit runtime refs", () => {
879+
const text = buildContextOverflowRecoveryText({
880+
cfg: {
881+
agents: {
882+
defaults: {
883+
heartbeat: { model: "ollama/qwen3.5-9b-32k:latest" },
884+
},
885+
},
886+
},
887+
primaryProvider: "openrouter",
888+
primaryModel: "qwen3.6-plus",
889+
runtimeProvider: "custom",
890+
runtimeModel: "uncataloged-32k",
891+
activeSessionEntry: {
892+
sessionId: "session",
893+
updatedAt: 1,
894+
modelProvider: "ollama",
895+
model: "qwen3.5-9b-32k:latest",
896+
contextTokens: 32_768,
897+
},
898+
});
899+
900+
expect(text).toContain("reserveTokensFloor");
901+
expect(text).toContain("20000");
902+
expect(text).not.toContain("heartbeat model bleed");
903+
});
904+
878905
it("points to heartbeat model bleed when the last runtime model matches configured heartbeat.model", () => {
879906
const text = buildContextOverflowRecoveryText({
880907
cfg: {

src/auto-reply/reply/agent-runner-execution.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1000,16 +1000,21 @@ export function buildContextOverflowRecoveryText(params: {
10001000
agentId: params.agentId,
10011001
activeSessionEntry: params.activeSessionEntry,
10021002
});
1003-
return (
1004-
prefix +
1005-
(resolveHeartbeatBleedHint({
1006-
cfg: params.cfg,
1007-
agentId: params.agentId,
1008-
primaryProvider: params.primaryProvider,
1009-
primaryModel: params.primaryModel,
1010-
activeSessionEntry: params.activeSessionEntry,
1011-
}) ?? buildContextOverflowResetHint(primaryContextWindow))
1012-
);
1003+
const explicitRuntimeMatchesSession =
1004+
!params.runtimeProvider ||
1005+
!params.runtimeModel ||
1006+
(params.runtimeProvider === params.activeSessionEntry?.modelProvider &&
1007+
params.runtimeModel === params.activeSessionEntry?.model);
1008+
const heartbeatBleedHint = explicitRuntimeMatchesSession
1009+
? resolveHeartbeatBleedHint({
1010+
cfg: params.cfg,
1011+
agentId: params.agentId,
1012+
primaryProvider: params.primaryProvider,
1013+
primaryModel: params.primaryModel,
1014+
activeSessionEntry: params.activeSessionEntry,
1015+
})
1016+
: undefined;
1017+
return prefix + (heartbeatBleedHint ?? buildContextOverflowResetHint(primaryContextWindow));
10131018
}
10141019

10151020
function buildRestartLifecycleReplyText(): string {

0 commit comments

Comments
 (0)