@mlx-node/server 0.0.0

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.
Files changed (61) hide show
  1. package/dist/endpoints/messages.d.ts +13 -0
  2. package/dist/endpoints/messages.d.ts.map +1 -0
  3. package/dist/endpoints/messages.js +511 -0
  4. package/dist/endpoints/models.d.ts +5 -0
  5. package/dist/endpoints/models.d.ts.map +1 -0
  6. package/dist/endpoints/models.js +10 -0
  7. package/dist/endpoints/responses.d.ts +79 -0
  8. package/dist/endpoints/responses.d.ts.map +1 -0
  9. package/dist/endpoints/responses.js +2816 -0
  10. package/dist/errors.d.ts +43 -0
  11. package/dist/errors.d.ts.map +1 -0
  12. package/dist/errors.js +84 -0
  13. package/dist/handler.d.ts +18 -0
  14. package/dist/handler.d.ts.map +1 -0
  15. package/dist/handler.js +35 -0
  16. package/dist/index.d.ts +23 -0
  17. package/dist/index.d.ts.map +1 -0
  18. package/dist/index.js +16 -0
  19. package/dist/mappers/anthropic-request.d.ts +9 -0
  20. package/dist/mappers/anthropic-request.d.ts.map +1 -0
  21. package/dist/mappers/anthropic-request.js +241 -0
  22. package/dist/mappers/anthropic-response.d.ts +14 -0
  23. package/dist/mappers/anthropic-response.d.ts.map +1 -0
  24. package/dist/mappers/anthropic-response.js +112 -0
  25. package/dist/mappers/request.d.ts +18 -0
  26. package/dist/mappers/request.d.ts.map +1 -0
  27. package/dist/mappers/request.js +206 -0
  28. package/dist/mappers/response.d.ts +13 -0
  29. package/dist/mappers/response.d.ts.map +1 -0
  30. package/dist/mappers/response.js +116 -0
  31. package/dist/pending-writes.d.ts +337 -0
  32. package/dist/pending-writes.d.ts.map +1 -0
  33. package/dist/pending-writes.js +468 -0
  34. package/dist/registry.d.ts +363 -0
  35. package/dist/registry.d.ts.map +1 -0
  36. package/dist/registry.js +497 -0
  37. package/dist/router.d.ts +6 -0
  38. package/dist/router.d.ts.map +1 -0
  39. package/dist/router.js +78 -0
  40. package/dist/server.d.ts +80 -0
  41. package/dist/server.d.ts.map +1 -0
  42. package/dist/server.js +158 -0
  43. package/dist/session-registry.d.ts +297 -0
  44. package/dist/session-registry.d.ts.map +1 -0
  45. package/dist/session-registry.js +403 -0
  46. package/dist/streaming.d.ts +7 -0
  47. package/dist/streaming.d.ts.map +1 -0
  48. package/dist/streaming.js +16 -0
  49. package/dist/tool-call-buffer.d.ts +26 -0
  50. package/dist/tool-call-buffer.d.ts.map +1 -0
  51. package/dist/tool-call-buffer.js +51 -0
  52. package/dist/transport-visibility.d.ts +56 -0
  53. package/dist/transport-visibility.d.ts.map +1 -0
  54. package/dist/transport-visibility.js +161 -0
  55. package/dist/types-anthropic.d.ts +144 -0
  56. package/dist/types-anthropic.d.ts.map +1 -0
  57. package/dist/types-anthropic.js +2 -0
  58. package/dist/types.d.ts +220 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +2 -0
  61. package/package.json +36 -0
@@ -0,0 +1,363 @@
1
+ /**
2
+ * ModelRegistry -- maps friendly model names to loaded model instances.
3
+ *
4
+ * All models exposing the chat-session surface (see `SessionCapableModel`
5
+ * from `@mlx-node/lm`) are eligible for serving. Every registered model
6
+ * is paired with a `SessionRegistry` — an LRU+TTL cache of live
7
+ * `ChatSession` instances keyed by server-allocated response id.
8
+ *
9
+ * **Model-instance identity, not name.** Session registries are keyed
10
+ * by MODEL OBJECT identity. The single-warm-session invariant
11
+ * enforced by `SessionRegistry` is a property of the underlying
12
+ * `SessionCapableModel` (one shared native KV cache per instance), so
13
+ * registering the SAME model object under two names MUST yield the
14
+ * SAME `SessionRegistry` — otherwise each alias's local single-warm
15
+ * cache would hand out warm wrappers while the other alias silently
16
+ * stomps them via the shared native state. `register()` looks the
17
+ * model up in an identity-keyed map and reuses the existing registry
18
+ * on alias, or allocates a fresh one on first sight.
19
+ *
20
+ * **Monotonic per-instance ids.** Every distinct model object gets a
21
+ * monotonic `instanceId` on first registration, reused across aliases,
22
+ * and dropped when the binding is fully torn down. The responses
23
+ * endpoint persists this id alongside each stored record and, on a
24
+ * `previous_response_id` continuation, compares the stored id against
25
+ * the live id for `body.model`. This closes two holes a friendly-name
26
+ * check leaves open:
27
+ *
28
+ * 1. A name hot-swap — `register("foo", modelA)` then
29
+ * `register("foo", modelB)` — would pass a string check, so a
30
+ * chain produced by `modelA` could be silently replayed through
31
+ * `modelB`'s tokenizer / chat template / KV layout. With instance
32
+ * ids the stored id (modelA's) no longer matches the live id
33
+ * (modelB's) and the continuation is rejected with 400.
34
+ * 2. Two NAMES aliasing the SAME model object would be spuriously
35
+ * rejected by a string check comparing the stored name against
36
+ * `body.model`. Instance ids recognise them as the same binding
37
+ * and the continuation is accepted.
38
+ */
39
+ import type { SessionCapableModel } from '@mlx-node/lm';
40
+ import { SessionRegistry } from './session-registry.js';
41
+ /** Minimal contract for a model that can be served via chat sessions. */
42
+ export type ServableModel = SessionCapableModel;
43
+ /** Model entry stored in the registry. */
44
+ export interface ModelEntry {
45
+ id: string;
46
+ model: ServableModel;
47
+ createdAt: number;
48
+ /**
49
+ * Per-model-instance session cache, shared across every name that
50
+ * points at this exact model object. See the module-level rustdoc.
51
+ */
52
+ sessionRegistry: SessionRegistry;
53
+ }
54
+ /**
55
+ * Constructor options for {@link ModelRegistry}.
56
+ */
57
+ export interface ModelRegistryOptions {
58
+ /**
59
+ * Maximum queue depth (waiters-only) per-model for the session
60
+ * registry's execution mutex. Forwarded into every
61
+ * `SessionRegistry` this registry allocates. See
62
+ * {@link SessionRegistryOptions.maxQueueDepth}. Default: `undefined`
63
+ * (unbounded — current behaviour).
64
+ */
65
+ maxQueueDepth?: number;
66
+ }
67
+ export declare class ModelRegistry {
68
+ private readonly maxQueueDepth;
69
+ private readonly models;
70
+ /**
71
+ * Identity-keyed (WeakMap semantics, but strong refs because the
72
+ * registry already holds the model through its ModelEntry) map
73
+ * from a model instance to its shared `SessionRegistry` binding.
74
+ * Every name that references the same model object resolves to
75
+ * the same binding — an alias of a registered model shares its
76
+ * session cache and therefore its single-warm invariant.
77
+ */
78
+ private readonly sessionRegistriesByModel;
79
+ /**
80
+ * Identity-keyed map from a model instance to its monotonic
81
+ * instance id. Entries are allocated on first registration,
82
+ * reused across aliasing, and dropped when the last binding
83
+ * releases (mirrors `sessionRegistriesByModel` lifetime exactly).
84
+ */
85
+ private readonly instanceIds;
86
+ /** Monotonic counter for `instanceIds`. Never reused. */
87
+ private nextInstanceId;
88
+ /**
89
+ * Tombstone map for instance ids retired by the hard-timeout
90
+ * breaker. When the responses endpoint force-releases a wedged
91
+ * persist's `retainBinding`, the breaker calls
92
+ * `retireInstanceIdForForceRelease(model)` BEFORE dropping the
93
+ * retain so the live id (already stamped into the pending record)
94
+ * is preserved here. A subsequent `register()` of the SAME model
95
+ * object that arrives AFTER the binding has fully torn down
96
+ * inherits the retired id instead of minting a fresh one — so a
97
+ * late-landing persist's row stays chainable. A true hot-swap
98
+ * (different model object) has no tombstone for the new model,
99
+ * so a fresh id is minted and the stale stored row is correctly
100
+ * rejected with 400 instance-mismatch.
101
+ *
102
+ * `WeakMap`-keyed on the model object so entries do not keep the
103
+ * model alive; if the model is GC'd the tombstone is cleaned up
104
+ * automatically.
105
+ *
106
+ * Lifetime is refcounted: store ONE `{ instanceId, outstandingCount }`
107
+ * entry per model. `retireInstanceIdForForceRelease` increments
108
+ * (creating the entry on first retire); `releaseTombstone`
109
+ * decrements and drops the entry when count hits zero. Because
110
+ * `register()` inherits the retired id whenever the tombstone
111
+ * exists, concurrent breakers on the same model all target the
112
+ * SAME numeric `instanceId` — one shared refcount keeps the
113
+ * tombstone alive as long as ANY pending persist still needs it,
114
+ * and memory is bounded at O(1) per model regardless of how many
115
+ * hard-timeouts have fired.
116
+ */
117
+ private readonly retiredInstanceIds;
118
+ constructor(opts?: ModelRegistryOptions);
119
+ /**
120
+ * Register a model under a given name.
121
+ *
122
+ * If the name is already registered and the new model is a
123
+ * DIFFERENT instance, the old binding's refcount is decremented
124
+ * (and dropped if no other alias references it) before the new
125
+ * binding is taken. Re-registering with the SAME model instance
126
+ * leaves the binding unchanged.
127
+ *
128
+ * On first sight of a model object a fresh `SessionRegistry` is
129
+ * allocated. On alias the existing registry is reused so the
130
+ * single-warm invariant spans both names.
131
+ *
132
+ * Tombstone-inherit path: if the binding was previously torn down
133
+ * AND the hard-timeout breaker called
134
+ * `retireInstanceIdForForceRelease(model)` before teardown fired,
135
+ * the fresh binding inherits the retired instance id from
136
+ * `retiredInstanceIds` — so a late-landing persist's record stays
137
+ * chainable. A hot-swap (different model object) has no tombstone,
138
+ * so a fresh id is minted and the stale record fails
139
+ * `previous_response_id` with 400. The aliasing path naturally
140
+ * preserves the id because `instanceIds.has(model)` is already
141
+ * true.
142
+ */
143
+ register(name: string, model: ServableModel): void;
144
+ /**
145
+ * Unregister a model by name.
146
+ *
147
+ * Drops the name -> ModelEntry mapping and decrements the shared
148
+ * session-registry binding's refcount. When the refcount hits zero
149
+ * (no other alias references this model object) the binding — and
150
+ * the `SessionRegistry` it owns — is dropped entirely so cached
151
+ * sessions for the now-unreferenced model are released.
152
+ *
153
+ * @returns true if the model was removed.
154
+ */
155
+ unregister(name: string): boolean;
156
+ /**
157
+ * Decrement the refcount on a model binding; drop it at zero iff
158
+ * no dispatch holds a lease AND no post-commit persist is still
159
+ * retaining it. When either counter is non-zero the teardown is
160
+ * deferred via `pendingTeardown` so the `SessionRegistry` (and
161
+ * its `execLock` FIFO) stays alive until the last holder releases.
162
+ *
163
+ * A concurrent `register(sameModel)` between `dropNameReference()`
164
+ * and the final release clears `pendingTeardown` and reuses the
165
+ * still-live binding, preserving `modelInstanceId` so any row the
166
+ * pending persist is about to land still resolves to a live id
167
+ * when the next continuation arrives.
168
+ */
169
+ private dropNameReference;
170
+ /**
171
+ * Drop `model`'s binding and instance id from the registry.
172
+ * Shared teardown step; a subsequent re-registration usually mints
173
+ * a FRESH instance id — once the last alias, lease, and persist
174
+ * retention all release, any previously stored record referencing
175
+ * this id belongs to a logically dead binding and a continuation
176
+ * against it must fall through to the `currentInstanceId === undefined`
177
+ * rejection path so the stale chain cannot be replayed.
178
+ *
179
+ * Tombstone exception: if the hard-timeout breaker retired the
180
+ * previous id via `retireInstanceIdForForceRelease` before the
181
+ * forced release, a subsequent same-object `register()` inherits
182
+ * the retired id from `retiredInstanceIds` instead of minting
183
+ * fresh — this preserves chain continuity for late-landing
184
+ * persists that crossed the safety breaker.
185
+ */
186
+ private finalizeBindingTeardown;
187
+ /**
188
+ * Acquire a dispatch lease on the session registry bound to `name`.
189
+ * Returns the live `SessionRegistry` and the binding's instance id,
190
+ * or `undefined` if the name is not registered. Every successful
191
+ * acquisition MUST be balanced with exactly one
192
+ * `releaseDispatchLease(model)` call (typically via try/finally).
193
+ *
194
+ * The lease keeps the binding alive past a concurrent
195
+ * `unregister()` / `register(differentModel)` sequence: the
196
+ * `SessionRegistry` and its `execLock` FIFO remain valid while any
197
+ * lease is outstanding, so a newly registered same-model alias
198
+ * will rebind to the SAME registry and its `withExclusive` will
199
+ * serialize behind the in-flight dispatch.
200
+ *
201
+ * The returned `model` handle is what the caller passes to
202
+ * `releaseDispatchLease()` — the lease binds to the model OBJECT
203
+ * (not the friendly name) because the name can be hot-swapped
204
+ * while the lease is held.
205
+ */
206
+ acquireDispatchLease(name: string): {
207
+ model: ServableModel;
208
+ registry: SessionRegistry;
209
+ instanceId: number;
210
+ } | undefined;
211
+ /**
212
+ * Release a dispatch lease previously obtained via
213
+ * `acquireDispatchLease()`. Decrements the binding's in-flight
214
+ * counter and, if the binding has been flagged for teardown (its
215
+ * refcount hit zero while the lease was held), drops it once the
216
+ * last lease releases. Safe to call exactly once per acquired
217
+ * lease; calling it on a model whose binding has already been
218
+ * fully torn down is a no-op.
219
+ */
220
+ releaseDispatchLease(model: ServableModel): void;
221
+ /**
222
+ * Retain the binding for the duration of a post-commit persist.
223
+ *
224
+ * The responses endpoint starts `store.store(record)` synchronously
225
+ * inside `withExclusive` so the pending-writes tracker observes
226
+ * the in-flight write before the mutex releases, but does NOT
227
+ * await it on the critical path. The write still carries the
228
+ * binding's `modelInstanceId` (stamped into `configJson` by
229
+ * `buildResponseRecord`); without a retention, a same-model
230
+ * unregister + re-register completing while the write is in flight
231
+ * would delete the instance id and the re-registration would mint
232
+ * a fresh one, so the row — when it finally lands — would
233
+ * reference a dead id and the next continuation would be rejected
234
+ * with 400 instance-mismatch.
235
+ *
236
+ * The retention counter is CHECKED in every teardown gate
237
+ * (`dropNameReference`, `releaseDispatchLease`, `releaseBinding`).
238
+ * It is orthogonal to `inFlight` so the dispatch lease can release
239
+ * eagerly after `withExclusive` returns while the binding stays
240
+ * pinned long enough for the backgrounded `store.store(...)` to
241
+ * settle.
242
+ *
243
+ * Safe to call on a model whose binding has already been torn down
244
+ * (no-op). The matching `releaseBinding(model)` MUST still run in
245
+ * the persist's `.finally(...)` so the counter stays balanced.
246
+ */
247
+ retainBinding(model: ServableModel): void;
248
+ /**
249
+ * Balance a prior `retainBinding()` call. Decrements the persist
250
+ * retention counter and, if the binding has been flagged for
251
+ * teardown (refcount hit zero while the retention was held AND
252
+ * every dispatch lease has already released), drops it once the
253
+ * last retention releases. Safe to call exactly once per retain;
254
+ * calling it on a model whose binding has already been fully torn
255
+ * down is a no-op.
256
+ */
257
+ releaseBinding(model: ServableModel): void;
258
+ /**
259
+ * Tombstone installer, invoked exclusively by the responses
260
+ * endpoint's hard-timeout breaker (see
261
+ * `getPostCommitPersistHardTimeoutMs` in `endpoints/responses.ts`)
262
+ * when it force-releases the `retainBinding` on a wedged persist.
263
+ * Must be called BEFORE the idempotent
264
+ * `persistRetainBox.release?.()` so `instanceIds.get(model)`
265
+ * still returns the live id that the already-stamped record
266
+ * carries.
267
+ *
268
+ * Returns the retired id so the caller can capture it and scope
269
+ * the tombstone's lifetime to the specific wedged persist via
270
+ * `releaseTombstone(model)` inside that persist's `.finally(...)`.
271
+ * Returns `undefined` when the model has no current instance id
272
+ * assignment (caller raced the natural teardown path).
273
+ *
274
+ * Refcounted: each call increments a shared
275
+ * `{ instanceId, outstandingCount }` entry per model. Overlapping
276
+ * breakers share one slot (they all target the same numeric id
277
+ * because `register()` inherits the retired id whenever the
278
+ * tombstone is present), so memory stays O(1) per model.
279
+ */
280
+ retireInstanceIdForForceRelease(model: ServableModel): {
281
+ instanceId: number;
282
+ } | undefined;
283
+ /**
284
+ * Tombstone cleanup. Called from the post-commit persist's
285
+ * `.finally(...)` to balance exactly one prior
286
+ * `retireInstanceIdForForceRelease(model)` call. Decrements the
287
+ * shared refcount and drops the entry at zero so the next natural
288
+ * teardown mints a fresh id.
289
+ *
290
+ * Safe to call on a model whose tombstone has already been drained
291
+ * (no-op). The counter is clamped non-negative so spurious
292
+ * releases cannot underflow and re-enable inheritance.
293
+ */
294
+ releaseTombstone(model: ServableModel): void;
295
+ /**
296
+ * Retrieve a model instance by name.
297
+ */
298
+ get(name: string): ServableModel | undefined;
299
+ /**
300
+ * Retrieve the monotonic instance id for the model currently bound
301
+ * to `name`, or `undefined` if the name isn't registered.
302
+ *
303
+ * Two names that alias the same model object return the SAME id
304
+ * (they share a binding), and a name that has been hot-swapped to
305
+ * a different model object returns a DIFFERENT id than before the
306
+ * swap (the prior binding's id was dropped by `dropNameReference`
307
+ * and a fresh id was minted for the new model on re-registration).
308
+ *
309
+ * The responses endpoint uses this to key the
310
+ * `previous_response_id` cross-chain guard on instance identity
311
+ * instead of friendly name, so hot swaps are caught and safe
312
+ * aliases are not spuriously rejected.
313
+ */
314
+ getInstanceId(name: string): number | undefined;
315
+ /**
316
+ * Retrieve the session registry for a given model name, or
317
+ * `undefined` if the name is not registered.
318
+ *
319
+ * Every name that points at the same model instance returns the
320
+ * SAME `SessionRegistry` object. Two aliases `a` and `b` of one
321
+ * model therefore satisfy
322
+ * `registry.getSessionRegistry('a') === registry.getSessionRegistry('b')`,
323
+ * which is what the single-warm invariant requires: any turn
324
+ * through either alias advances the same cache's state, so a later
325
+ * lookup via either alias sees the current warm wrapper (if
326
+ * freshly adopted) or misses and cold-replays (if it was leased
327
+ * out by the other alias) — never a stale wrapper pointing at
328
+ * stomped native state.
329
+ */
330
+ getSessionRegistry(name: string): SessionRegistry | undefined;
331
+ /**
332
+ * Iterate every DISTINCT session registry currently in use.
333
+ *
334
+ * Two aliases of the same model share one `SessionRegistry`, so
335
+ * naively walking every `ModelEntry` would yield duplicates. We
336
+ * walk the identity-keyed bindings instead so each registry
337
+ * appears exactly once, which is what the periodic `sweep()`
338
+ * scheduler in `server.ts` needs to avoid redundantly sweeping
339
+ * the same cache multiple times per tick.
340
+ */
341
+ listSessionRegistries(): SessionRegistry[];
342
+ /**
343
+ * List all registered models in the OpenAI /v1/models format.
344
+ */
345
+ list(): {
346
+ id: string;
347
+ object: string;
348
+ created: number;
349
+ owned_by: string;
350
+ }[];
351
+ /**
352
+ * Check whether a model supports streaming.
353
+ *
354
+ * Every `SessionCapableModel` structurally exposes
355
+ * `chatStreamSessionStart`, so this is universally `true` for any
356
+ * properly-typed model registered through the session-capable
357
+ * interface. Kept as a belt-and-suspenders duck-type so a partially
358
+ * stubbed test double (pre-migration or intentionally non-streaming)
359
+ * can still opt out by omitting the method.
360
+ */
361
+ hasStreamSupport(model: ServableModel): boolean;
362
+ }
363
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}