@modular-prompt/driver 0.16.0 → 0.17.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.
- package/README.md +93 -10
- package/dist/cache-controller.d.ts +4 -0
- package/dist/cache-controller.d.ts.map +1 -1
- package/dist/driver-registry/config-based-factory.d.ts.map +1 -1
- package/dist/driver-registry/config-based-factory.js +6 -0
- package/dist/driver-registry/config-based-factory.js.map +1 -1
- package/dist/driver-registry/factory-helper.d.ts.map +1 -1
- package/dist/driver-registry/factory-helper.js +9 -2
- package/dist/driver-registry/factory-helper.js.map +1 -1
- package/dist/driver-registry/index.d.ts +1 -1
- package/dist/driver-registry/index.d.ts.map +1 -1
- package/dist/driver-registry/types.d.ts +15 -1
- package/dist/driver-registry/types.d.ts.map +1 -1
- package/dist/formatter/converter.d.ts.map +1 -1
- package/dist/formatter/converter.js +31 -2
- package/dist/formatter/converter.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/local-inference/adapters.d.ts +6 -0
- package/dist/local-inference/adapters.d.ts.map +1 -1
- package/dist/local-inference/driver.d.ts.map +1 -1
- package/dist/local-inference/driver.js +45 -24
- package/dist/local-inference/driver.js.map +1 -1
- package/dist/local-inference/process-client.d.ts +4 -2
- package/dist/local-inference/process-client.d.ts.map +1 -1
- package/dist/local-inference/process-client.js +24 -8
- package/dist/local-inference/process-client.js.map +1 -1
- package/dist/local-inference/process-communication.d.ts +9 -2
- package/dist/local-inference/process-communication.d.ts.map +1 -1
- package/dist/local-inference/process-communication.js +37 -5
- package/dist/local-inference/process-communication.js.map +1 -1
- package/dist/local-inference/protocol.d.ts +4 -0
- package/dist/local-inference/protocol.d.ts.map +1 -1
- package/dist/local-inference/request-queue.d.ts +1 -1
- package/dist/local-inference/request-queue.d.ts.map +1 -1
- package/dist/local-inference/request-queue.js +26 -7
- package/dist/local-inference/request-queue.js.map +1 -1
- package/dist/local-inference/stream-utils.d.ts +6 -0
- package/dist/local-inference/stream-utils.d.ts.map +1 -1
- package/dist/local-inference/stream-utils.js.map +1 -1
- package/dist/mlx-ml/mlx-cache-controller.d.ts +9 -0
- package/dist/mlx-ml/mlx-cache-controller.d.ts.map +1 -1
- package/dist/mlx-ml/mlx-cache-controller.js +158 -33
- package/dist/mlx-ml/mlx-cache-controller.js.map +1 -1
- package/dist/mlx-ml/mlx-cache-support.d.ts +2 -2
- package/dist/mlx-ml/mlx-cache-support.d.ts.map +1 -1
- package/dist/mlx-ml/mlx-cache-support.js +8 -3
- package/dist/mlx-ml/mlx-cache-support.js.map +1 -1
- package/dist/mlx-ml/mlx-driver.d.ts +0 -1
- package/dist/mlx-ml/mlx-driver.d.ts.map +1 -1
- package/dist/mlx-ml/mlx-driver.js +1 -8
- package/dist/mlx-ml/mlx-driver.js.map +1 -1
- package/dist/mlx-ml/process/index.d.ts +1 -1
- package/dist/mlx-ml/process/index.d.ts.map +1 -1
- package/dist/mlx-ml/process/index.js +2 -2
- package/dist/mlx-ml/process/index.js.map +1 -1
- package/dist/models-config/index.d.ts +1 -1
- package/dist/models-config/index.d.ts.map +1 -1
- package/dist/models-config/index.js +1 -1
- package/dist/models-config/index.js.map +1 -1
- package/dist/models-config/resolve.d.ts +9 -1
- package/dist/models-config/resolve.d.ts.map +1 -1
- package/dist/models-config/resolve.js +94 -2
- package/dist/models-config/resolve.js.map +1 -1
- package/dist/models-config/types.d.ts +3 -1
- package/dist/models-config/types.d.ts.map +1 -1
- package/dist/pytorch/process/index.d.ts +4 -2
- package/dist/pytorch/process/index.d.ts.map +1 -1
- package/dist/pytorch/process/index.js +24 -7
- package/dist/pytorch/process/index.js.map +1 -1
- package/dist/pytorch/pytorch-cache-controller.d.ts +84 -0
- package/dist/pytorch/pytorch-cache-controller.d.ts.map +1 -0
- package/dist/pytorch/pytorch-cache-controller.js +742 -0
- package/dist/pytorch/pytorch-cache-controller.js.map +1 -0
- package/dist/pytorch/pytorch-cache-support.d.ts +23 -0
- package/dist/pytorch/pytorch-cache-support.d.ts.map +1 -0
- package/dist/pytorch/pytorch-cache-support.js +47 -0
- package/dist/pytorch/pytorch-cache-support.js.map +1 -0
- package/dist/pytorch/pytorch-driver.d.ts +8 -1
- package/dist/pytorch/pytorch-driver.d.ts.map +1 -1
- package/dist/pytorch/pytorch-driver.js +40 -0
- package/dist/pytorch/pytorch-driver.js.map +1 -1
- package/dist/runtime/check.d.ts.map +1 -1
- package/dist/runtime/check.js +8 -6
- package/dist/runtime/check.js.map +1 -1
- package/dist/runtime/index.d.ts +2 -2
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +2 -2
- package/dist/runtime/index.js.map +1 -1
- package/dist/runtime/manifest-core.d.mts +1 -0
- package/dist/runtime/manifest-core.mjs +1 -0
- package/dist/runtime/manifest-core.mjs.map +1 -1
- package/dist/runtime/manifest.d.ts +2 -0
- package/dist/runtime/manifest.d.ts.map +1 -1
- package/dist/runtime/manifest.js.map +1 -1
- package/dist/runtime/paths-core.d.mts +15 -1
- package/dist/runtime/paths-core.d.mts.map +1 -1
- package/dist/runtime/paths-core.mjs +50 -5
- package/dist/runtime/paths-core.mjs.map +1 -1
- package/dist/runtime/paths.d.ts +2 -2
- package/dist/runtime/paths.d.ts.map +1 -1
- package/dist/runtime/paths.js +2 -2
- package/dist/runtime/paths.js.map +1 -1
- package/dist/runtime/pytorch-template-core.d.mts +11 -0
- package/dist/runtime/pytorch-template-core.d.mts.map +1 -0
- package/dist/runtime/pytorch-template-core.mjs +54 -0
- package/dist/runtime/pytorch-template-core.mjs.map +1 -0
- package/dist/runtime/setup-commands-core.d.mts +3 -0
- package/dist/runtime/setup-commands-core.d.mts.map +1 -1
- package/dist/runtime/setup-commands-core.mjs +4 -0
- package/dist/runtime/setup-commands-core.mjs.map +1 -1
- package/dist/runtime/setup-commands.d.ts +1 -1
- package/dist/runtime/setup-commands.d.ts.map +1 -1
- package/dist/runtime/setup-commands.js +1 -1
- package/dist/runtime/setup-commands.js.map +1 -1
- package/docs/DRIVER_API.md +455 -0
- package/docs/LOCAL_MODEL_SETUP.md +765 -0
- package/docs/mlx-api-selection.md +301 -0
- package/package.json +9 -5
- package/scripts/runtime-cli.bin.test.ts +142 -0
- package/scripts/runtime-cli.js +305 -35
- package/scripts/runtime-cli.test.ts +163 -0
- package/src/mlx-ml/python/__main__.py +1 -1
- package/src/mlx-ml/python/backends/base.py +88 -18
- package/src/mlx-ml/python/backends/mlx_lm.py +28 -3
- package/src/mlx-ml/python/backends/mlx_vlm.py +679 -2
- package/src/mlx-ml/python/handlers/cache.py +4 -0
- package/src/mlx-ml/python/handlers/generate.py +33 -10
- package/src/mlx-ml/python/handlers/tokenize.py +1 -4
- package/src/mlx-ml/python/pyproject.toml +1 -1
- package/src/mlx-ml/python/server.py +2 -0
- package/src/mlx-ml/python/uv.lock +8 -8
- package/src/pytorch/templates/cpu-minimal/backends/base.py +139 -0
- package/src/pytorch/templates/cpu-minimal/backends/transformers_lm.py +1167 -0
- package/src/pytorch/{python → templates/cpu-minimal}/handlers/__init__.py +1 -0
- package/src/pytorch/templates/cpu-minimal/handlers/cache.py +88 -0
- package/src/pytorch/templates/cpu-minimal/handlers/generate.py +157 -0
- package/src/pytorch/{python → templates/cpu-minimal}/pyproject.toml +2 -2
- package/src/pytorch/{python → templates/cpu-minimal}/server.py +20 -2
- package/src/pytorch/templates/cpu-minimal/tests/test_cache_handler.py +284 -0
- package/src/pytorch/templates/cpu-minimal/tests/test_capabilities.py +14 -0
- package/src/pytorch/templates/cpu-minimal/tests/test_server.py +141 -0
- package/src/pytorch/templates/cpu-minimal/tests/test_transformers_errors.py +89 -0
- package/src/pytorch/templates/cpu-minimal/tests/test_transformers_lm_cache.py +554 -0
- package/src/pytorch/templates/cpu-minimal/utils/__init__.py +0 -0
- package/src/pytorch/{python → templates/cpu-minimal}/utils/token_utils.py +2 -2
- package/src/pytorch/templates/cpu-minimal/utils/transformers_errors.py +54 -0
- package/src/pytorch/{python → templates/cpu-minimal}/uv.lock +149 -109
- package/src/pytorch/templates/cuda/__main__.py +19 -0
- package/src/pytorch/templates/cuda/backends/__init__.py +3 -0
- package/src/pytorch/{python → templates/cuda}/backends/base.py +54 -6
- package/src/pytorch/templates/cuda/backends/transformers_lm.py +379 -0
- package/src/pytorch/templates/cuda/handlers/__init__.py +7 -0
- package/src/pytorch/templates/cuda/handlers/cache.py +93 -0
- package/src/pytorch/templates/cuda/handlers/cancel.py +53 -0
- package/src/pytorch/templates/cuda/handlers/capabilities.py +6 -0
- package/src/pytorch/templates/cuda/handlers/completion.py +15 -0
- package/src/pytorch/templates/cuda/handlers/format_test.py +70 -0
- package/src/pytorch/templates/cuda/handlers/generate.py +152 -0
- package/src/pytorch/templates/cuda/handlers/render.py +40 -0
- package/src/pytorch/templates/cuda/handlers/tokenize.py +63 -0
- package/src/pytorch/templates/cuda/pyproject.toml +37 -0
- package/src/pytorch/templates/cuda/server.py +158 -0
- package/src/pytorch/templates/cuda/tests/__init__.py +0 -0
- package/src/pytorch/templates/cuda/tests/test_cache_handler.py +207 -0
- package/src/pytorch/templates/cuda/tests/test_capabilities.py +14 -0
- package/src/pytorch/templates/cuda/tests/test_server.py +145 -0
- package/src/pytorch/templates/cuda/tests/test_transformers_errors.py +89 -0
- package/src/pytorch/templates/cuda/tests/test_transformers_lm_cache.py +288 -0
- package/src/pytorch/templates/cuda/utils/__init__.py +0 -0
- package/src/pytorch/templates/cuda/utils/chat_template_constraints.py +164 -0
- package/src/pytorch/templates/cuda/utils/prompt_builder.py +54 -0
- package/src/pytorch/templates/cuda/utils/template_render.py +80 -0
- package/src/pytorch/templates/cuda/utils/token_utils.py +376 -0
- package/src/pytorch/templates/cuda/utils/transformers_errors.py +54 -0
- package/src/pytorch/templates/cuda/uv.lock +734 -0
- package/src/pytorch/python/backends/transformers_lm.py +0 -127
- package/src/pytorch/python/handlers/generate.py +0 -68
- /package/src/pytorch/{python → templates/cpu-minimal}/__main__.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/backends/__init__.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/handlers/cancel.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/handlers/capabilities.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/handlers/completion.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/handlers/format_test.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/handlers/render.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/handlers/tokenize.py +0 -0
- /package/src/pytorch/{python/utils → templates/cpu-minimal/tests}/__init__.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/utils/chat_template_constraints.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/utils/prompt_builder.py +0 -0
- /package/src/pytorch/{python → templates/cpu-minimal}/utils/template_render.py +0 -0
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* LIP JSON-RPC リクエストキュー
|
|
3
3
|
*/
|
|
4
|
+
function toError(error) {
|
|
5
|
+
return error instanceof Error ? error : new Error(String(error));
|
|
6
|
+
}
|
|
4
7
|
export class InferenceRequestQueue {
|
|
5
8
|
queue = [];
|
|
6
9
|
isProcessing = false;
|
|
@@ -79,7 +82,7 @@ export class InferenceRequestQueue {
|
|
|
79
82
|
this.processNext();
|
|
80
83
|
});
|
|
81
84
|
}
|
|
82
|
-
addCachePrefillRequest(cachePath, messages, baseCachePath, trimToTokens, prefixOffsets, prefixHashes, tools, reasoningEffort) {
|
|
85
|
+
addCachePrefillRequest(cachePath, messages, baseCachePath, trimToTokens, prefixOffsets, prefixHashes, tools, reasoningEffort, images, maxImageSize) {
|
|
83
86
|
return new Promise((resolve, reject) => {
|
|
84
87
|
const request = {
|
|
85
88
|
method: 'cache_prefill',
|
|
@@ -90,6 +93,7 @@ export class InferenceRequestQueue {
|
|
|
90
93
|
...(prefixOffsets && prefixHashes && { prefix_offsets: prefixOffsets, prefix_hashes: prefixHashes }),
|
|
91
94
|
...(tools && { tools }),
|
|
92
95
|
...(reasoningEffort && { reasoning_effort: reasoningEffort }),
|
|
96
|
+
...(images?.length ? { images, maxImageSize } : {}),
|
|
93
97
|
};
|
|
94
98
|
this.queue.push({
|
|
95
99
|
request,
|
|
@@ -152,13 +156,28 @@ export class InferenceRequestQueue {
|
|
|
152
156
|
this.isProcessing = true;
|
|
153
157
|
const queueItem = this.queue[0];
|
|
154
158
|
const { request, expectJsonResponse } = queueItem;
|
|
155
|
-
if (!expectJsonResponse) {
|
|
156
|
-
const stream = this.callbacks.createNewStream();
|
|
157
|
-
queueItem.resolve(stream);
|
|
158
|
-
this.queue.shift();
|
|
159
|
-
}
|
|
160
159
|
const input = JSON.stringify(request);
|
|
161
|
-
|
|
160
|
+
let stream;
|
|
161
|
+
try {
|
|
162
|
+
if (!expectJsonResponse) {
|
|
163
|
+
stream = this.callbacks.createNewStream();
|
|
164
|
+
}
|
|
165
|
+
this.callbacks.sendToProcess(input + '\n');
|
|
166
|
+
if (!expectJsonResponse && stream) {
|
|
167
|
+
queueItem.resolve(stream);
|
|
168
|
+
this.queue.shift();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
const requestError = toError(error);
|
|
173
|
+
if (stream) {
|
|
174
|
+
stream.destroy(requestError);
|
|
175
|
+
}
|
|
176
|
+
const failedItem = this.queue.shift();
|
|
177
|
+
failedItem?.reject?.(requestError);
|
|
178
|
+
this.isProcessing = false;
|
|
179
|
+
this.processNext();
|
|
180
|
+
}
|
|
162
181
|
}
|
|
163
182
|
handleJsonResponse(jsonData) {
|
|
164
183
|
if (this.queue.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"request-queue.js","sourceRoot":"","sources":["../../src/local-inference/request-queue.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"request-queue.js","sourceRoot":"","sources":["../../src/local-inference/request-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,12 @@ import { Readable } from 'stream';
|
|
|
2
2
|
export interface StreamMeta {
|
|
3
3
|
prompt_tokens?: number;
|
|
4
4
|
generation_tokens?: number;
|
|
5
|
+
/** Whether the requested prompt cache was actually loaded for this stream. */
|
|
6
|
+
cache_loaded?: boolean;
|
|
7
|
+
/** Tokens read from a backend-owned prompt/KV cache for this stream. */
|
|
8
|
+
cache_read_tokens?: number;
|
|
9
|
+
/** Tokens written to a backend-owned prompt/KV cache for this stream. */
|
|
10
|
+
cache_write_tokens?: number;
|
|
5
11
|
}
|
|
6
12
|
export declare const META_MARKER = "\u001E__META__:";
|
|
7
13
|
export declare function extractStreamMeta(content: string): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-utils.d.ts","sourceRoot":"","sources":["../../src/local-inference/stream-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,MAAM,WAAW,UAAU;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"stream-utils.d.ts","sourceRoot":"","sources":["../../src/local-inference/stream-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAElC,MAAM,WAAW,UAAU;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,yEAAyE;IACzE,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,WAAW,oBAAkB,CAAC;AAE3C,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CASxF;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,QAAQ,EAChB,SAAS,CAAC,EAAE,MAAM,OAAO,GACxB;IACD,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CACjF,CA0DA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-utils.js","sourceRoot":"","sources":["../../src/local-inference/stream-utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stream-utils.js","sourceRoot":"","sources":["../../src/local-inference/stream-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,7 @@ export declare class MlxCacheController implements PromptCacheController {
|
|
|
15
15
|
private cacheDirReady;
|
|
16
16
|
private closed;
|
|
17
17
|
private bound;
|
|
18
|
+
private modelKind;
|
|
18
19
|
private cleanupHandler?;
|
|
19
20
|
private messageProcessor?;
|
|
20
21
|
private formatterOptions;
|
|
@@ -25,8 +26,12 @@ export declare class MlxCacheController implements PromptCacheController {
|
|
|
25
26
|
private lastHandleToolsHash?;
|
|
26
27
|
private lastHandleReasoningEffort?;
|
|
27
28
|
private cacheIndex;
|
|
29
|
+
/** Token counts returned by the backend, including VLM exact disk refs. */
|
|
30
|
+
private cacheTokenCounts;
|
|
28
31
|
private stats;
|
|
29
32
|
constructor(options?: MlxCacheControllerOptions);
|
|
33
|
+
/** Select backend-local storage before the controller is bound. */
|
|
34
|
+
setModelKind(modelKind?: 'lm' | 'vlm'): void;
|
|
30
35
|
bind(process: MlxProcess, formatterOptions: FormatterOptions, messageProcessor?: (messages: MlxMessage[]) => MlxMessage[]): Promise<void>;
|
|
31
36
|
private ensureCacheDir;
|
|
32
37
|
private get indexPath();
|
|
@@ -35,6 +40,7 @@ export declare class MlxCacheController implements PromptCacheController {
|
|
|
35
40
|
private saveIndex;
|
|
36
41
|
private computeFormatterOptionsHash;
|
|
37
42
|
private computeToolsHash;
|
|
43
|
+
private computeImageCacheIdentity;
|
|
38
44
|
private updateLastCache;
|
|
39
45
|
private clearLastCache;
|
|
40
46
|
private computeElementHashes;
|
|
@@ -45,6 +51,9 @@ export declare class MlxCacheController implements PromptCacheController {
|
|
|
45
51
|
private addToIndex;
|
|
46
52
|
private computeCacheKey;
|
|
47
53
|
private generateCachePath;
|
|
54
|
+
private getIndexedCachePath;
|
|
55
|
+
private getEntryCachePath;
|
|
56
|
+
private toIndexCachePath;
|
|
48
57
|
recordQuery(): void;
|
|
49
58
|
recordPromptTokens(newPromptTokens: number, cacheTokensUsed: number): void;
|
|
50
59
|
readCacheTokenCount(cachePath: string): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mlx-cache-controller.d.ts","sourceRoot":"","sources":["../../src/mlx-ml/mlx-cache-controller.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"mlx-cache-controller.d.ts","sourceRoot":"","sources":["../../src/mlx-ml/mlx-cache-controller.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,oBAAoB,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAmCrD,MAAM,WAAW,yBAAyB;IACxC,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAWD,qBAAa,kBAAmB,YAAW,qBAAqB;IAC9D,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,gBAAgB,CAA2C;IACnE,OAAO,CAAC,OAAO,CAAC,CAAa;IAC7B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,cAAc,CAAC,CAAa;IACpC,OAAO,CAAC,gBAAgB,CAAC,CAA2C;IACpE,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,UAAU,CAAC,CAAc;IACjC,OAAO,CAAC,iBAAiB,CAAC,CAAW;IACrC,OAAO,CAAC,eAAe,CAAC,CAAS;IACjC,OAAO,CAAC,8BAA8B,CAAC,CAAS;IAChD,OAAO,CAAC,mBAAmB,CAAC,CAAS;IACrC,OAAO,CAAC,yBAAyB,CAAC,CAAS;IAC3C,OAAO,CAAC,UAAU,CAA2C;IAC7D,2EAA2E;IAC3E,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,KAAK,CAOX;gBAEU,OAAO,CAAC,EAAE,yBAAyB;IAa/C,mEAAmE;IACnE,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,IAAI;IAOtC,IAAI,CACR,OAAO,EAAE,UAAU,EACnB,gBAAgB,EAAE,gBAAgB,EAClC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,GAC1D,OAAO,CAAC,IAAI,CAAC;YAsBF,cAAc;IAM5B,OAAO,KAAK,SAAS,GAEpB;IAED,OAAO,CAAC,kBAAkB;YAUZ,SAAS;YAkBT,SAAS;IAevB,OAAO,CAAC,2BAA2B;IAOnC,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,yBAAyB;IAyBjC,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,oBAAoB;IAW5B,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,sBAAsB;YAMhB,iBAAiB;YAmFjB,YAAY;IAuI1B,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,eAAe;IA2BvB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,gBAAgB;IAcxB,WAAW,IAAI,IAAI;IAInB,kBAAkB,CAAC,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAK1E,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAI9C,QAAQ;;;;;;;;IAWF,OAAO,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAsC/D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAElC;YAEY,WAAW;IA0LzB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAmBpB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA8B7B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash, randomBytes } from 'node:crypto';
|
|
2
2
|
import { tmpdir } from 'node:os';
|
|
3
|
-
import { join } from 'node:path';
|
|
3
|
+
import { isAbsolute, join, relative, resolve as resolvePath, sep } from 'node:path';
|
|
4
4
|
import { rmSync, existsSync, readFileSync } from 'node:fs';
|
|
5
5
|
import { unlink, mkdir, rm, writeFile, readFile } from 'node:fs/promises';
|
|
6
6
|
import { lock as lockFile } from 'proper-lockfile';
|
|
@@ -8,7 +8,15 @@ import { formatPromptAsMessages } from '../formatter/converter.js';
|
|
|
8
8
|
import { convertMessages, convertToolDefinitions } from './mlx-message-utils.js';
|
|
9
9
|
import { Logger } from '@modular-prompt/utils';
|
|
10
10
|
const logger = new Logger({ prefix: 'MLX', context: 'cache' });
|
|
11
|
-
const
|
|
11
|
+
const CACHE_FILE_EXTENSIONS = {
|
|
12
|
+
lm: '.safetensors.zip',
|
|
13
|
+
// mlx-vlm's exact_cache_v1 snapshot is a standalone safetensors file and
|
|
14
|
+
// must never be mistaken for an mlx-lm archive.
|
|
15
|
+
vlm: '.vlm.safetensors',
|
|
16
|
+
// Image-bearing VLM snapshots have a separate namespace and sidecar
|
|
17
|
+
// layout. They are intentionally incompatible with text-only VLM refs.
|
|
18
|
+
vlmVision: '.vlm-vision.safetensors',
|
|
19
|
+
};
|
|
12
20
|
export class MlxCacheController {
|
|
13
21
|
cacheByHash = new Map();
|
|
14
22
|
inflightRequests = new Map();
|
|
@@ -18,6 +26,7 @@ export class MlxCacheController {
|
|
|
18
26
|
cacheDirReady = false;
|
|
19
27
|
closed = false;
|
|
20
28
|
bound = false;
|
|
29
|
+
modelKind = 'lm';
|
|
21
30
|
cleanupHandler;
|
|
22
31
|
messageProcessor;
|
|
23
32
|
formatterOptions;
|
|
@@ -28,6 +37,8 @@ export class MlxCacheController {
|
|
|
28
37
|
lastHandleToolsHash;
|
|
29
38
|
lastHandleReasoningEffort;
|
|
30
39
|
cacheIndex = { version: 1, entries: [] };
|
|
40
|
+
/** Token counts returned by the backend, including VLM exact disk refs. */
|
|
41
|
+
cacheTokenCounts = new Map();
|
|
31
42
|
stats = {
|
|
32
43
|
totalQueries: 0,
|
|
33
44
|
memoryHit: 0, diskHit: 0, incremental: 0, fresh: 0,
|
|
@@ -39,7 +50,9 @@ export class MlxCacheController {
|
|
|
39
50
|
constructor(options) {
|
|
40
51
|
this.formatterOptions = {};
|
|
41
52
|
if (options?.cacheDir) {
|
|
42
|
-
|
|
53
|
+
// Keep backend refs and relative index paths stable when callers pass a
|
|
54
|
+
// relative cacheDir (the Python process may have a different cwd).
|
|
55
|
+
this.cacheDir = resolvePath(options.cacheDir);
|
|
43
56
|
this.managedDir = false;
|
|
44
57
|
}
|
|
45
58
|
else {
|
|
@@ -47,6 +60,13 @@ export class MlxCacheController {
|
|
|
47
60
|
this.managedDir = true;
|
|
48
61
|
}
|
|
49
62
|
}
|
|
63
|
+
/** Select backend-local storage before the controller is bound. */
|
|
64
|
+
setModelKind(modelKind) {
|
|
65
|
+
if (this.bound) {
|
|
66
|
+
throw new Error('MlxCacheController model kind must be set before bind');
|
|
67
|
+
}
|
|
68
|
+
this.modelKind = modelKind === 'vlm' ? 'vlm' : 'lm';
|
|
69
|
+
}
|
|
50
70
|
async bind(process, formatterOptions, messageProcessor) {
|
|
51
71
|
if (this.bound) {
|
|
52
72
|
throw new Error('MlxCacheController is already bound to a process');
|
|
@@ -139,6 +159,28 @@ export class MlxCacheController {
|
|
|
139
159
|
const sorted = [...tools].sort((a, b) => a.name.localeCompare(b.name));
|
|
140
160
|
return createHash('sha256').update(JSON.stringify(sorted)).digest('hex');
|
|
141
161
|
}
|
|
162
|
+
computeImageCacheIdentity(images, maxImageSize) {
|
|
163
|
+
if (!images || images.length === 0)
|
|
164
|
+
return undefined;
|
|
165
|
+
return {
|
|
166
|
+
layout: 'vision_cache_v1',
|
|
167
|
+
maxImageSize: maxImageSize ?? 768,
|
|
168
|
+
images: images.map((image) => {
|
|
169
|
+
let contentHash;
|
|
170
|
+
try {
|
|
171
|
+
// Include the source bytes in the controller key when the source is
|
|
172
|
+
// a local file. The Python sidecar remains the authoritative
|
|
173
|
+
// normalized-image/APC extra_hash check at load time.
|
|
174
|
+
contentHash = createHash('sha256').update(readFileSync(image)).digest('hex');
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// URLs and unresolved paths are still distinguished by their ref;
|
|
178
|
+
// mlx-vlm will reject an unreadable path during prefill/load.
|
|
179
|
+
}
|
|
180
|
+
return { ref: image, contentHash };
|
|
181
|
+
}),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
142
184
|
updateLastCache(handle, elementHashes, params) {
|
|
143
185
|
this.lastHandle = handle;
|
|
144
186
|
this.lastElementHashes = elementHashes;
|
|
@@ -225,7 +267,7 @@ export class MlxCacheController {
|
|
|
225
267
|
output: [],
|
|
226
268
|
};
|
|
227
269
|
const chatMessages = formatPromptAsMessages(partialPrompt, this.formatterOptions);
|
|
228
|
-
let mlxMessages = convertMessages(chatMessages);
|
|
270
|
+
let mlxMessages = convertMessages(chatMessages, this.modelKind === 'vlm');
|
|
229
271
|
if (this.messageProcessor) {
|
|
230
272
|
mlxMessages = this.messageProcessor(mlxMessages);
|
|
231
273
|
}
|
|
@@ -256,6 +298,11 @@ export class MlxCacheController {
|
|
|
256
298
|
return { offsets, hashes };
|
|
257
299
|
}
|
|
258
300
|
async findBestBase(params, fullTokens) {
|
|
301
|
+
// exact_cache_v1 VLM snapshots are intentionally not used for incremental
|
|
302
|
+
// prefill. A VLM cache is still eligible for an exact disk hit in
|
|
303
|
+
// createCache(), but base_cache_path/trim_to_tokens remain Phase 3 work.
|
|
304
|
+
if (this.modelKind === 'vlm')
|
|
305
|
+
return undefined;
|
|
259
306
|
const newHashes = this.computeElementHashes(params);
|
|
260
307
|
if (newHashes.length === 0)
|
|
261
308
|
return undefined;
|
|
@@ -264,6 +311,8 @@ export class MlxCacheController {
|
|
|
264
311
|
const candidates = [];
|
|
265
312
|
const staleKeys = [];
|
|
266
313
|
for (const entry of this.cacheIndex.entries) {
|
|
314
|
+
if ((entry.backend ?? 'lm') !== 'lm')
|
|
315
|
+
continue;
|
|
267
316
|
if (entry.hint === 'release')
|
|
268
317
|
continue;
|
|
269
318
|
if (entry.model !== params.model || entry.formatterOptionsHash !== fmtHash)
|
|
@@ -272,7 +321,7 @@ export class MlxCacheController {
|
|
|
272
321
|
continue;
|
|
273
322
|
if ((entry.reasoningEffort ?? '') !== (params.reasoningEffort ?? ''))
|
|
274
323
|
continue;
|
|
275
|
-
const path = this.generateCachePath(entry.key);
|
|
324
|
+
const path = entry.path ?? this.generateCachePath(entry.key);
|
|
276
325
|
if (existsSync(path) && this.readMetaTokenCount(path) > 0) {
|
|
277
326
|
candidates.push({ path, elementHashes: entry.elementHashes, label: entry.key.slice(0, 8) });
|
|
278
327
|
}
|
|
@@ -294,7 +343,7 @@ export class MlxCacheController {
|
|
|
294
343
|
}
|
|
295
344
|
}
|
|
296
345
|
if (staleKeys.length > 0) {
|
|
297
|
-
this.cacheIndex.entries = this.cacheIndex.entries.filter(e => !staleKeys.includes(e.key));
|
|
346
|
+
this.cacheIndex.entries = this.cacheIndex.entries.filter(e => !(staleKeys.includes(e.key) && (e.backend ?? 'lm') === 'lm'));
|
|
298
347
|
this.saveIndex().catch(() => { });
|
|
299
348
|
}
|
|
300
349
|
if (candidates.length === 0)
|
|
@@ -364,10 +413,18 @@ export class MlxCacheController {
|
|
|
364
413
|
}
|
|
365
414
|
return bestInfo;
|
|
366
415
|
}
|
|
367
|
-
addToIndex(params, cacheKey) {
|
|
368
|
-
// avoid duplicates
|
|
369
|
-
|
|
416
|
+
addToIndex(params, cacheKey, cachePath) {
|
|
417
|
+
// avoid duplicates while refreshing the actual backend path after a VLM
|
|
418
|
+
// prefill (the logical path is only the namespace seed).
|
|
419
|
+
const existing = this.cacheIndex.entries.find(e => e.key === cacheKey && (e.backend ?? 'lm') === this.modelKind);
|
|
420
|
+
if (existing) {
|
|
421
|
+
existing.backend = this.modelKind;
|
|
422
|
+
if (this.modelKind === 'vlm') {
|
|
423
|
+
existing.path = this.toIndexCachePath(cachePath);
|
|
424
|
+
}
|
|
425
|
+
existing.hint = undefined;
|
|
370
426
|
return;
|
|
427
|
+
}
|
|
371
428
|
this.cacheIndex.entries.push({
|
|
372
429
|
key: cacheKey,
|
|
373
430
|
model: params.model,
|
|
@@ -376,6 +433,8 @@ export class MlxCacheController {
|
|
|
376
433
|
toolsHash: this.computeToolsHash(params.tools),
|
|
377
434
|
reasoningEffort: params.reasoningEffort,
|
|
378
435
|
createdAt: new Date().toISOString(),
|
|
436
|
+
backend: this.modelKind,
|
|
437
|
+
path: this.modelKind === 'vlm' ? this.toIndexCachePath(cachePath) : undefined,
|
|
379
438
|
});
|
|
380
439
|
}
|
|
381
440
|
computeCacheKey(params) {
|
|
@@ -395,10 +454,42 @@ export class MlxCacheController {
|
|
|
395
454
|
if (params.reasoningEffort) {
|
|
396
455
|
payload.reasoningEffort = params.reasoningEffort;
|
|
397
456
|
}
|
|
457
|
+
const imageIdentity = this.computeImageCacheIdentity(params.images, params.maxImageSize);
|
|
458
|
+
if (imageIdentity) {
|
|
459
|
+
payload.imageCache = imageIdentity;
|
|
460
|
+
}
|
|
398
461
|
return createHash('sha256').update(JSON.stringify(payload)).digest('hex');
|
|
399
462
|
}
|
|
400
|
-
generateCachePath(cacheKey) {
|
|
401
|
-
|
|
463
|
+
generateCachePath(cacheKey, vision = false) {
|
|
464
|
+
const extension = vision
|
|
465
|
+
? CACHE_FILE_EXTENSIONS.vlmVision
|
|
466
|
+
: CACHE_FILE_EXTENSIONS[this.modelKind];
|
|
467
|
+
return join(this.cacheDir, `${cacheKey}${extension}`);
|
|
468
|
+
}
|
|
469
|
+
getIndexedCachePath(cacheKey) {
|
|
470
|
+
const indexedPath = this.cacheIndex.entries.find(e => e.key === cacheKey && (e.backend ?? 'lm') === this.modelKind)?.path;
|
|
471
|
+
if (!indexedPath)
|
|
472
|
+
return undefined;
|
|
473
|
+
return isAbsolute(indexedPath) ? indexedPath : join(this.cacheDir, indexedPath);
|
|
474
|
+
}
|
|
475
|
+
getEntryCachePath(entry) {
|
|
476
|
+
if (entry.path) {
|
|
477
|
+
return isAbsolute(entry.path) ? entry.path : join(this.cacheDir, entry.path);
|
|
478
|
+
}
|
|
479
|
+
return this.generateCachePath(entry.key);
|
|
480
|
+
}
|
|
481
|
+
toIndexCachePath(cachePath) {
|
|
482
|
+
if (this.modelKind !== 'vlm') {
|
|
483
|
+
return cachePath;
|
|
484
|
+
}
|
|
485
|
+
const absoluteCachePath = isAbsolute(cachePath) ? cachePath : resolvePath(cachePath);
|
|
486
|
+
const relativePath = relative(this.cacheDir, absoluteCachePath);
|
|
487
|
+
// Backend-created VLM paths are inside cacheDir. Keep an absolute path
|
|
488
|
+
// only for an incompatible/custom backend result that cannot be relocated.
|
|
489
|
+
if (relativePath === '..' || relativePath.startsWith(`..${sep}`)) {
|
|
490
|
+
return cachePath;
|
|
491
|
+
}
|
|
492
|
+
return relativePath;
|
|
402
493
|
}
|
|
403
494
|
recordQuery() {
|
|
404
495
|
this.stats.totalQueries++;
|
|
@@ -408,7 +499,7 @@ export class MlxCacheController {
|
|
|
408
499
|
this.stats.totalCacheTokensUsed += cacheTokensUsed;
|
|
409
500
|
}
|
|
410
501
|
readCacheTokenCount(cachePath) {
|
|
411
|
-
return this.readMetaTokenCount(cachePath);
|
|
502
|
+
return this.cacheTokenCounts.get(cachePath) ?? this.readMetaTokenCount(cachePath);
|
|
412
503
|
}
|
|
413
504
|
getStats() {
|
|
414
505
|
const s = this.stats;
|
|
@@ -463,12 +554,25 @@ export class MlxCacheController {
|
|
|
463
554
|
logger.verbose('cache dir creation failed, skipping cache:', e instanceof Error ? e.message : String(e));
|
|
464
555
|
return MlxCacheController.EMPTY_HANDLE;
|
|
465
556
|
}
|
|
466
|
-
const
|
|
557
|
+
const visionCache = this.modelKind === 'vlm' && (params.images?.length ?? 0) > 0;
|
|
558
|
+
// VLM prefill returns the actual APC snapshot path. Reuse that path when
|
|
559
|
+
// a fixed-cache index has it; otherwise start with a deterministic logical
|
|
560
|
+
// path that the Python backend turns into a DiskBlockStore namespace.
|
|
561
|
+
const indexedPath = this.getIndexedCachePath(cacheKey);
|
|
562
|
+
const cachePath = indexedPath
|
|
563
|
+
&& existsSync(indexedPath)
|
|
564
|
+
&& existsSync(indexedPath + '.meta.json')
|
|
565
|
+
&& this.readMetaTokenCount(indexedPath) > 0
|
|
566
|
+
? indexedPath
|
|
567
|
+
: this.generateCachePath(cacheKey, visionCache);
|
|
568
|
+
let effectiveCachePath = cachePath;
|
|
467
569
|
const elementHashes = this.computeElementHashes(params);
|
|
468
570
|
let supersededRef;
|
|
469
|
-
// Disk hit check (exact same cache already exists)
|
|
571
|
+
// Disk hit check (exact same cache already exists). Both LM archives and
|
|
572
|
+
// VLM exact_cache_v1 snapshots use the same sidecar token-count contract.
|
|
470
573
|
if (existsSync(cachePath) && existsSync(cachePath + '.meta.json') && this.readMetaTokenCount(cachePath) > 0) {
|
|
471
574
|
this.stats.diskHit++;
|
|
575
|
+
this.cacheTokenCounts.set(cachePath, this.readMetaTokenCount(cachePath));
|
|
472
576
|
logger.verbose('reusing existing cache file', cacheKey.slice(0, 12));
|
|
473
577
|
}
|
|
474
578
|
else {
|
|
@@ -479,26 +583,34 @@ export class MlxCacheController {
|
|
|
479
583
|
output: [],
|
|
480
584
|
};
|
|
481
585
|
const chatMessages = formatPromptAsMessages(prefillPrompt, this.formatterOptions);
|
|
482
|
-
const preMergeMessages = convertMessages(chatMessages);
|
|
586
|
+
const preMergeMessages = convertMessages(chatMessages, this.modelKind === 'vlm');
|
|
483
587
|
let mlxMessages = preMergeMessages;
|
|
484
588
|
if (this.messageProcessor) {
|
|
485
589
|
mlxMessages = this.messageProcessor(mlxMessages);
|
|
486
590
|
}
|
|
487
591
|
const hasTools = params.tools && params.tools.length > 0;
|
|
488
592
|
const mlxTools = hasTools ? convertToolDefinitions(params.tools) : undefined;
|
|
489
|
-
// Tokenize to get full token IDs (for findBestBase + prefix computation)
|
|
593
|
+
// Tokenize to get full token IDs (for findBestBase + prefix computation).
|
|
594
|
+
// Image-bearing VLM prompts are deliberately excluded: the shared
|
|
595
|
+
// tokenize protocol carries messages but not image sources, so it
|
|
596
|
+
// cannot reproduce mlx-vlm's dynamic image-token expansion. The VLM
|
|
597
|
+
// backend computes the authoritative image-aware IDs during prefill.
|
|
490
598
|
let fullTokens = null;
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
599
|
+
if (!visionCache) {
|
|
600
|
+
try {
|
|
601
|
+
const tokenResult = await this.process.tokenize(mlxMessages, mlxTools, params.reasoningEffort);
|
|
602
|
+
if (!tokenResult.error && tokenResult.token_ids) {
|
|
603
|
+
fullTokens = tokenResult.token_ids;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
catch {
|
|
607
|
+
// tokenize failure — proceed without prefix matching
|
|
495
608
|
}
|
|
496
609
|
}
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
const base = fullTokens
|
|
610
|
+
// Find best base cache. VLM exact snapshots intentionally do not
|
|
611
|
+
// participate in incremental prefill until a safe trim/replay protocol
|
|
612
|
+
// is implemented.
|
|
613
|
+
const base = this.modelKind === 'lm' && fullTokens
|
|
502
614
|
? await this.findBestBase(params, fullTokens)
|
|
503
615
|
: undefined;
|
|
504
616
|
if (base?.coversAll) {
|
|
@@ -537,14 +649,26 @@ export class MlxCacheController {
|
|
|
537
649
|
logger.debug('prefill', cachePath);
|
|
538
650
|
const prefillStart = performance.now();
|
|
539
651
|
try {
|
|
540
|
-
await this.process.cachePrefill(cachePath, mlxMessages, base?.path, base?.trimTokens, prefixOffsets, prefixHashes, mlxTools, params.reasoningEffort);
|
|
652
|
+
const prefillResult = await this.process.cachePrefill(cachePath, mlxMessages, base?.path, base?.trimTokens, prefixOffsets, prefixHashes, mlxTools, params.reasoningEffort, params.images, params.maxImageSize);
|
|
653
|
+
const returnedTokenCount = typeof prefillResult?.token_count === 'number'
|
|
654
|
+
? prefillResult.token_count
|
|
655
|
+
: undefined;
|
|
656
|
+
if (this.modelKind === 'vlm'
|
|
657
|
+
&& typeof prefillResult?.cache_path === 'string'
|
|
658
|
+
&& prefillResult.cache_path.length > 0) {
|
|
659
|
+
effectiveCachePath = prefillResult.cache_path;
|
|
660
|
+
}
|
|
661
|
+
const tokenCount = returnedTokenCount ?? this.readMetaTokenCount(effectiveCachePath);
|
|
662
|
+
if (tokenCount > 0) {
|
|
663
|
+
this.cacheTokenCounts.set(effectiveCachePath, tokenCount);
|
|
664
|
+
}
|
|
541
665
|
}
|
|
542
666
|
catch (e) {
|
|
543
667
|
logger.verbose('prefill failed, skipping cache:', e instanceof Error ? e.message : String(e));
|
|
544
668
|
return MlxCacheController.EMPTY_HANDLE;
|
|
545
669
|
}
|
|
546
670
|
const prefillMs = performance.now() - prefillStart;
|
|
547
|
-
const newTokens = this.
|
|
671
|
+
const newTokens = this.readCacheTokenCount(effectiveCachePath);
|
|
548
672
|
this.stats.prefillTokens += newTokens;
|
|
549
673
|
if (base) {
|
|
550
674
|
this.stats.incremental++;
|
|
@@ -556,13 +680,13 @@ export class MlxCacheController {
|
|
|
556
680
|
}
|
|
557
681
|
logger.verbose(`prefill ${prefillMs.toFixed(0)}ms`, base ? '(incremental)' : '(fresh)');
|
|
558
682
|
if (this.closed) {
|
|
559
|
-
await unlink(
|
|
560
|
-
await unlink(
|
|
683
|
+
await unlink(effectiveCachePath).catch(() => { });
|
|
684
|
+
await unlink(effectiveCachePath + '.meta.json').catch(() => { });
|
|
561
685
|
return MlxCacheController.EMPTY_HANDLE;
|
|
562
686
|
}
|
|
563
687
|
}
|
|
564
688
|
const handle = {
|
|
565
|
-
ref:
|
|
689
|
+
ref: effectiveCachePath,
|
|
566
690
|
includes: {
|
|
567
691
|
instructions: (params.instructions?.length ?? 0) > 0,
|
|
568
692
|
dataElementCount: params.data?.length ?? 0,
|
|
@@ -572,7 +696,7 @@ export class MlxCacheController {
|
|
|
572
696
|
};
|
|
573
697
|
this.cacheByHash.set(cacheKey, handle);
|
|
574
698
|
this.updateLastCache(handle, elementHashes, params);
|
|
575
|
-
this.addToIndex(params, cacheKey);
|
|
699
|
+
this.addToIndex(params, cacheKey, effectiveCachePath);
|
|
576
700
|
if (supersededRef) {
|
|
577
701
|
this.release(supersededRef);
|
|
578
702
|
}
|
|
@@ -581,7 +705,7 @@ export class MlxCacheController {
|
|
|
581
705
|
}
|
|
582
706
|
release(ref) {
|
|
583
707
|
logger.debug('release', ref);
|
|
584
|
-
const entry = this.cacheIndex.entries.find(e => this.
|
|
708
|
+
const entry = this.cacheIndex.entries.find(e => this.getEntryCachePath(e) === ref);
|
|
585
709
|
if (entry) {
|
|
586
710
|
entry.hint = 'release';
|
|
587
711
|
}
|
|
@@ -607,6 +731,7 @@ export class MlxCacheController {
|
|
|
607
731
|
]);
|
|
608
732
|
this.inflightRequests.clear();
|
|
609
733
|
this.cacheByHash.clear();
|
|
734
|
+
this.cacheTokenCounts.clear();
|
|
610
735
|
this.clearLastCache();
|
|
611
736
|
if (this.managedDir && this.cacheDir) {
|
|
612
737
|
await rm(this.cacheDir, { recursive: true, force: true }).catch(() => { });
|
|
@@ -614,7 +739,7 @@ export class MlxCacheController {
|
|
|
614
739
|
else {
|
|
615
740
|
const released = this.cacheIndex.entries.filter(e => e.hint === 'release');
|
|
616
741
|
await Promise.allSettled(released.flatMap(entry => {
|
|
617
|
-
const path = this.
|
|
742
|
+
const path = this.getEntryCachePath(entry);
|
|
618
743
|
return [unlink(path), unlink(path + '.meta.json')];
|
|
619
744
|
}));
|
|
620
745
|
this.cacheIndex.entries = this.cacheIndex.entries.filter(e => e.hint !== 'release');
|