Skip to content

Commit 14c54e6

Browse files
committed
fix(reasoning): persist off override for discord directives
1 parent f79e3d5 commit 14c54e6

File tree

3 files changed

+70
-2
lines changed

3 files changed

+70
-2
lines changed

src/auto-reply/reply.directive.directive-behavior.defaults-think-low-reasoning-capable-models-no.test.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import "./reply.directive.directive-behavior.e2e-mocks.js";
22
import { describe, expect, it, vi } from "vitest";
3+
import { loadSessionStore } from "../config/sessions.js";
34
import {
45
installDirectiveBehaviorE2EHooks,
56
loadModelCatalog,
@@ -9,6 +10,7 @@ import {
910
replyText,
1011
replyTexts,
1112
runEmbeddedPiAgent,
13+
sessionStorePath,
1214
withTempHome,
1315
} from "./reply.directive.directive-behavior.e2e-harness.js";
1416
import { getReplyFromConfig } from "./reply.js";
@@ -79,6 +81,70 @@ describe("directive behavior", () => {
7981
expect(runEmbeddedPiAgent).not.toHaveBeenCalled();
8082
});
8183
});
84+
it("persists /reasoning off on discord even when model defaults reasoning on", async () => {
85+
await withTempHome(async (home) => {
86+
const storePath = sessionStorePath(home);
87+
mockEmbeddedTextResult("done");
88+
vi.mocked(loadModelCatalog).mockResolvedValue([
89+
{
90+
id: "x-ai/grok-4.1-fast",
91+
name: "Grok 4.1 Fast",
92+
provider: "openrouter",
93+
reasoning: true,
94+
},
95+
]);
96+
97+
const config = makeWhatsAppDirectiveConfig(
98+
home,
99+
{
100+
model: "openrouter/x-ai/grok-4.1-fast",
101+
},
102+
{
103+
channels: {
104+
discord: { allowFrom: ["*"] },
105+
},
106+
session: { store: storePath },
107+
},
108+
);
109+
110+
const offRes = await getReplyFromConfig(
111+
{
112+
Body: "/reasoning off",
113+
From: "discord:user:1004",
114+
To: "channel:general",
115+
Provider: "discord",
116+
Surface: "discord",
117+
CommandSource: "text",
118+
CommandAuthorized: true,
119+
},
120+
{},
121+
config,
122+
);
123+
expect(replyText(offRes)).toContain("Reasoning visibility disabled.");
124+
125+
const store = loadSessionStore(storePath);
126+
const entry = Object.values(store)[0];
127+
expect(entry?.reasoningLevel).toBe("off");
128+
129+
await getReplyFromConfig(
130+
{
131+
Body: "hello",
132+
From: "discord:user:1004",
133+
To: "channel:general",
134+
Provider: "discord",
135+
Surface: "discord",
136+
CommandSource: "text",
137+
CommandAuthorized: true,
138+
},
139+
{},
140+
config,
141+
);
142+
143+
expect(runEmbeddedPiAgent).toHaveBeenCalledOnce();
144+
const call = vi.mocked(runEmbeddedPiAgent).mock.calls[0]?.[0];
145+
expect(call?.reasoningLevel).toBe("off");
146+
});
147+
});
82148
for (const replyTag of ["[[reply_to_current]]", "[[ reply_to_current ]]"]) {
83149
it(`strips ${replyTag} and maps reply_to_current to MessageSid`, async () => {
84150
await withTempHome(async (home) => {

src/auto-reply/reply/directive-handling.impl.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,8 @@ export async function handleDirectiveOnly(
292292
}
293293
if (directives.hasReasoningDirective && directives.reasoningLevel) {
294294
if (directives.reasoningLevel === "off") {
295-
delete sessionEntry.reasoningLevel;
295+
// Persist explicit off so it overrides model-capability defaults.
296+
sessionEntry.reasoningLevel = "off";
296297
} else {
297298
sessionEntry.reasoningLevel = directives.reasoningLevel;
298299
}

src/auto-reply/reply/directive-handling.persist.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ export async function persistInlineDirectives(params: {
9191
}
9292
if (directives.hasReasoningDirective && directives.reasoningLevel) {
9393
if (directives.reasoningLevel === "off") {
94-
delete sessionEntry.reasoningLevel;
94+
// Persist explicit off so it overrides model-capability defaults.
95+
sessionEntry.reasoningLevel = "off";
9596
} else {
9697
sessionEntry.reasoningLevel = directives.reasoningLevel;
9798
}

0 commit comments

Comments
 (0)