Skip to content

Commit 9b097bb

Browse files
committed
fix: require an explicit last-used model argument when loading models
1 parent 9973cb7 commit 9b097bb

5 files changed

Lines changed: 15 additions & 6 deletions

File tree

packages/agent-core-v2/src/kosong/model/model.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ export interface IModelService {
7878
getLastUsedModel(): string | undefined;
7979
set(id: string, model: ModelRecord): Promise<void>;
8080
delete(id: string): Promise<void>;
81-
loadAll(models: ModelsSection, defaultModel: string | undefined, lastUsedModel?: string): void;
81+
loadAll(models: ModelsSection, defaultModel: string | undefined, lastUsedModel: string | undefined): void;
8282
replaceAll(models: ModelsSection): Promise<void>;
8383
setDefaultModel(id: string | undefined): Promise<void>;
8484
setLastUsedModel(id: string | undefined): Promise<void>;

packages/agent-core-v2/src/kosong/model/modelService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export class ModelService extends Disposable implements IModelService {
7676
return this.lastUsedModel;
7777
}
7878

79-
loadAll(models: ModelsSection, defaultModel: string | undefined, lastUsedModel?: string): void {
79+
loadAll(models: ModelsSection, defaultModel: string | undefined, lastUsedModel: string | undefined): void {
8080
void this.applyRecords(models);
8181
void this.applyDefaultModel(defaultModel);
8282
void this.applyLastUsedModel(lastUsedModel);

packages/agent-core-v2/test/harness/agent.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ import { IModelService, type ModelsSection } from '#/kosong/model/model';
206206
import {
207207
DEFAULT_MODEL_SECTION,
208208
DEFAULT_PROVIDER_SECTION,
209+
LAST_USED_MODEL_SECTION,
209210
MODELS_SECTION,
210211
PROVIDERS_SECTION,
211212
} from '#/app/kosongConfig/configSection';
@@ -1040,6 +1041,7 @@ class ConfigBackedModelCatalog extends ModelCatalog {
10401041
this.modelRegistry.loadAll(
10411042
this.config.get<ModelsSection>(MODELS_SECTION) ?? {},
10421043
this.config.get<string>(DEFAULT_MODEL_SECTION),
1044+
this.config.get<string>(LAST_USED_MODEL_SECTION),
10431045
);
10441046
}
10451047

@@ -1221,6 +1223,7 @@ export class AgentTestContext {
12211223
.loadAll(
12221224
initialConfig.get<ModelsSection>(MODELS_SECTION) ?? {},
12231225
initialConfig.get<string>(DEFAULT_MODEL_SECTION),
1226+
initialConfig.get<string>(LAST_USED_MODEL_SECTION),
12241227
);
12251228

12261229
const bootstrap = this.root.accessor.get(IBootstrapService);

packages/agent-core-v2/test/kosong/model/catalog.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ function createHost(
8888
models.loadAll(
8989
(sections['models'] ?? {}) as ModelsSection,
9090
sections['defaultModel'] as string | undefined,
91+
undefined,
9192
);
9293
return {
9394
host,

packages/agent-core-v2/test/kosong/model/modelService.test.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ describe('ModelService', () => {
8686

8787
function createService(models: Readonly<Record<string, ModelRecord>> = {}): ModelService {
8888
const service = new ModelService(stubProviders(), stubEvents());
89-
service.loadAll({ ...models }, undefined);
89+
service.loadAll({ ...models }, undefined, undefined);
9090
return service;
9191
}
9292

@@ -99,7 +99,7 @@ describe('ModelService', () => {
9999
await Promise.resolve();
100100
expect(ready).toBe(false);
101101

102-
service.loadAll({ k1: { provider: 'pymodel', model: 'kimi-k2', maxContextSize: 262144 } }, 'k1');
102+
service.loadAll({ k1: { provider: 'pymodel', model: 'kimi-k2', maxContextSize: 262144 } }, 'k1', undefined);
103103
await service.ready;
104104
expect(ready).toBe(true);
105105
expect(service.getDefaultModel()).toBe('k1');
@@ -172,6 +172,7 @@ describe('ModelService', () => {
172172
chat: { provider: 'pymodel', model: 'chat', capabilities: ['tool_use'], maxContextSize: 262144 },
173173
},
174174
undefined,
175+
undefined,
175176
);
176177
expect(service.getDefaultModel()).toBe('chat');
177178
});
@@ -194,6 +195,7 @@ describe('ModelService', () => {
194195
},
195196
},
196197
'small',
198+
undefined,
197199
);
198200
expect(service.getDefaultModel()).toBe('small');
199201
});
@@ -211,6 +213,7 @@ describe('ModelService', () => {
211213
},
212214
},
213215
'huge',
216+
undefined,
214217
);
215218
expect(service.getDefaultModel()).toBe('big');
216219
});
@@ -242,6 +245,7 @@ describe('ModelService', () => {
242245
},
243246
},
244247
'small',
248+
undefined,
245249
);
246250
expect(service.getDefaultModel()).toBe('small');
247251

@@ -268,13 +272,14 @@ describe('ModelService', () => {
268272
},
269273
},
270274
'lone',
275+
undefined,
271276
);
272277
expect(service.getDefaultModel()).toBeUndefined();
273278
});
274279

275280
it('leaves the default unset when no model is eligible', () => {
276281
const service = new ModelService(stubProviders(), stubEvents());
277-
service.loadAll({ embed: { model: 'embed', capabilities: ['image_in'] } }, undefined);
282+
service.loadAll({ embed: { model: 'embed', capabilities: ['image_in'] } }, undefined, undefined);
278283
expect(service.getDefaultModel()).toBeUndefined();
279284
});
280285

@@ -324,7 +329,7 @@ describe('ModelService', () => {
324329
expect(events).toEqual(['k1', 'k2', undefined]);
325330
});
326331

327-
it('replaces a dead default with the ready last-used model and says so in the warning', async () => {
332+
it('falls back to the ranking when the default and last-used model are both deleted and warns about both ids', async () => {
328333
const published: ConfigWarning[] = [];
329334
const events = {
330335
_serviceBrand: undefined,

0 commit comments

Comments
 (0)