@ottocode/server 0.1.251 → 0.1.253

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ottocode/server",
3
- "version": "0.1.251",
3
+ "version": "0.1.253",
4
4
  "description": "HTTP API server for ottocode",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -49,8 +49,8 @@
49
49
  "typecheck": "tsc --noEmit"
50
50
  },
51
51
  "dependencies": {
52
- "@ottocode/database": "0.1.251",
53
- "@ottocode/sdk": "0.1.251",
52
+ "@ottocode/database": "0.1.253",
53
+ "@ottocode/sdk": "0.1.253",
54
54
  "ai-sdk-ollama": "^3.8.3",
55
55
  "drizzle-orm": "^0.44.5",
56
56
  "hono": "^4.9.9",
@@ -131,9 +131,15 @@ async function refreshProviderModelsInBackground(args: {
131
131
  providerDefinition,
132
132
  projectRoot,
133
133
  });
134
- const models =
135
- discoveredModels ??
136
- getConfiguredProviderModels(await loadConfig(projectRoot), provider);
134
+ if (!discoveredModels) return;
135
+ const configuredModels = getConfiguredProviderModels(
136
+ await loadConfig(projectRoot),
137
+ provider,
138
+ );
139
+ const models = mergeConfiguredAndCachedModels(
140
+ configuredModels,
141
+ discoveredModels,
142
+ );
137
143
  await mergeCachedModelCatalog({
138
144
  [provider]: {
139
145
  id: provider,
@@ -242,7 +248,7 @@ async function discoverProviderModels(args: {
242
248
  provider,
243
249
  error: error instanceof Error ? error.message : String(error),
244
250
  });
245
- return [];
251
+ return undefined;
246
252
  }
247
253
  }
248
254
 
@@ -255,15 +261,40 @@ function shouldLazyLoadProviderModels(
255
261
  );
256
262
  }
257
263
 
258
- function getCachedOrConfiguredModels(args: {
259
- models: ModelInfo[] | undefined;
264
+ function mergeConfiguredAndCachedModels(
265
+ configuredModels: ModelInfo[],
266
+ cachedModels: ModelInfo[],
267
+ ): ModelInfo[] {
268
+ const modelsById = new Map<string, ModelInfo>();
269
+ for (const model of configuredModels) {
270
+ modelsById.set(model.id, model);
271
+ }
272
+ for (const model of cachedModels) {
273
+ const configuredModel = modelsById.get(model.id);
274
+ modelsById.set(
275
+ model.id,
276
+ configuredModel ? { ...model, ...configuredModel } : model,
277
+ );
278
+ }
279
+ return Array.from(modelsById.values());
280
+ }
281
+
282
+ function getProviderModelsForUi(args: {
283
+ providerDefinition: NonNullable<ReturnType<typeof getProviderDefinition>>;
284
+ catalogModels: ModelInfo[] | undefined;
260
285
  cfg: Awaited<ReturnType<typeof loadConfig>>;
261
286
  provider: ProviderId;
287
+ authType: 'api' | 'oauth' | 'wallet' | undefined;
262
288
  }): ModelInfo[] {
263
- const cachedModels = args.models;
264
- return cachedModels && cachedModels.length > 0
265
- ? cachedModels
266
- : getConfiguredProviderModels(args.cfg, args.provider);
289
+ const configuredModels = getConfiguredProviderModels(args.cfg, args.provider);
290
+ const catalogModels = args.catalogModels ?? [];
291
+ if (args.providerDefinition.source === 'custom') {
292
+ return mergeConfiguredAndCachedModels(configuredModels, catalogModels);
293
+ }
294
+ if (catalogModels.length > 0) {
295
+ return filterModelsForAuthType(args.provider, catalogModels, args.authType);
296
+ }
297
+ return configuredModels;
267
298
  }
268
299
 
269
300
  function getUiProviderLabel(
@@ -322,15 +353,13 @@ export function registerModelsRoutes(app: Hono) {
322
353
  projectRoot,
323
354
  });
324
355
  }
325
- const filteredModels = shouldLazyLoadProviderModels(providerDefinition)
326
- ? getCachedOrConfiguredModels({
327
- models: providerCatalog?.models,
328
- cfg,
329
- provider,
330
- })
331
- : providerCatalog
332
- ? filterModelsForAuthType(provider, providerCatalog.models, authType)
333
- : getConfiguredProviderModels(cfg, provider);
356
+ const filteredModels = getProviderModelsForUi({
357
+ providerDefinition,
358
+ catalogModels: providerCatalog?.models,
359
+ cfg,
360
+ provider,
361
+ authType,
362
+ });
334
363
  const copilotAllowedModels =
335
364
  provider === 'copilot'
336
365
  ? await getAuthorizedCopilotModels(projectRoot)
@@ -400,19 +429,13 @@ export function registerModelsRoutes(app: Hono) {
400
429
  projectRoot,
401
430
  });
402
431
  }
403
- const filteredModels = dynamicModels
404
- ? getCachedOrConfiguredModels({
405
- models: providerCatalog?.models,
406
- cfg,
407
- provider,
408
- })
409
- : providerCatalog
410
- ? filterModelsForAuthType(
411
- provider,
412
- providerCatalog.models,
413
- authType,
414
- )
415
- : getConfiguredProviderModels(cfg, provider);
432
+ const filteredModels = getProviderModelsForUi({
433
+ providerDefinition,
434
+ catalogModels: providerCatalog?.models,
435
+ cfg,
436
+ provider,
437
+ authType,
438
+ });
416
439
  modelsMap[provider] = {
417
440
  label: getUiProviderLabel(providerDefinition),
418
441
  authType,