@shop-os/modelkit 0.2.3 → 0.2.5

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/dist/index.cjs CHANGED
@@ -45,6 +45,7 @@ __export(index_exports, {
45
45
  arkAdapter: () => arkAdapter,
46
46
  aspectRatioToSize: () => aspectRatioToSize,
47
47
  classifyHttpError: () => classifyHttpError,
48
+ compareCatalogOrder: () => compareCatalogOrder,
48
49
  createDefaultModelKit: () => createDefaultModelKit,
49
50
  createModelKit: () => createModelKit,
50
51
  describe: () => describe,
@@ -82,6 +83,7 @@ __export(index_exports, {
82
83
  resolveVideoOptions: () => resolveVideoOptions,
83
84
  shouldRetry: () => shouldRetry,
84
85
  sleep: () => sleep,
86
+ sortCatalogRows: () => sortCatalogRows,
85
87
  streamObject: () => streamObject,
86
88
  streamText: () => streamText,
87
89
  textUsageEvent: () => textUsageEvent,
@@ -118,6 +120,22 @@ function isModelKitError(err) {
118
120
  return err instanceof ModelKitError;
119
121
  }
120
122
 
123
+ // src/catalog/order.ts
124
+ function compareCatalogOrder(a, b) {
125
+ const sa = a.display?.sortOrder;
126
+ const sb = b.display?.sortOrder;
127
+ if (sa !== void 0 && sb !== void 0 && sa !== sb) return sb - sa;
128
+ if (sa !== void 0 && sb === void 0) return -1;
129
+ if (sa === void 0 && sb !== void 0) return 1;
130
+ return compareText(a.label.toLowerCase(), b.label.toLowerCase()) || compareText(a.id, b.id);
131
+ }
132
+ function compareText(a, b) {
133
+ return a < b ? -1 : a > b ? 1 : 0;
134
+ }
135
+ function sortCatalogRows(rows) {
136
+ return [...rows].sort(compareCatalogOrder);
137
+ }
138
+
121
139
  // src/catalog/registry.ts
122
140
  var Catalog = class _Catalog {
123
141
  byId = /* @__PURE__ */ new Map();
@@ -174,11 +192,12 @@ var Catalog = class _Catalog {
174
192
  }
175
193
  return model;
176
194
  }
195
+ /** Rows in picker order: `display.sortOrder` descending, then label. See `compareCatalogOrder`. */
177
196
  list(filter = {}) {
178
197
  const lifecycles = filter.lifecycle ?? ["active"];
179
198
  return [...this.byId.values()].filter(
180
199
  (m) => (filter.type ? m.type === filter.type : true) && lifecycles.includes(m.lifecycle)
181
- );
200
+ ).sort(compareCatalogOrder);
182
201
  }
183
202
  /** Merge rows by id. Used for catalogOverride. */
184
203
  withOverrides(rows) {
@@ -355,7 +374,6 @@ var IMAGE_MODELS = [
355
374
  pricingKind: "image_size",
356
375
  display: {
357
376
  provider: "openai",
358
- sortOrder: 20,
359
377
  description: "OpenAI's most capable GPT Image 2.5 tier, built for editing precision; takes text and image input and outputs images in low, medium, high, xhigh, or max quality."
360
378
  }
361
379
  },
@@ -390,7 +408,6 @@ var IMAGE_MODELS = [
390
408
  pricingKind: "image_size",
391
409
  display: {
392
410
  provider: "openai",
393
- sortOrder: 10,
394
411
  description: "OpenAI's fastest GPT Image 2.5 tier for high-quality everyday image generation and editing; takes text and image input and outputs images."
395
412
  }
396
413
  },
@@ -2148,13 +2165,14 @@ function toEnvelope(data) {
2148
2165
  if (data.revision !== void 0) envelope.revision = data.revision;
2149
2166
  return envelope;
2150
2167
  }
2168
+ function describeError(err) {
2169
+ return err instanceof Error ? err.message : String(err);
2170
+ }
2151
2171
  function logPrimed(logger, result) {
2152
- const { origin: loggedOrigin, rowCount: loggedCount, revision: loggedRevision } = result;
2153
- logger.info("[modelkit] catalog primed", {
2154
- origin: loggedOrigin,
2155
- rowCount: loggedCount,
2156
- revision: loggedRevision
2157
- });
2172
+ const revision = result.revision === void 0 ? "" : ` revision=${result.revision}`;
2173
+ logger.info(
2174
+ `[modelkit] catalog primed origin=${result.origin} rowCount=${result.rowCount}${revision}`
2175
+ );
2158
2176
  }
2159
2177
  async function fetchRemote(source, logger) {
2160
2178
  const fetchImpl = source.fetch ?? globalThis.fetch;
@@ -2178,7 +2196,7 @@ async function writeCache(source, logger, rows, rev) {
2178
2196
  try {
2179
2197
  await source.cache.set(JSON.stringify({ rows, revision: rev }));
2180
2198
  } catch (err) {
2181
- logger.warn("[modelkit] catalog cache write failed", err);
2199
+ logger.warn(`[modelkit] catalog cache write failed: ${describeError(err)}`);
2182
2200
  }
2183
2201
  }
2184
2202
  async function prime(source, logger) {
@@ -2199,8 +2217,8 @@ async function prime(source, logger) {
2199
2217
  logPrimed(logger, result);
2200
2218
  return result;
2201
2219
  } catch (err) {
2202
- logger.warn("[modelkit] catalog remote failed, trying cache", err);
2203
- const error = err instanceof Error ? err.message : String(err);
2220
+ logger.warn(`[modelkit] catalog remote failed, trying cache: ${describeError(err)}`);
2221
+ const error = describeError(err);
2204
2222
  try {
2205
2223
  const cached = await source.cache?.get();
2206
2224
  if (!cached) throw new Error("no cached catalog");
@@ -2219,7 +2237,9 @@ async function prime(source, logger) {
2219
2237
  logPrimed(logger, result);
2220
2238
  return result;
2221
2239
  } catch (cacheErr) {
2222
- logger.warn("[modelkit] catalog cache failed, using snapshot", cacheErr);
2240
+ logger.warn(
2241
+ `[modelkit] catalog cache failed, using snapshot: ${describeError(cacheErr)}`
2242
+ );
2223
2243
  liveCatalog.replace([...MODELS]);
2224
2244
  liveState.origin = "snapshot";
2225
2245
  liveState.revision = void 0;
@@ -2242,7 +2262,9 @@ async function refresh(source, logger) {
2242
2262
  liveState.revision = fetched.revision;
2243
2263
  await writeCache(source, logger, fetched.rows, fetched.revision);
2244
2264
  } catch (err) {
2245
- logger.warn("[modelkit] catalog refresh failed, keeping current rows", err);
2265
+ logger.warn(
2266
+ `[modelkit] catalog refresh failed, keeping current rows: ${describeError(err)}`
2267
+ );
2246
2268
  }
2247
2269
  }
2248
2270
  function primeCatalog(source) {
@@ -7418,6 +7440,7 @@ var describe = (modelId) => createDefaultModelKit().describe(modelId);
7418
7440
  arkAdapter,
7419
7441
  aspectRatioToSize,
7420
7442
  classifyHttpError,
7443
+ compareCatalogOrder,
7421
7444
  createDefaultModelKit,
7422
7445
  createModelKit,
7423
7446
  describe,
@@ -7455,6 +7478,7 @@ var describe = (modelId) => createDefaultModelKit().describe(modelId);
7455
7478
  resolveVideoOptions,
7456
7479
  shouldRetry,
7457
7480
  sleep,
7481
+ sortCatalogRows,
7458
7482
  streamObject,
7459
7483
  streamText,
7460
7484
  textUsageEvent,