From 5b26cfe5facb8e6227cddadb259715185a82cded Mon Sep 17 00:00:00 2001 From: "kiloconnect[bot]" <240665456+kiloconnect[bot]@users.noreply.github.com> Date: Mon, 27 Apr 2026 17:09:38 +0000 Subject: [PATCH 1/2] refactor(vscode): remove default autocomplete model from package.json Remove the hardcoded default value for `kilo-code.new.autocomplete.model` in package.json to prevent VS Code from stripping user overrides that match the schema default. Update corresponding unit tests to verify that no default is declared. --- .changeset/autocomplete-model-switch-back.md | 5 +++++ packages/kilo-vscode/package.json | 1 - .../kilo-vscode/tests/unit/autocomplete-models-sync.test.ts | 6 +++--- 3 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 .changeset/autocomplete-model-switch-back.md diff --git a/.changeset/autocomplete-model-switch-back.md b/.changeset/autocomplete-model-switch-back.md new file mode 100644 index 0000000000..19a09ec103 --- /dev/null +++ b/.changeset/autocomplete-model-switch-back.md @@ -0,0 +1,5 @@ +--- +"kilo-code": patch +--- + +Fix switching autocomplete model back to Codestral not persisting. diff --git a/packages/kilo-vscode/package.json b/packages/kilo-vscode/package.json index d888ec0d1a..4135299ebd 100644 --- a/packages/kilo-vscode/package.json +++ b/packages/kilo-vscode/package.json @@ -751,7 +751,6 @@ }, "kilo-code.new.autocomplete.model": { "type": "string", - "default": "mistralai/codestral-2508", "enum": [ "mistralai/codestral-2508", "inception/mercury-edit" diff --git a/packages/kilo-vscode/tests/unit/autocomplete-models-sync.test.ts b/packages/kilo-vscode/tests/unit/autocomplete-models-sync.test.ts index fe97bb1fc9..e7dc565783 100644 --- a/packages/kilo-vscode/tests/unit/autocomplete-models-sync.test.ts +++ b/packages/kilo-vscode/tests/unit/autocomplete-models-sync.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from "bun:test" import { readFileSync } from "node:fs" import { join } from "node:path" -import { AUTOCOMPLETE_MODELS, DEFAULT_AUTOCOMPLETE_MODEL } from "../../src/shared/autocomplete-models" +import { AUTOCOMPLETE_MODELS } from "../../src/shared/autocomplete-models" describe("autocomplete model enum ↔ AUTOCOMPLETE_MODELS sync", () => { const pkg = JSON.parse(readFileSync(join(__dirname, "../../package.json"), "utf8")) @@ -16,7 +16,7 @@ describe("autocomplete model enum ↔ AUTOCOMPLETE_MODELS sync", () => { expect(prop.enumDescriptions).toHaveLength(AUTOCOMPLETE_MODELS.length) }) - it("package.json default matches DEFAULT_AUTOCOMPLETE_MODEL", () => { - expect(prop.default).toBe(DEFAULT_AUTOCOMPLETE_MODEL.id) + it("package.json does not declare a default (VS Code strips user overrides that equal the schema default)", () => { + expect(prop.default).toBeUndefined() }) }) From 078a5592d7970aefb806c5ba991e631dc7a91f3a Mon Sep 17 00:00:00 2001 From: Mark IJbema Date: Mon, 27 Apr 2026 19:42:16 +0200 Subject: [PATCH 2/2] fix(vscode): fall back to codestral for empty or invalid autocomplete model Route the autocomplete model setting through getAutocompleteModel() in settings.ts, AutocompleteServiceManager, and ChatTextAreaAutocomplete so that missing, empty, or removed model IDs all resolve to codestral instead of being passed through to the FIM call. --- .../autocomplete/AutocompleteServiceManager.ts | 4 ++-- .../autocomplete/__tests__/settings.spec.ts | 13 +++++++++++++ .../chat-autocomplete/ChatTextAreaAutocomplete.ts | 4 ++-- .../src/services/autocomplete/settings.ts | 4 ++-- 4 files changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/kilo-vscode/src/services/autocomplete/AutocompleteServiceManager.ts b/packages/kilo-vscode/src/services/autocomplete/AutocompleteServiceManager.ts index 5d56a7aadf..1beb1485ea 100644 --- a/packages/kilo-vscode/src/services/autocomplete/AutocompleteServiceManager.ts +++ b/packages/kilo-vscode/src/services/autocomplete/AutocompleteServiceManager.ts @@ -8,7 +8,7 @@ import { AutocompleteCodeActionProvider } from "./AutocompleteCodeActionProvider import { AutocompleteInlineCompletionProvider } from "./classic-auto-complete/AutocompleteInlineCompletionProvider" import { AutocompleteTelemetry } from "./classic-auto-complete/AutocompleteTelemetry" import type { KiloConnectionService } from "../cli-backend" -import { DEFAULT_AUTOCOMPLETE_MODEL } from "../../shared/autocomplete-models" +import { getAutocompleteModel } from "../../shared/autocomplete-models" const CONFIG_SECTION = "kilo-code.new.autocomplete" @@ -27,7 +27,7 @@ function readSettings(): AutocompleteServiceSettings { enableAutoTrigger: config.get("enableAutoTrigger") ?? true, enableSmartInlineTaskKeybinding: config.get("enableSmartInlineTaskKeybinding") ?? true, enableChatAutocomplete: config.get("enableChatAutocomplete") ?? true, - model: config.get("model") ?? DEFAULT_AUTOCOMPLETE_MODEL.id, + model: getAutocompleteModel(config.get("model") ?? "").id, snoozeUntil: config.get("snoozeUntil"), } } diff --git a/packages/kilo-vscode/src/services/autocomplete/__tests__/settings.spec.ts b/packages/kilo-vscode/src/services/autocomplete/__tests__/settings.spec.ts index 51eccf7f3f..9ee596bc23 100644 --- a/packages/kilo-vscode/src/services/autocomplete/__tests__/settings.spec.ts +++ b/packages/kilo-vscode/src/services/autocomplete/__tests__/settings.spec.ts @@ -31,6 +31,19 @@ describe("autocomplete settings", () => { expect(buildAutocompleteSettingsMessage().settings.model).toBe("inception/mercury-edit") }) + it("defaults to codestral when no model is set", async () => { + const { buildAutocompleteSettingsMessage } = await import("../settings") + + expect(buildAutocompleteSettingsMessage().settings.model).toBe("mistralai/codestral-2508") + }) + + it("defaults to codestral when stored model is no longer supported", async () => { + state.set("model", "some/removed-model") + const { buildAutocompleteSettingsMessage } = await import("../settings") + + expect(buildAutocompleteSettingsMessage().settings.model).toBe("mistralai/codestral-2508") + }) + it("persists supported model updates", async () => { const post = vi.fn() const { routeAutocompleteMessage } = await import("../settings") diff --git a/packages/kilo-vscode/src/services/autocomplete/chat-autocomplete/ChatTextAreaAutocomplete.ts b/packages/kilo-vscode/src/services/autocomplete/chat-autocomplete/ChatTextAreaAutocomplete.ts index 8c1793faa3..328ba612eb 100644 --- a/packages/kilo-vscode/src/services/autocomplete/chat-autocomplete/ChatTextAreaAutocomplete.ts +++ b/packages/kilo-vscode/src/services/autocomplete/chat-autocomplete/ChatTextAreaAutocomplete.ts @@ -7,7 +7,7 @@ import { postprocessAutocompleteSuggestion } from "../classic-auto-complete/usel import { VisibleCodeTracker } from "../context/VisibleCodeTracker" import { FileIgnoreController } from "../shims/FileIgnoreController" import type { KiloConnectionService } from "../../cli-backend" -import { DEFAULT_AUTOCOMPLETE_MODEL } from "../../../shared/autocomplete-models" +import { getAutocompleteModel } from "../../../shared/autocomplete-models" import { finalizeChatSuggestion, buildChatPrefix } from "./chat-autocomplete-utils" interface ChatCompletionRequestMessage { @@ -77,7 +77,7 @@ export class ChatTextAreaAutocomplete { async getCompletion(userText: string, visibleCodeContext?: VisibleCodeContext): Promise<{ suggestion: string }> { const cfg = vscode.workspace.getConfiguration("kilo-code.new.autocomplete") - this.model.setModel(cfg.get("model") ?? DEFAULT_AUTOCOMPLETE_MODEL.id) + this.model.setModel(getAutocompleteModel(cfg.get("model") ?? "").id) const startTime = Date.now() // Build context for telemetry diff --git a/packages/kilo-vscode/src/services/autocomplete/settings.ts b/packages/kilo-vscode/src/services/autocomplete/settings.ts index 52f3883920..029d492129 100644 --- a/packages/kilo-vscode/src/services/autocomplete/settings.ts +++ b/packages/kilo-vscode/src/services/autocomplete/settings.ts @@ -1,5 +1,5 @@ import * as vscode from "vscode" -import { AUTOCOMPLETE_MODELS, DEFAULT_AUTOCOMPLETE_MODEL } from "../../shared/autocomplete-models" +import { AUTOCOMPLETE_MODELS, getAutocompleteModel } from "../../shared/autocomplete-models" const keys = new Set(["enableAutoTrigger", "enableSmartInlineTaskKeybinding", "enableChatAutocomplete", "model"]) @@ -35,7 +35,7 @@ export function buildAutocompleteSettingsMessage() { enableAutoTrigger: config.get("enableAutoTrigger", true), enableSmartInlineTaskKeybinding: config.get("enableSmartInlineTaskKeybinding", false), enableChatAutocomplete: config.get("enableChatAutocomplete", false), - model: config.get("model", DEFAULT_AUTOCOMPLETE_MODEL.id), + model: getAutocompleteModel(config.get("model") ?? "").id, }, } }