@glbgpt/cli 0.2.5 → 0.2.7

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.
@@ -1,204 +1,244 @@
1
1
  /**
2
- * Models served through the shared /ai-api/ai/ext/media endpoints (2026-10-22).
2
+ * Models served through the shared /ai-api/ai/ext/media endpoints, generated from the backend's
3
+ * own model catalog (GET /ai-api/ai/ext/media/catalog?type=image|video — yanfa
4
+ * resources/ext/media-catalog-v1.json, the list the site and the Chrome extension use).
3
5
  *
4
- * The backend owns each model's submit body and billing key (yanfa ExtLegacyRequestBuilder /
5
- * ExtEstimateMapper, golden-tested against glb_site), so a spec here only declares the CLI-side
6
- * support and maps canonical params onto the catalog parameter keys. Supported values mirror
7
- * GET /ai-api/ai/ext/media/catalog (resources/ext/media-catalog-v1.json 2026-10-22.1); the
8
- * backend re-validates every request against that catalog.
6
+ * The backend owns each model's submit body and billing key (ExtLegacyRequestBuilder /
7
+ * ExtEstimateMapper) and re-validates every request against that catalog, so a model added there
8
+ * becomes usable here without a CLI release. This file only turns catalog entries into
9
+ * {@link ModelSpec}s: the params the CLI can express are mapped onto canonical flags, every other
10
+ * param is left to the backend default, and models the CLI cannot drive are skipped.
11
+ *
12
+ * Loading (cache / network / built-in snapshot) lives in extCatalog.ts; the merge with the
13
+ * legacy per-endpoint models lives in manifest.ts.
9
14
  */
10
15
  export const EXT_SUBMIT_PATH = '/ai-api/ai/ext/media/submit';
11
16
  export const EXT_ESTIMATE_PATH = '/ai-api/ai/ext/media/estimate';
12
- /** Integer seconds from `min` to `max` as strings. */
13
- function seconds(min, max) {
14
- return Array.from({ length: max - min + 1 }, (_, i) => String(min + i));
17
+ export const EXT_CATALOG_PATH = '/ai-api/ai/ext/media/catalog';
18
+ /**
19
+ * Parse + validate a catalog payload; null when unusable. Accepts the API envelope
20
+ * (`{code, data}`), the bare `data` object, and our own trimmed cache/snapshot shape (a subset of
21
+ * the same field names, so a parsed catalog round-trips through this function unchanged).
22
+ */
23
+ export function parseExtCatalog(raw, type) {
24
+ if (!isObject(raw))
25
+ return null;
26
+ const data = isObject(raw.data) ? raw.data : raw;
27
+ if (data.type !== undefined && data.type !== type)
28
+ return null;
29
+ if (!Array.isArray(data.models))
30
+ return null;
31
+ const models = data.models.map(parseModel).filter((m) => m !== null);
32
+ if (models.length === 0)
33
+ return null; // an empty catalog never replaces a working one
34
+ return { type, version: typeof data.version === 'string' ? data.version : '', models };
15
35
  }
16
- /** Canonical params → the ext request (`params` keys are the catalog's parameter keys). */
17
- function extRequest(def, p) {
18
- const params = {};
19
- if (p.aspectRatio)
20
- params.aspect_ratio = p.aspectRatio;
21
- if (p.resolution)
22
- params.resolution = p.resolution;
23
- if (p.quality)
24
- params.quality = p.quality;
25
- const inputs = {};
26
- if (def.type === 'image') {
27
- inputs.images = p.images ?? [];
36
+ function parseModel(raw) {
37
+ if (!isObject(raw))
38
+ return null;
39
+ const agentId = typeof raw.agentId === 'number' ? String(raw.agentId) : raw.agentId;
40
+ if (typeof agentId !== 'string' || !/^\d+$/.test(agentId))
41
+ return null;
42
+ if (typeof raw.path !== 'string' || typeof raw.form !== 'string')
43
+ return null;
44
+ const params = Array.isArray(raw.params) ? raw.params.map(parseParam).filter((p) => p !== null) : [];
45
+ const inputs = isObject(raw.inputs) ? { ...raw.inputs } : {};
46
+ delete inputs.accept;
47
+ return {
48
+ agentId,
49
+ name: typeof raw.name === 'string' ? raw.name : '',
50
+ path: raw.path,
51
+ form: raw.form,
52
+ params,
53
+ inputs,
54
+ };
55
+ }
56
+ function parseParam(raw) {
57
+ if (!isObject(raw) || typeof raw.key !== 'string' || typeof raw.type !== 'string')
58
+ return null;
59
+ const p = { key: raw.key, type: raw.type };
60
+ if (Array.isArray(raw.options)) {
61
+ p.options = raw.options
62
+ .filter((o) => isObject(o) && isPrimitive(o.value))
63
+ .map((o) => ({ value: o.value }));
28
64
  }
29
- else {
30
- if (p.duration !== undefined)
31
- params.duration = p.duration;
32
- if (p.generateAudio !== undefined && def.support.supportsAudio)
33
- params.native_audio = p.generateAudio;
34
- // Same first-frame rule as the legacy video models: --start-image wins, else the first -i.
35
- const first = p.startImage ?? p.images?.[0];
36
- if (first)
37
- inputs.firstFrame = first;
38
- if (p.endImage)
39
- inputs.lastFrame = p.endImage;
65
+ if (isPrimitive(raw.default))
66
+ p.default = raw.default;
67
+ if (typeof raw.required === 'boolean')
68
+ p.required = raw.required;
69
+ return p;
70
+ }
71
+ /**
72
+ * CLI ids of the models that shipped hard-coded in 0.2.5, pinned by agent id so they stay stable
73
+ * even if the catalog's `path` changes. Newer models derive their id from `path`.
74
+ */
75
+ export const EXT_ID_BY_AGENT = {
76
+ '6234': 'gpt-image-2.5',
77
+ '6252': 'nano-banana-2.1',
78
+ '6210': 'agnes-image-2.1-flash',
79
+ '6318': 'ideogram-4.5',
80
+ '6257': 'flux-3-image',
81
+ '6307': 'flux-3-klein',
82
+ '6183': 'seedream-5.0-pro',
83
+ '6258': 'seedream-5.0-flash',
84
+ '6202': 'seedance-2.5',
85
+ '6205': 'wan-3.0',
86
+ '6215': 'wan-3.0-prime',
87
+ '6218': 'agnes-video-2.5',
88
+ '6219': 'agnes-video-2.5-flash',
89
+ // Catalog path is the bare "flux", too generic next to the other FLUX models.
90
+ '4113': 'flux-1-dev',
91
+ };
92
+ /** Rules the catalog does not express (the backend still rejects them; this gives the clear hint). */
93
+ const QUALITIES_REQUIRING_IMAGE = {
94
+ '6318': ['very_low'], // ideogram-4.5 very_low only edits a source image
95
+ };
96
+ const ID_RE = /^[a-z0-9]+(?:[.-][a-z0-9]+)*$/;
97
+ /** Catalog `path` → CLI id: version digits get dots ("seedream-5-0-pro" → "seedream-5.0-pro"). */
98
+ export function extIdFromPath(path) {
99
+ const id = path.trim().toLowerCase().replace(/(\d)-(?=\d)/g, '$1.');
100
+ return id.length <= 64 && ID_RE.test(id) ? id : undefined;
101
+ }
102
+ /** Catalog → specs, in catalog order; first entry wins on an id clash. */
103
+ export function extSpecsFromCatalog(catalog, exclude) {
104
+ const out = [];
105
+ const seen = new Set();
106
+ for (const m of catalog.models) {
107
+ if (exclude.agentIds.has(m.agentId))
108
+ continue;
109
+ const spec = extSpecFromCatalogModel(m, catalog.type);
110
+ if (!spec || exclude.ids.has(spec.id) || seen.has(spec.id))
111
+ continue;
112
+ seen.add(spec.id);
113
+ out.push(spec);
40
114
  }
41
- return { agentId: def.agentId, prompt: p.prompt, params, inputs };
115
+ return out;
42
116
  }
43
- function extModel(def) {
117
+ /** Input keys the CLI fills itself, or that carry no requirement on their own. */
118
+ const HANDLED_INPUTS = new Set(['images', 'firstFrame', 'lastFrame', 'firstFrameRequired', 'exclusive']);
119
+ /** One catalog entry → spec; null when the CLI cannot drive it (see the skip rules inline). */
120
+ export function extSpecFromCatalogModel(m, type) {
121
+ // "external" entries link to a separate page (e.g. heygen-video) — not submittable here.
122
+ if (m.form !== 'standard')
123
+ return null;
124
+ const id = EXT_ID_BY_AGENT[m.agentId] ?? extIdFromPath(m.path);
125
+ if (!id)
126
+ return null;
127
+ // Inputs: the CLI sends source images (-i), a first frame (--start-image / first -i) and a last
128
+ // frame (--end-image). Optional reference images/videos/audios are simply not sent; a model that
129
+ // REQUIRES an input the CLI can't provide is skipped rather than offered and then rejected.
130
+ const inputs = m.inputs;
131
+ for (const [key, value] of Object.entries(inputs)) {
132
+ if (HANDLED_INPUTS.has(key))
133
+ continue;
134
+ if (isObject(value) && value.required === true)
135
+ return null;
136
+ if (key.endsWith('Required') && value === true)
137
+ return null;
138
+ }
139
+ const hasFirstFrame = inputs.firstFrame === true;
140
+ const hasLastFrame = hasFirstFrame && inputs.lastFrame === true;
141
+ if (inputs.firstFrameRequired === true && !hasFirstFrame)
142
+ return null;
143
+ const images = isObject(inputs.images) ? inputs.images : undefined;
144
+ const imagesMax = images && typeof images.max === 'number' && images.max >= 0 ? Math.floor(images.max) : undefined;
145
+ const sendsImages = !hasFirstFrame && imagesMax !== undefined;
146
+ const support = {
147
+ maxImages: hasFirstFrame ? 1 : (imagesMax ?? 0),
148
+ };
149
+ if ((sendsImages && images?.required === true) || inputs.firstFrameRequired === true)
150
+ support.requiresImage = true;
151
+ if (hasLastFrame)
152
+ support.supportsStartEndFrame = true;
153
+ // Params: only the ones a CLI flag maps onto. The backend rejects undeclared keys, so the body
154
+ // carries exactly the declared subset; everything else falls back to the backend default.
155
+ const declared = new Set();
156
+ for (const p of m.params) {
157
+ const values = (p.options ?? []).map((o) => String(o.value));
158
+ const enumOk = p.type === 'enum' && values.length > 0;
159
+ const def = p.default !== undefined ? String(p.default) : undefined;
160
+ let mapped = true;
161
+ if (p.key === 'aspect_ratio' && enumOk) {
162
+ support.aspectRatios = values;
163
+ }
164
+ else if (p.key === 'resolution' && enumOk) {
165
+ support.resolutions = values;
166
+ if (def && values.includes(def))
167
+ support.defaultResolution = def;
168
+ }
169
+ else if (p.key === 'quality' && enumOk) {
170
+ support.qualities = values;
171
+ if (def && values.includes(def))
172
+ support.defaultQuality = def;
173
+ const needsImage = (QUALITIES_REQUIRING_IMAGE[m.agentId] ?? []).filter((q) => values.includes(q));
174
+ if (needsImage.length)
175
+ support.qualitiesRequiringImage = needsImage;
176
+ }
177
+ else if (p.key === 'duration' && enumOk && values.every((v) => /^\d+$/.test(v))) {
178
+ support.durations = values;
179
+ if (def && values.includes(def))
180
+ support.defaultDuration = Number(def);
181
+ }
182
+ else if (p.key === 'native_audio' && p.type === 'boolean') {
183
+ support.supportsAudio = true;
184
+ }
185
+ else {
186
+ mapped = false;
187
+ }
188
+ if (mapped)
189
+ declared.add(p.key);
190
+ // A required param the CLI can't fill and the backend can't default → unusable model.
191
+ else if (p.required === true && p.default === undefined)
192
+ return null;
193
+ }
44
194
  return {
45
- ...def,
195
+ id,
196
+ displayName: cleanName(m.name) || id,
197
+ type,
198
+ agentId: m.agentId,
46
199
  ext: true,
47
200
  submitPath: EXT_SUBMIT_PATH,
48
- estimateModel: `ext:${def.agentId}`,
201
+ estimateModel: `ext:${m.agentId}`,
202
+ support,
49
203
  buildBody(p) {
50
- return extRequest(def, p);
204
+ const params = {};
205
+ if (declared.has('aspect_ratio') && p.aspectRatio)
206
+ params.aspect_ratio = p.aspectRatio;
207
+ if (declared.has('resolution') && p.resolution)
208
+ params.resolution = p.resolution;
209
+ if (declared.has('quality') && p.quality)
210
+ params.quality = p.quality;
211
+ if (declared.has('duration') && p.duration !== undefined)
212
+ params.duration = p.duration;
213
+ if (declared.has('native_audio') && p.generateAudio !== undefined)
214
+ params.native_audio = p.generateAudio;
215
+ const body = {};
216
+ if (hasFirstFrame) {
217
+ // Same first-frame rule as the legacy video models: --start-image wins, else the first -i.
218
+ const first = p.startImage ?? p.images?.[0];
219
+ if (first)
220
+ body.firstFrame = first;
221
+ if (hasLastFrame && p.endImage)
222
+ body.lastFrame = p.endImage;
223
+ }
224
+ else if (sendsImages) {
225
+ body.images = [...(p.startImage ? [p.startImage] : []), ...(p.images ?? [])];
226
+ }
227
+ return { agentId: m.agentId, prompt: p.prompt, params, inputs: body };
51
228
  },
52
229
  buildEstimateParams() {
53
230
  return {};
54
231
  },
55
232
  };
56
233
  }
57
- const NANO_21_RATIOS = ['auto', '1:1', '1:4', '1:8', '2:3', '3:2', '3:4', '4:1', '4:3', '4:5', '5:4', '8:1', '9:16', '16:9', '21:9'];
58
- const GPT_IMAGE_25_RATIOS = ['1:1', '16:9', '9:16', '4:3', '3:4', '3:2', '2:3', '5:4', '4:5', '2:1', '1:2', '21:9', '9:21'];
59
- const IDEOGRAM_45_RATIOS = ['auto', '1:1', '1:3', '3:1', '1:2', '2:1', '9:16', '16:9', '10:16', '16:10', '2:3', '3:2', '3:4', '4:3', '4:5', '5:4'];
60
- const FLUX3_RATIOS = ['auto', '21:9', '2:1', '16:9', '3:2', '7:5', '4:3', '5:4', '1:1', '4:5', '3:4', '5:7', '2:3', '9:16', '1:2', '9:21'];
61
- const FLUX3_RESOLUTIONS = ['1K', '768sq', '1.5K', '2K', '4K'];
62
- const WAN30_SUPPORT = {
63
- aspectRatios: ['16:9', '9:16', '1:1', '4:3', '3:4', 'auto'],
64
- resolutions: ['480P', '720P', '1080P'],
65
- defaultResolution: '480P',
66
- durations: seconds(2, 30),
67
- defaultDuration: 5,
68
- maxImages: 1,
69
- supportsAudio: true,
70
- supportsStartEndFrame: true,
71
- };
72
- const AGNES_VIDEO_RATIOS = ['16:9', '9:16', '1:1', '4:3', '3:4', '21:9'];
73
- export const EXT_IMAGE_MODELS = [
74
- extModel({
75
- id: 'gpt-image-2.5',
76
- displayName: 'GPT Image 2.5',
77
- type: 'image',
78
- agentId: '6234',
79
- support: { aspectRatios: GPT_IMAGE_25_RATIOS, maxImages: 10 },
80
- }),
81
- extModel({
82
- id: 'nano-banana-2.1',
83
- displayName: 'Nano Banana 2.1',
84
- type: 'image',
85
- agentId: '6252',
86
- support: { aspectRatios: NANO_21_RATIOS, resolutions: ['1K', '2K', '4K'], defaultResolution: '1K', maxImages: 14 },
87
- }),
88
- extModel({
89
- id: 'agnes-image-2.1-flash',
90
- displayName: 'Agnes Image 2.1 Flash',
91
- type: 'image',
92
- agentId: '6210',
93
- support: {
94
- aspectRatios: ['1:1', '4:3', '3:4', '16:9', '9:16', '3:2', '2:3'],
95
- resolutions: ['1K', '2K', '4K'],
96
- defaultResolution: '1K',
97
- maxImages: 10,
98
- },
99
- }),
100
- extModel({
101
- id: 'ideogram-4.5',
102
- displayName: 'Ideogram 4.5',
103
- type: 'image',
104
- agentId: '6318',
105
- support: {
106
- aspectRatios: IDEOGRAM_45_RATIOS,
107
- resolutions: ['2K', '1K'],
108
- defaultResolution: '2K',
109
- maxImages: 5, // source images; the first is edited
110
- qualities: ['high', 'medium', 'low', 'very_low'],
111
- defaultQuality: 'high',
112
- qualitiesRequiringImage: ['very_low'],
113
- },
114
- }),
115
- extModel({
116
- id: 'flux-3-image',
117
- displayName: 'FLUX 3 Image',
118
- type: 'image',
119
- agentId: '6257',
120
- support: { aspectRatios: FLUX3_RATIOS, resolutions: FLUX3_RESOLUTIONS, defaultResolution: '1K', maxImages: 10 },
121
- }),
122
- extModel({
123
- id: 'flux-3-klein',
124
- displayName: 'FLUX.3 Klein',
125
- type: 'image',
126
- agentId: '6307',
127
- support: { aspectRatios: FLUX3_RATIOS, resolutions: FLUX3_RESOLUTIONS, defaultResolution: '1K', maxImages: 10 },
128
- }),
129
- extModel({
130
- id: 'seedream-5.0-pro',
131
- displayName: 'Seedream 5.0 Pro',
132
- type: 'image',
133
- agentId: '6183',
134
- support: {
135
- aspectRatios: ['1:1', '4:3', '3:4', '16:9', '9:16', '2:3', '3:2', '21:9', '9:21'],
136
- resolutions: ['2K', '1K'],
137
- defaultResolution: '2K',
138
- maxImages: 10,
139
- },
140
- }),
141
- extModel({
142
- id: 'seedream-5.0-flash',
143
- displayName: 'Seedream 5.0 Flash',
144
- type: 'image',
145
- agentId: '6258',
146
- support: {
147
- aspectRatios: ['1:1', 'auto', '4:3', '3:4', '16:9', '9:16', '3:2', '2:3', '2:1', '1:2', '21:9'],
148
- resolutions: ['2K', '1.5K', '1K'],
149
- defaultResolution: '2K',
150
- maxImages: 10,
151
- },
152
- }),
153
- ];
154
- export const EXT_VIDEO_MODELS = [
155
- extModel({
156
- id: 'seedance-2.5',
157
- displayName: 'Seedance 2.5',
158
- type: 'video',
159
- agentId: '6202',
160
- support: {
161
- aspectRatios: ['auto', '16:9', '9:16', '1:1', '4:3', '3:4', '21:9'],
162
- resolutions: ['480p', '720p'],
163
- defaultResolution: '480p',
164
- durations: seconds(4, 30),
165
- defaultDuration: 4,
166
- maxImages: 1,
167
- supportsAudio: true,
168
- supportsStartEndFrame: true,
169
- },
170
- }),
171
- extModel({ id: 'wan-3.0', displayName: 'Wan 3.0', type: 'video', agentId: '6205', support: WAN30_SUPPORT }),
172
- extModel({ id: 'wan-3.0-prime', displayName: 'Wan 3.0 Prime', type: 'video', agentId: '6215', support: WAN30_SUPPORT }),
173
- extModel({
174
- id: 'agnes-video-2.5',
175
- displayName: 'Agnes Video 2.5',
176
- type: 'video',
177
- agentId: '6218',
178
- support: {
179
- aspectRatios: AGNES_VIDEO_RATIOS,
180
- resolutions: ['720P', '960P', '2K'],
181
- defaultResolution: '720P',
182
- durations: seconds(4, 12),
183
- defaultDuration: 5,
184
- maxImages: 1,
185
- supportsStartEndFrame: true,
186
- },
187
- }),
188
- extModel({
189
- id: 'agnes-video-2.5-flash',
190
- displayName: 'Agnes Video 2.5 Flash',
191
- type: 'video',
192
- agentId: '6219',
193
- support: {
194
- aspectRatios: AGNES_VIDEO_RATIOS,
195
- resolutions: ['720P'],
196
- defaultResolution: '720P',
197
- durations: seconds(4, 12),
198
- defaultDuration: 5,
199
- maxImages: 1,
200
- supportsStartEndFrame: true,
201
- },
202
- }),
203
- ];
234
+ /** Display names come from the network: strip control chars (no terminal escape injection). */
235
+ function cleanName(name) {
236
+ return name.replace(/[\u0000-\u001f\u007f-\u009f]/g, '').trim().slice(0, 80);
237
+ }
238
+ function isObject(v) {
239
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
240
+ }
241
+ function isPrimitive(v) {
242
+ return typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean';
243
+ }
204
244
  //# sourceMappingURL=extModels.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"extModels.js","sourceRoot":"","sources":["../../../src/media/extModels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extModels.js","sourceRoot":"","sources":["../../../src/media/extModels.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,15 @@
1
1
  import { MediaGenParams, ModelSpec } from './types.js';
2
+ import { type ExtCatalog } from './extModels.js';
2
3
  export declare const IMAGE_MODELS: ModelSpec[];
3
4
  export declare const VIDEO_MODELS: ModelSpec[];
4
5
  export declare const ALL_MODELS: ModelSpec[];
6
+ /**
7
+ * Replace one media type's ext models with those generated from `catalog` (legacy ids and agent
8
+ * ids always win). Returns how many ext models that type now has.
9
+ */
10
+ export declare function applyExtCatalog(catalog: ExtCatalog): number;
11
+ /** Back to the built-in catalog snapshot (startup state; also a test hook). */
12
+ export declare function resetExtCatalog(): void;
5
13
  export declare const DEFAULT_IMAGE_MODEL = "nano-banana-2";
6
14
  export declare const DEFAULT_VIDEO_MODEL = "grok-imagine-video";
7
15
  /** Apply the server's disabled-model overlay (unknown ids are fine — future models). */
@@ -1,9 +1,11 @@
1
1
  import { ParamValidationError } from './types.js';
2
2
  import { toImageResolution, toVideoResolution } from './resolution.js';
3
- import { EXT_IMAGE_MODELS, EXT_VIDEO_MODELS } from './extModels.js';
3
+ import { extSpecsFromCatalog, parseExtCatalog } from './extModels.js';
4
+ import { EXT_CATALOG_SNAPSHOT } from './extCatalogSnapshot.js';
4
5
  /**
5
- * Curated model manifest. Models with `ext: true` (src/media/extModels.ts) go through the shared
6
- * /ai-api/ai/ext/media endpoints instead of a per-model body; the rest are listed here.
6
+ * Curated model manifest. The hand-written (legacy) models below each have their own endpoint and
7
+ * body; every other model comes from the backend's ext/media catalog (src/media/extModels.ts,
8
+ * loaded by src/media/extCatalog.ts) and goes through the shared /ai-api/ai/ext/media endpoints.
7
9
  *
8
10
  * yanfa exposes no per-model param schema, so support + the canonical→endpoint body mapping are
9
11
  * declared here. Submit bodies mirror glb_site's image-generator (verified 2026-07-15):
@@ -18,7 +20,7 @@ const SEEDREAM_RATIOS = ['1:1', '4:3', '3:4', '16:9', '9:16', '2:3', '3:2', '21:
18
20
  const IDEOGRAM_RATIOS = ['1:1', '16:9', '9:16', '4:3', '3:4', '3:2', '2:3', '4:5', '5:4', '16:10', '10:16', '2:1', '1:2', '3:1', '1:3'];
19
21
  // Model ids match the backend estimate catalog (DefaultMediaModelCatalog): the estimateModel is
20
22
  // the catalog id, and estimatePrice was verified live (2026-07-15) against the test env.
21
- export const IMAGE_MODELS = [
23
+ const LEGACY_IMAGE_MODELS = [
22
24
  {
23
25
  id: 'nano-banana-2',
24
26
  displayName: 'Nano Banana 2',
@@ -183,8 +185,6 @@ export const IMAGE_MODELS = [
183
185
  ...ideogram3('ideogram-3.0-turbo', 'Ideogram 3.0 Turbo', '6082', 'Ideogram 3.0 turbo'),
184
186
  ...ideogram3('ideogram-3.0', 'Ideogram 3.0', '6083', 'Ideogram 3.0 Default'),
185
187
  ...ideogram3('ideogram-3.0-quality', 'Ideogram 3.0 Quality', '6084', 'Ideogram 3.0 quality'),
186
- // 2026-10-22: newer site models, routed through the shared ext/media endpoints.
187
- ...EXT_IMAGE_MODELS,
188
188
  ];
189
189
  /**
190
190
  * The three Ideogram 3.0 tiers share one endpoint/shape; only agentId + model string differ.
@@ -242,7 +242,7 @@ function firstFrame(p) {
242
242
  return p.startImage ?? p.images?.[0];
243
243
  }
244
244
  // Video models with backend estimate support (DefaultMediaModelCatalog); verified live 2026-07-15.
245
- export const VIDEO_MODELS = [
245
+ const LEGACY_VIDEO_MODELS = [
246
246
  {
247
247
  id: 'grok-imagine-video',
248
248
  displayName: 'Grok Imagine (video)',
@@ -394,7 +394,6 @@ export const VIDEO_MODELS = [
394
394
  return { resolution: p.resolution, duration_seconds: p.duration };
395
395
  },
396
396
  },
397
- ...EXT_VIDEO_MODELS,
398
397
  ];
399
398
  /** Seedance 2.0 tiers share one endpoint; only the model string / agentId differ. */
400
399
  function seedance2(id, displayName, agentId) {
@@ -442,8 +441,45 @@ function seedance2(id, displayName, agentId) {
442
441
  },
443
442
  ];
444
443
  }
445
- export const ALL_MODELS = [...IMAGE_MODELS, ...VIDEO_MODELS];
446
- const BY_ID = new Map(ALL_MODELS.map((m) => [m.id, m]));
444
+ // Live lists: legacy specs first, then the ext catalog's. They are updated IN PLACE when a
445
+ // catalog applies, so every importer of these arrays sees the current set.
446
+ export const IMAGE_MODELS = [];
447
+ export const VIDEO_MODELS = [];
448
+ export const ALL_MODELS = [];
449
+ let BY_ID = new Map();
450
+ const LEGACY_EXCLUSIONS = {
451
+ ids: new Set([...LEGACY_IMAGE_MODELS, ...LEGACY_VIDEO_MODELS].map((m) => m.id)),
452
+ agentIds: new Set([...LEGACY_IMAGE_MODELS, ...LEGACY_VIDEO_MODELS].map((m) => m.agentId)),
453
+ };
454
+ const extModels = { image: [], video: [] };
455
+ function rebuildModelLists() {
456
+ const ids = new Set(LEGACY_EXCLUSIONS.ids);
457
+ const fresh = (specs) => specs.filter((m) => !ids.has(m.id) && ids.add(m.id));
458
+ const image = [...LEGACY_IMAGE_MODELS, ...fresh(extModels.image)];
459
+ const video = [...LEGACY_VIDEO_MODELS, ...fresh(extModels.video)];
460
+ IMAGE_MODELS.splice(0, IMAGE_MODELS.length, ...image);
461
+ VIDEO_MODELS.splice(0, VIDEO_MODELS.length, ...video);
462
+ ALL_MODELS.splice(0, ALL_MODELS.length, ...image, ...video);
463
+ BY_ID = new Map(ALL_MODELS.map((m) => [m.id, m]));
464
+ }
465
+ /**
466
+ * Replace one media type's ext models with those generated from `catalog` (legacy ids and agent
467
+ * ids always win). Returns how many ext models that type now has.
468
+ */
469
+ export function applyExtCatalog(catalog) {
470
+ extModels[catalog.type] = extSpecsFromCatalog(catalog, LEGACY_EXCLUSIONS);
471
+ rebuildModelLists();
472
+ return extModels[catalog.type].length;
473
+ }
474
+ /** Back to the built-in catalog snapshot (startup state; also a test hook). */
475
+ export function resetExtCatalog() {
476
+ for (const type of ['image', 'video']) {
477
+ const snapshot = parseExtCatalog(EXT_CATALOG_SNAPSHOT[type], type);
478
+ extModels[type] = snapshot ? extSpecsFromCatalog(snapshot, LEGACY_EXCLUSIONS) : [];
479
+ }
480
+ rebuildModelLists();
481
+ }
482
+ resetExtCatalog();
447
483
  export const DEFAULT_IMAGE_MODEL = 'nano-banana-2';
448
484
  export const DEFAULT_VIDEO_MODEL = 'grok-imagine-video';
449
485
  // Server-driven availability overlay (GET /ai-api/cli/v1/models via src/core/catalog.ts):