@mlx-node/lm 0.0.9 → 0.0.12

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.
@@ -0,0 +1,407 @@
1
+ /**
2
+ * Native-free per-family registration rows plus the pure `matchFamily`
3
+ * detection they drive.
4
+ *
5
+ * This module must stay free of runtime imports (`import type` only): it is
6
+ * re-exported through the native-free `@mlx-node/agent/catalog` subpath to the
7
+ * dashboard viewer process, which must never dlopen the Metal addon.
8
+ * `packages/agent/__test__/catalog-native-free.test.ts` gates that contract.
9
+ */
10
+ import type { ChatConfig } from '@mlx-node/core';
11
+ export type ModelFamilyKind = 'trainable' | 'loadable' | 'embedding' | 'vlm';
12
+ export interface NormalizedModelConfig {
13
+ readonly usesDefaultModelType: boolean;
14
+ readonly rawModelType: string | undefined;
15
+ readonly rawModelTypeLabel: string;
16
+ readonly architectures: ReadonlySet<string>;
17
+ }
18
+ export interface ModelConfigMatchContext extends NormalizedModelConfig {
19
+ readonly modelType: string | undefined;
20
+ }
21
+ export interface ModelConfigMatcher {
22
+ /** Exact raw `config.json` model_type values owned by this family. */
23
+ readonly rawModelTypes: readonly string[];
24
+ /** Optional higher-priority architecture probe for shared or absent model_type values. */
25
+ readonly architectureProbe?: (config: ModelConfigMatchContext) => boolean;
26
+ }
27
+ /**
28
+ * Structural mirror of pi's `ProviderModelConfig['thinkingLevelMap']`. Declared
29
+ * here because pi types are agent-only; `packages/agent/src/provider/models.ts`
30
+ * pins assignability with a `satisfies` check at its use site.
31
+ */
32
+ export interface FamilyThinkingLevelMap {
33
+ readonly off?: string | null;
34
+ readonly minimal?: string | null;
35
+ readonly low?: string | null;
36
+ readonly medium?: string | null;
37
+ readonly high?: string | null;
38
+ readonly xhigh?: string | null;
39
+ readonly max?: string | null;
40
+ }
41
+ export interface FamilyTraits {
42
+ /**
43
+ * Whether the family emits `<think>` reasoning (drives pi's thinking
44
+ * levels). Gemma4 routes its `<|channel>thought` protocol through its
45
+ * family stream parser rather than the generic `<think>` tracker, but the
46
+ * user-facing level still controls the prompt's `<|think|>` capability.
47
+ */
48
+ readonly reasoning: boolean;
49
+ /**
50
+ * Optional family-specific projection of Pi's thinking controls. Gemma4's
51
+ * prompt protocol has two modes rather than four distinct effort levels:
52
+ * minimal disables `<|think|>` and high enables it.
53
+ */
54
+ readonly thinkingLevelMap?: FamilyThinkingLevelMap;
55
+ /**
56
+ * Context-window fallback when `config.json` carries no
57
+ * `max_position_embeddings` at either nesting level.
58
+ *
59
+ * A family's VOCAB size is never the right value here — the two are
60
+ * unrelated numbers that happen to collide on some checkpoints
61
+ * (nemotron_h is 131072 vocab / 1048576 context).
62
+ */
63
+ readonly fallbackContextWindow: number;
64
+ }
65
+ /**
66
+ * Sampling defaults from Unsloth's Qwen3.6 guide:
67
+ * https://unsloth.ai/docs/models/qwen3.6#recommended-settings
68
+ *
69
+ * All modes pin `top_k = 20` and `min_p = 0.0`; they differ in
70
+ * `temperature`, `top_p`, and `presence_penalty`.
71
+ *
72
+ * Deliberately no `maxConsecutiveTokens` / `maxNgramRepeats` / `ngramSize`: the
73
+ * native anti-repetition cutoff is off by default (vLLM-aligned), and a client
74
+ * can still opt in per request.
75
+ */
76
+ export declare const QWEN_SAMPLING_DEFAULTS: {
77
+ /** Thinking mode for precise coding tasks. */
78
+ readonly thinkingCoding: {
79
+ temperature: number;
80
+ topP: number;
81
+ topK: number;
82
+ minP: number;
83
+ presencePenalty: number;
84
+ repetitionPenalty: number;
85
+ };
86
+ /** Thinking mode for general tasks. */
87
+ readonly thinkingGeneral: {
88
+ temperature: number;
89
+ topP: number;
90
+ topK: number;
91
+ minP: number;
92
+ presencePenalty: number;
93
+ repetitionPenalty: number;
94
+ };
95
+ /** Instruct (non-thinking) for general tasks. */
96
+ readonly instructGeneral: {
97
+ temperature: number;
98
+ topP: number;
99
+ topK: number;
100
+ minP: number;
101
+ presencePenalty: number;
102
+ repetitionPenalty: number;
103
+ };
104
+ /** Instruct (non-thinking) for reasoning tasks. */
105
+ readonly instructReasoning: {
106
+ temperature: number;
107
+ topP: number;
108
+ topK: number;
109
+ minP: number;
110
+ presencePenalty: number;
111
+ repetitionPenalty: number;
112
+ };
113
+ };
114
+ /** Sampling defaults for Gemma4 Instruct. */
115
+ export declare const GEMMA4_SAMPLING_DEFAULTS: ChatConfig;
116
+ /** Sampling defaults from Meta's Muse-Glimmer release recipe. */
117
+ export declare const MUSE_GLIMMER_SAMPLING_DEFAULTS: ChatConfig;
118
+ /** Sampling defaults from NVIDIA's Nemotron 3.5 Lightning release recipe. */
119
+ export declare const NEMOTRON_SAMPLING_DEFAULTS: ChatConfig;
120
+ /** Sampling defaults for LFM2.5 Thinking. */
121
+ export declare const LFM2_SAMPLING_DEFAULTS: ChatConfig;
122
+ /**
123
+ * Sampling defaults + per-model output cap. A per-request client value still
124
+ * wins: `ChatSession.mergeConfig` treats per-call config as an overlay on top
125
+ * of `defaultConfig`.
126
+ */
127
+ export interface LaunchPreset {
128
+ sampling: ChatConfig;
129
+ maxOutputTokens: number;
130
+ }
131
+ interface ModelFamilyDataBase {
132
+ /** Canonical `ModelType` id. */
133
+ readonly id: string;
134
+ readonly match: ModelConfigMatcher;
135
+ /** Backward-compatible fallback when config.json omits model_type or sets it to null. */
136
+ readonly defaultForNullishModelType?: true;
137
+ readonly acceptsDraftModel?: true;
138
+ /**
139
+ * GGUF `general.architecture` values whose native `load(path)` accepts a
140
+ * direct GGUF file. Qwen3.5-MoE currently consumes converted directories,
141
+ * not direct files, so it carries none.
142
+ */
143
+ readonly ggufArchitectures?: readonly string[];
144
+ }
145
+ /**
146
+ * A chat-capable family MUST declare `traits` and a `launchPreset` — the
147
+ * compile-time completeness gate. One preset serves every surface:
148
+ * `@mlx-node/server` discovery, `mlx launch claude` and `mlx agent`. A chat
149
+ * family is therefore reachable from all of them or from none, never from one
150
+ * and not another.
151
+ */
152
+ interface ChatFamilyData extends ModelFamilyDataBase {
153
+ readonly kind: 'trainable' | 'loadable';
154
+ readonly traits: FamilyTraits;
155
+ readonly launchPreset: LaunchPreset;
156
+ }
157
+ interface NonGenerativeFamilyData extends ModelFamilyDataBase {
158
+ readonly kind: 'embedding' | 'vlm';
159
+ readonly traits?: undefined;
160
+ readonly launchPreset?: undefined;
161
+ }
162
+ export type ModelFamilyData = ChatFamilyData | NonGenerativeFamilyData;
163
+ /**
164
+ * Ordered source of truth for every supported model family's registration
165
+ * data. Each entry owns its canonical `ModelType`, raw config aliases /
166
+ * architecture probes, and `ChatSession` eligibility via `kind`:
167
+ *
168
+ * - `'trainable'` — GRPO/SFT-capable LM (Qwen3 family); chat-capable.
169
+ * - `'loadable'` — chat-capable LM with no trainer engine (Gemma4, LFM2).
170
+ * - `'embedding'` — no chat surface (Harrier); rejected by `loadSession`.
171
+ * - `'vlm'` — VLM whose AsyncGenerator wrapper lives in
172
+ * `@mlx-node/vlm` (importing it here would create a
173
+ * circular package dependency), so `loadSession`
174
+ * rejects it and routes callers to `@mlx-node/vlm`.
175
+ *
176
+ * ORDER IS LOAD-BEARING: a base family is selected from an explicit alias or
177
+ * the single declarative nullish-model_type default, then architecture probes
178
+ * refine it in declaration order. Gemma's unified architecture is
179
+ * authoritative (matching the native loader); Harrier refines a Qwen3 base.
180
+ * Adding a family means adding one data row here plus one loader binding in
181
+ * `models/model-loader.ts`; the row type and the family-completeness test
182
+ * enumerate everything else.
183
+ */
184
+ export declare const MODEL_FAMILY_DATA: readonly [{
185
+ readonly id: 'gemma4';
186
+ readonly kind: 'loadable';
187
+ readonly match: {
188
+ readonly rawModelTypes: readonly ["gemma4", "gemma4_text", "gemma4_unified"];
189
+ readonly architectureProbe: ({ architectures }: ModelConfigMatchContext) => boolean;
190
+ };
191
+ readonly acceptsDraftModel: true;
192
+ readonly traits: {
193
+ readonly reasoning: true;
194
+ readonly thinkingLevelMap: {
195
+ readonly minimal: 'minimal';
196
+ readonly low: null;
197
+ readonly medium: null;
198
+ readonly high: 'high';
199
+ };
200
+ readonly fallbackContextWindow: 131072;
201
+ };
202
+ readonly launchPreset: {
203
+ readonly sampling: ChatConfig;
204
+ readonly maxOutputTokens: 16384;
205
+ };
206
+ }, {
207
+ readonly id: 'muse_glimmer';
208
+ readonly kind: 'loadable';
209
+ readonly match: {
210
+ readonly rawModelTypes: readonly ["muse_glimmer", "muse_glimmer_text"];
211
+ readonly architectureProbe: ({ architectures }: ModelConfigMatchContext) => boolean;
212
+ };
213
+ readonly traits: {
214
+ readonly reasoning: true;
215
+ readonly fallbackContextWindow: 131072;
216
+ };
217
+ readonly launchPreset: {
218
+ readonly sampling: ChatConfig;
219
+ readonly maxOutputTokens: 16384;
220
+ };
221
+ }, {
222
+ readonly id: 'harrier';
223
+ readonly kind: 'embedding';
224
+ readonly match: {
225
+ readonly rawModelTypes: readonly ["harrier"];
226
+ readonly architectureProbe: ({ modelType, architectures }: ModelConfigMatchContext) => boolean;
227
+ };
228
+ }, {
229
+ readonly id: 'qwen3';
230
+ readonly kind: 'trainable';
231
+ readonly match: {
232
+ readonly rawModelTypes: readonly ["qwen3"];
233
+ };
234
+ readonly defaultForNullishModelType: true;
235
+ readonly traits: {
236
+ readonly reasoning: true;
237
+ readonly fallbackContextWindow: 40960;
238
+ };
239
+ readonly launchPreset: {
240
+ readonly sampling: {
241
+ temperature: number;
242
+ topP: number;
243
+ topK: number;
244
+ minP: number;
245
+ presencePenalty: number;
246
+ repetitionPenalty: number;
247
+ };
248
+ readonly maxOutputTokens: 38912;
249
+ };
250
+ }, {
251
+ readonly id: 'qwen3_5';
252
+ readonly kind: 'trainable';
253
+ readonly match: {
254
+ readonly rawModelTypes: readonly ["qwen3_5"];
255
+ };
256
+ readonly acceptsDraftModel: true;
257
+ readonly ggufArchitectures: readonly ["qwen35"];
258
+ readonly traits: {
259
+ readonly reasoning: true;
260
+ readonly fallbackContextWindow: 262144;
261
+ };
262
+ readonly launchPreset: {
263
+ readonly sampling: {
264
+ temperature: number;
265
+ topP: number;
266
+ topK: number;
267
+ minP: number;
268
+ presencePenalty: number;
269
+ repetitionPenalty: number;
270
+ };
271
+ readonly maxOutputTokens: 81920;
272
+ };
273
+ }, {
274
+ readonly id: 'qwen3_5_moe';
275
+ readonly kind: 'trainable';
276
+ readonly match: {
277
+ readonly rawModelTypes: readonly ["qwen3_5_moe"];
278
+ };
279
+ readonly traits: {
280
+ readonly reasoning: true;
281
+ readonly fallbackContextWindow: 262144;
282
+ };
283
+ readonly launchPreset: {
284
+ readonly sampling: {
285
+ temperature: number;
286
+ topP: number;
287
+ topK: number;
288
+ minP: number;
289
+ presencePenalty: number;
290
+ repetitionPenalty: number;
291
+ };
292
+ readonly maxOutputTokens: 81920;
293
+ };
294
+ }, {
295
+ readonly id: 'lfm2';
296
+ readonly kind: 'loadable';
297
+ readonly match: {
298
+ readonly rawModelTypes: readonly ["lfm2"];
299
+ };
300
+ readonly traits: {
301
+ readonly reasoning: true;
302
+ readonly fallbackContextWindow: 128000;
303
+ };
304
+ readonly launchPreset: {
305
+ readonly sampling: ChatConfig;
306
+ readonly maxOutputTokens: 8192;
307
+ };
308
+ }, {
309
+ readonly id: 'lfm2_moe';
310
+ readonly kind: 'loadable';
311
+ readonly match: {
312
+ readonly rawModelTypes: readonly ["lfm2_moe"];
313
+ };
314
+ readonly traits: {
315
+ readonly reasoning: true;
316
+ readonly fallbackContextWindow: 128000;
317
+ };
318
+ /**
319
+ * LFM2.5-8B-A1B: LiquidAI's MoE card recommends temperature 0.2 / top_k 80
320
+ * — deliberately NOT the dense `lfm2` values (0.05 / 50).
321
+ */
322
+ readonly launchPreset: {
323
+ readonly sampling: {
324
+ readonly temperature: 0.2;
325
+ readonly topP: 1;
326
+ readonly topK: 80;
327
+ readonly minP: 0;
328
+ readonly presencePenalty: 0;
329
+ readonly repetitionPenalty: 1.05;
330
+ };
331
+ readonly maxOutputTokens: 8192;
332
+ };
333
+ }, {
334
+ readonly id: 'nemotron_h';
335
+ readonly kind: 'loadable';
336
+ readonly match: {
337
+ readonly rawModelTypes: readonly ["nemotron_h"];
338
+ readonly architectureProbe: ({ architectures }: ModelConfigMatchContext) => boolean;
339
+ };
340
+ readonly traits: {
341
+ readonly reasoning: true;
342
+ readonly fallbackContextWindow: 1048576;
343
+ };
344
+ readonly launchPreset: {
345
+ readonly sampling: ChatConfig;
346
+ readonly maxOutputTokens: 32768;
347
+ };
348
+ }, {
349
+ readonly id: 'internvl_chat';
350
+ readonly kind: 'vlm';
351
+ readonly match: {
352
+ readonly rawModelTypes: readonly ["internvl_chat"];
353
+ };
354
+ }, {
355
+ readonly id: 'qianfan-ocr';
356
+ readonly kind: 'vlm';
357
+ readonly match: {
358
+ readonly rawModelTypes: readonly ["qianfan-ocr"];
359
+ };
360
+ }];
361
+ type FamilyDataRow = (typeof MODEL_FAMILY_DATA)[number];
362
+ export type ModelType = FamilyDataRow['id'];
363
+ type ChatFamilyRow = Extract<FamilyDataRow, {
364
+ readonly kind: 'trainable' | 'loadable';
365
+ }>;
366
+ export type ChatFamilyId = ChatFamilyRow['id'];
367
+ export type TrainableFamilyId = Extract<FamilyDataRow, {
368
+ readonly kind: 'trainable';
369
+ }>['id'];
370
+ /**
371
+ * Every chat-capable family (kind trainable | loadable), in registry order —
372
+ * the default set the paged-config override manager forces onto the block-paged
373
+ * path. Derived, so a new chat family can never be forgotten.
374
+ */
375
+ export declare const CHAT_FAMILY_IDS: readonly ChatFamilyId[];
376
+ /** Detection results that cannot back a chat endpoint (kind embedding | vlm). */
377
+ export declare const NON_GENERATIVE_FAMILY_IDS: ReadonlySet<ModelType>;
378
+ /** Registration data for a canonical family id, or `undefined` for a foreign string. */
379
+ export declare function familyDataFor(modelType: string): ModelFamilyData | undefined;
380
+ /** Canonical family id owning a raw `config.json` model_type alias. */
381
+ export declare function rawModelTypeToCanonical(rawModelType: string): ModelType | undefined;
382
+ /** Agent discovery traits for a chat-capable family. */
383
+ export declare function familyTraitsFor(modelType: string): FamilyTraits | undefined;
384
+ /**
385
+ * Launch preset for every surface that serves a chat family:
386
+ * `@mlx-node/server` discovery, `mlx launch claude` and `mlx agent`.
387
+ * `undefined` only for a non-generative family or an unknown type.
388
+ */
389
+ export declare function launchPresetFor(modelType: string): LaunchPreset | undefined;
390
+ export declare class MalformedModelConfigError extends Error {
391
+ constructor(modelPath: string, reason: string);
392
+ }
393
+ export declare class UnsupportedModelTypeError extends Error {
394
+ constructor(modelPath: string, rawModelTypeLabel: string);
395
+ }
396
+ /**
397
+ * Pure family detection over a parsed `config.json`: alias (or the qwen3
398
+ * nullish default) picks a base family, then architecture probes refine it in
399
+ * registry declaration order. Throws {@link MalformedModelConfigError} /
400
+ * {@link UnsupportedModelTypeError} with `modelPath` naming the checkpoint.
401
+ * The filesystem/GGUF half lives in `detectModelType`
402
+ * (`models/model-loader.ts`); native-free consumers (dashboard labels via
403
+ * `@mlx-node/agent/catalog`) call this directly.
404
+ */
405
+ export declare function matchFamily(modelPath: string, parsedConfig: unknown): ModelType;
406
+ export {};
407
+ //# sourceMappingURL=family-data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"family-data.d.ts","sourceRoot":"","sources":["../src/family-data.ts"],"names":[],"mappings":"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"}