Config: expand Kilo catalog and persist selected Kilo models (#24921)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: f5a7e1a385
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Co-authored-by: gumadeiras <5599352+gumadeiras@users.noreply.github.com>
Reviewed-by: @gumadeiras
This commit is contained in:
Gustavo Madeira Santana
2026-02-23 21:17:37 -05:00
committed by GitHub
parent 6c441ea797
commit 5239b55c0a
14 changed files with 668 additions and 21 deletions

View File

@@ -103,4 +103,124 @@ describe("loadModelCatalog", () => {
expect(spark?.name).toBe("gpt-5.3-codex-spark");
expect(spark?.reasoning).toBe(true);
});
it("merges configured models for opted-in non-pi-native providers", async () => {
__setModelCatalogImportForTest(
async () =>
({
AuthStorage: class {},
ModelRegistry: class {
getAll() {
return [{ id: "gpt-4.1", provider: "openai", name: "GPT-4.1" }];
}
},
}) as unknown as PiSdkModule,
);
const result = await loadModelCatalog({
config: {
models: {
providers: {
kilocode: {
models: [
{
id: "google/gemini-3-pro-preview",
name: "Gemini 3 Pro Preview",
input: ["text", "image"],
reasoning: true,
contextWindow: 1048576,
},
],
},
},
},
} as OpenClawConfig,
});
expect(result).toContainEqual(
expect.objectContaining({
provider: "kilocode",
id: "google/gemini-3-pro-preview",
name: "Gemini 3 Pro Preview",
}),
);
});
it("does not merge configured models for providers that are not opted in", async () => {
__setModelCatalogImportForTest(
async () =>
({
AuthStorage: class {},
ModelRegistry: class {
getAll() {
return [{ id: "gpt-4.1", provider: "openai", name: "GPT-4.1" }];
}
},
}) as unknown as PiSdkModule,
);
const result = await loadModelCatalog({
config: {
models: {
providers: {
qianfan: {
models: [
{
id: "deepseek-v3.2",
name: "DEEPSEEK V3.2",
},
],
},
},
},
} as OpenClawConfig,
});
expect(
result.some((entry) => entry.provider === "qianfan" && entry.id === "deepseek-v3.2"),
).toBe(false);
});
it("does not duplicate opted-in configured models already present in ModelRegistry", async () => {
__setModelCatalogImportForTest(
async () =>
({
AuthStorage: class {},
ModelRegistry: class {
getAll() {
return [
{
id: "anthropic/claude-opus-4.6",
provider: "kilocode",
name: "Claude Opus 4.6",
},
];
}
},
}) as unknown as PiSdkModule,
);
const result = await loadModelCatalog({
config: {
models: {
providers: {
kilocode: {
models: [
{
id: "anthropic/claude-opus-4.6",
name: "Configured Claude Opus 4.6",
},
],
},
},
},
} as OpenClawConfig,
});
const matches = result.filter(
(entry) => entry.provider === "kilocode" && entry.id === "anthropic/claude-opus-4.6",
);
expect(matches).toHaveLength(1);
expect(matches[0]?.name).toBe("Claude Opus 4.6");
});
});