diff --git a/.changeset/quiet-compaction-model.md b/.changeset/quiet-compaction-model.md new file mode 100644 index 00000000000..56efcb1eab3 --- /dev/null +++ b/.changeset/quiet-compaction-model.md @@ -0,0 +1,5 @@ +--- +"kilo-code": minor +--- + +Choose a separate model for conversation compaction in Context settings. diff --git a/packages/kilo-vscode/tests/unit/config-utils.test.ts b/packages/kilo-vscode/tests/unit/config-utils.test.ts index 5ca90cb714b..3bbb3209798 100644 --- a/packages/kilo-vscode/tests/unit/config-utils.test.ts +++ b/packages/kilo-vscode/tests/unit/config-utils.test.ts @@ -392,6 +392,27 @@ describe("ConfigState", () => { }) }) + it("sets and clears the compaction model without changing other settings", () => { + const s = new ConfigState() + const cfg: Config = { + model: "kilo/openai/gpt-4.1", + agent: { compaction: { prompt: "Keep task details" }, code: { model: "kilo/openai/gpt-4.1" } }, + } + const model = "kilo/anthropic/claude-haiku-4-5" + s.handleConfigLoaded(cfg) + s.updateConfig({ agent: { compaction: { model } } }) + + expect(s.config).toEqual({ + ...cfg, + agent: { ...cfg.agent, compaction: { prompt: "Keep task details", model } }, + }) + s.updateConfig({ agent: { compaction: { model: null } } }) + + expect(s.config).toEqual(cfg) + expect(s.draft.agent?.compaction?.model).toBeNull() + expect(configUnsetPaths(s.draft)).toEqual([["agent", "compaction", "model"]]) + }) + describe("agent permission patches", () => { it("merges nested per-agent permission patches into existing rules", () => { const s = new ConfigState() diff --git a/packages/kilo-vscode/webview-ui/src/components/settings/ContextTab.tsx b/packages/kilo-vscode/webview-ui/src/components/settings/ContextTab.tsx index e1c92c1211b..999f2e86e2b 100644 --- a/packages/kilo-vscode/webview-ui/src/components/settings/ContextTab.tsx +++ b/packages/kilo-vscode/webview-ui/src/components/settings/ContextTab.tsx @@ -8,6 +8,8 @@ import { IconButton } from "@kilocode/kilo-ui/icon-button" import { useConfig } from "../../context/config" import { useLanguage } from "../../context/language" import { useMemory } from "../../context/memory" +import { parseModelString } from "../../../../src/shared/provider-model" +import { ModelSelectorBase } from "../shared/ModelSelector" import SettingsRow from "./SettingsRow" const ContextTab: Component = () => { @@ -139,6 +141,24 @@ const ContextTab: Component = () => { {language.t("settings.context.autoCompaction.title")} + + + updateConfig({ + agent: { compaction: { model: providerID && modelID ? `${providerID}/${modelID}` : null } }, + }) + } + placement="bottom-start" + allowClear + clearLabel={language.t("settings.context.compactionModel.useChatModel")} + label={language.t("settings.context.compactionModel.title")} + description={language.t("settings.context.compactionModel.description")} + /> +