Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions packages/core/src/sync/providers/kilo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ export function buildKiloModel(
canonical,
{
name: baseModel !== undefined || model.id.endsWith(":free") ? name : undefined,
description: existing?.description ?? apiDescription ?? describeModel({
description: apiDescription || existing?.description || describeModel({
id: model.id,
name,
family: familyValue,
Expand Down Expand Up @@ -217,7 +217,7 @@ export function buildKiloModel(

return {
name,
description: existing?.description ?? apiDescription ?? describeModel({
description: apiDescription || existing?.description || describeModel({
id: model.id,
name,
family: familyValue,
Expand Down
76 changes: 76 additions & 0 deletions packages/core/test/sync.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import {
type EdenAIModel,
} from "../src/sync/providers/edenai.js";
import { buildHyperModel, type HyperModel } from "../src/sync/providers/hyper.js";
import { buildKiloModel, type KiloModel } from "../src/sync/providers/kilo.js";
import {
buildInceptronModel,
parseInceptronModels,
Expand Down Expand Up @@ -139,6 +140,37 @@ function nanoGptModel(overrides: Partial<NanoGptModel> = {}): NanoGptModel {
};
}

function kiloModel(overrides: Partial<KiloModel> = {}): KiloModel {
return {
id: "anthropic/claude-opus-4-6",
name: "Claude Opus 4.6",
description: "API description from Kilo",
created: 1_782_777_600,
hugging_face_id: null,
knowledge_cutoff: "2026-01-31",
context_length: 1_000_000,
architecture: {
input_modalities: ["text", "image"],
output_modalities: ["text"],
tokenizer: "claude",
},
pricing: {
prompt: "0.000005",
completion: "0.000025",
internal_reasoning: "0.000025",
input_cache_read: "0.00000025",
input_cache_write: "0.00000375",
},
top_provider: {
context_length: 1_000_000,
max_completion_tokens: 128_000,
is_moderated: false,
},
supported_parameters: ["tools", "structured_outputs", "temperature"],
...overrides,
};
}

function crossModelModel(overrides: Partial<CrossModelModel> = {}): CrossModelModel {
return {
id: "qwen/qwen3.8-max",
Expand Down Expand Up @@ -841,6 +873,50 @@ test("NanoGPT sync drops stale descriptions while first factoring existing model
}
});

test("Kilo sync prefers API description over existing description", () => {
const model = buildKiloModel(
kiloModel({ description: "Updated API description" }),
{ description: "Existing authored description" } as ExistingModel,
);
expect((model as SyncedFullModel).description).toBe("Updated API description");
});

test("Kilo sync falls back to existing description when API description is empty", () => {
const model = buildKiloModel(
kiloModel({ description: "" }),
{ description: "Existing authored description" } as ExistingModel,
);
expect((model as SyncedFullModel).description).toBe("Existing authored description");
});

test("Kilo sync falls back to generated description when API and existing descriptions are missing", () => {
const model = buildKiloModel(
kiloModel({ description: undefined }),
undefined,
);
expect((model as SyncedFullModel).description).toBe(
"Flagship Claude model for deep reasoning, coding, and long-horizon agents",
);
});

test("Kilo sync prefers API description over existing description for base-model factored models", () => {
const model = buildKiloModel(
kiloModel({ description: "Updated API description" }),
{ description: "Existing authored description" } as ExistingModel,
"anthropic/claude-opus-4-6",
);
expect(model.description).toBe("Updated API description");
});

test("Kilo sync falls back to existing description when API description is empty for base-model factored models", () => {
const model = buildKiloModel(
kiloModel({ description: " " }),
{ description: "Existing authored description" } as ExistingModel,
"anthropic/claude-opus-4-6",
);
expect(model.description).toBe("Existing authored description");
});

const anthropicPricingMarkdown = `
## Model pricing

Expand Down
Loading