Skip to content
This repository was archived by the owner on Aug 6, 2026. It is now read-only.

Commit 5cb6bb9

Browse files
authored
chore: fix effort options for reopened Kimi tasks
1 parent e59be41 commit 5cb6bb9

2 files changed

Lines changed: 95 additions & 3 deletions

File tree

packages/core/src/sessions/sessionService.ts

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
getBackoffDelay,
2121
getCloudUrlFromRegion,
2222
getConfigOptionByCategory,
23+
getReasoningEffortOptions,
2324
isFatalSessionError,
2425
isJsonRpcNotification,
2526
isJsonRpcRequest,
@@ -5539,10 +5540,15 @@ export class SessionService {
55395540
],
55405541
};
55415542
};
5543+
const modelEffortOptions = preferredModel
5544+
? getReasoningEffortOptions(adapter, preferredModel)
5545+
: undefined;
55425546
const extras = previewOptions
5543-
.filter(
5544-
(opt) => opt.category === "model" || opt.category === "thought_level",
5545-
)
5547+
.filter((opt) => {
5548+
if (opt.category === "model") return true;
5549+
if (opt.category !== "thought_level") return false;
5550+
return modelEffortOptions !== null;
5551+
})
55465552
.map((opt) => {
55475553
if (opt.category === "model") {
55485554
return applyPreferredValue(opt, preferredModel, existingModelOption);
@@ -5560,6 +5566,12 @@ export class SessionService {
55605566
if (extras.length === 0) return;
55615567

55625568
const previewCategories = new Set(extras.map((option) => option.category));
5569+
// The preview endpoint describes its default model. When the run uses an
5570+
// effort-less model, explicitly replace (and therefore remove) any stale
5571+
// thought-level option instead of inheriting the default model's choices.
5572+
if (preferredModel && modelEffortOptions === null) {
5573+
previewCategories.add("thought_level");
5574+
}
55635575
const merged = [
55645576
...existingOptions.filter(
55655577
(option) => !previewCategories.has(option.category),

packages/ui/src/features/sessions/sessionServiceHost.test.ts

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5465,6 +5465,86 @@ describe("SessionService", () => {
54655465
});
54665466
});
54675467

5468+
it("does not inherit effort options from the preview default for an effort-less model", async () => {
5469+
const service = getSessionService();
5470+
const session = createMockSession({
5471+
taskRunId: "run-kimi-123",
5472+
taskId: "task-kimi-123",
5473+
isCloud: true,
5474+
adapter: "claude",
5475+
configOptions: [
5476+
{
5477+
id: "mode",
5478+
name: "Approval Preset",
5479+
type: "select",
5480+
category: "mode",
5481+
currentValue: "plan",
5482+
options: [],
5483+
},
5484+
],
5485+
});
5486+
mockSessionStoreSetters.getSessions.mockReturnValue({
5487+
"run-kimi-123": session,
5488+
});
5489+
mockTrpcAgent.getPreviewConfigOptions.query.mockResolvedValueOnce([
5490+
{
5491+
id: "model",
5492+
name: "Model",
5493+
type: "select",
5494+
category: "model",
5495+
currentValue: "claude-opus-4-8",
5496+
options: [
5497+
{ value: "claude-opus-4-8", name: "Opus 4.8" },
5498+
{ value: "moonshotai/kimi-k3", name: "Kimi K3" },
5499+
],
5500+
},
5501+
{
5502+
id: "effort",
5503+
name: "Effort",
5504+
type: "select",
5505+
category: "thought_level",
5506+
currentValue: "high",
5507+
options: [
5508+
{ value: "low", name: "Low" },
5509+
{ value: "high", name: "High" },
5510+
{ value: "max", name: "Max" },
5511+
],
5512+
},
5513+
]);
5514+
5515+
service.watchCloudTask(
5516+
"task-kimi-123",
5517+
"run-kimi-123",
5518+
"https://api.example.com",
5519+
7,
5520+
undefined,
5521+
undefined,
5522+
"plan",
5523+
"claude",
5524+
"moonshotai/kimi-k3",
5525+
);
5526+
5527+
await vi.waitFor(() => {
5528+
const configUpdate = (
5529+
mockSessionStoreSetters.updateSession.mock.calls as Array<
5530+
[string, { configOptions?: SessionConfigOption[] }]
5531+
>
5532+
)
5533+
.filter(([runId]) => runId === "run-kimi-123")
5534+
.map(([, patch]) => patch.configOptions)
5535+
.find((options) =>
5536+
options?.some((option) => option.category === "model"),
5537+
);
5538+
expect(
5539+
configUpdate?.find((option) => option.category === "model")
5540+
?.currentValue,
5541+
).toBe("moonshotai/kimi-k3");
5542+
expect(
5543+
configUpdate?.some((option) => option.category === "thought_level"),
5544+
).toBe(false);
5545+
});
5546+
});
5547+
54685548
it("keeps model-specific max reasoning when generic preview options omit it", async () => {
54695549
const service = getSessionService();
54705550
const session = createMockSession({

0 commit comments

Comments
 (0)