@modular-prompt/extract 1.0.0 → 1.2.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 +83 -24
- package/dist/cache-lifecycle.d.ts +5 -1
- package/dist/cache-lifecycle.d.ts.map +1 -1
- package/dist/cache-lifecycle.js +22 -0
- package/dist/cache-lifecycle.js.map +1 -1
- package/dist/cli/add-command.d.ts +2 -0
- package/dist/cli/add-command.d.ts.map +1 -1
- package/dist/cli/add-command.js +9 -3
- package/dist/cli/add-command.js.map +1 -1
- package/dist/cli/args.d.ts +3 -0
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +29 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/constants.d.ts +4 -0
- package/dist/cli/constants.d.ts.map +1 -1
- package/dist/cli/constants.js +19 -0
- package/dist/cli/constants.js.map +1 -1
- package/dist/cli/create-command.d.ts +2 -0
- package/dist/cli/create-command.d.ts.map +1 -1
- package/dist/cli/create-command.js +11 -4
- package/dist/cli/create-command.js.map +1 -1
- package/dist/cli/extract-command.d.ts +2 -0
- package/dist/cli/extract-command.d.ts.map +1 -1
- package/dist/cli/extract-command.js +22 -5
- package/dist/cli/extract-command.js.map +1 -1
- package/dist/cli/list-command.d.ts +1 -0
- package/dist/cli/list-command.d.ts.map +1 -1
- package/dist/cli/list-command.js +6 -7
- package/dist/cli/list-command.js.map +1 -1
- package/dist/cli/manifest.d.ts +11 -0
- package/dist/cli/manifest.d.ts.map +1 -1
- package/dist/cli/manifest.js +16 -0
- package/dist/cli/manifest.js.map +1 -1
- package/dist/cli/store.d.ts +21 -1
- package/dist/cli/store.d.ts.map +1 -1
- package/dist/cli/store.js +189 -4
- package/dist/cli/store.js.map +1 -1
- package/dist/cli.js +18 -10
- package/dist/cli.js.map +1 -1
- package/dist/create-extract-runtime.d.ts +22 -0
- package/dist/create-extract-runtime.d.ts.map +1 -0
- package/dist/create-extract-runtime.js +27 -0
- package/dist/create-extract-runtime.js.map +1 -0
- package/dist/create-extract-session.d.ts.map +1 -1
- package/dist/create-extract-session.js +8 -2
- package/dist/create-extract-session.js.map +1 -1
- package/dist/create-mlx-extract-runtime.d.ts +18 -7
- package/dist/create-mlx-extract-runtime.d.ts.map +1 -1
- package/dist/create-mlx-extract-runtime.js +11 -1
- package/dist/create-mlx-extract-runtime.js.map +1 -1
- package/dist/create-pytorch-extract-runtime.d.ts +13 -0
- package/dist/create-pytorch-extract-runtime.d.ts.map +1 -0
- package/dist/create-pytorch-extract-runtime.js +52 -0
- package/dist/create-pytorch-extract-runtime.js.map +1 -0
- package/dist/default-models.d.ts +3 -8
- package/dist/default-models.d.ts.map +1 -1
- package/dist/default-models.js +4 -16
- package/dist/default-models.js.map +1 -1
- package/dist/extract-runtime-types.d.ts +16 -0
- package/dist/extract-runtime-types.d.ts.map +1 -0
- package/dist/extract-runtime-types.js +2 -0
- package/dist/extract-runtime-types.js.map +1 -0
- package/dist/extract-store.d.ts +48 -2
- package/dist/extract-store.d.ts.map +1 -1
- package/dist/extract-store.js +108 -10
- package/dist/extract-store.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/model-resolution.d.ts +15 -5
- package/dist/model-resolution.d.ts.map +1 -1
- package/dist/model-resolution.js +87 -27
- package/dist/model-resolution.js.map +1 -1
- package/dist/types.d.ts +12 -0
- package/dist/types.d.ts.map +1 -1
- package/docs/API.md +320 -0
- package/docs/CACHE_DESIGN.md +557 -0
- package/docs/LOCAL_MODEL_SETUP.md +765 -0
- package/docs/PROMPT_MODULE_SPEC.md +482 -0
- package/package.json +6 -4
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { resolve } from 'node:path';
|
|
2
2
|
import { createExtractSession } from '../create-extract-session.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { createExtractRuntime } from '../create-extract-runtime.js';
|
|
4
|
+
import { assertExtractRuntimeMatchesManifest, ensureStoreKvCache, } from '../extract-store.js';
|
|
5
|
+
import { DEFAULT_MAX_TOKENS, resolveAutoRebuildCache } from './constants.js';
|
|
6
|
+
import { getManifestProvider, readManifest } from './manifest.js';
|
|
6
7
|
import { renderExtractPrompt } from './render-prompt.js';
|
|
7
|
-
import { resolveStoreDir } from './store.js';
|
|
8
|
+
import { formatKvCacheRebuildWarning, resolveStoreDir } from './store.js';
|
|
8
9
|
export async function runExtractCommand(options) {
|
|
9
10
|
const containerDir = resolve(options.cacheDir);
|
|
10
11
|
const storeDir = resolveStoreDir(containerDir, options.storename);
|
|
@@ -22,16 +23,32 @@ export async function runExtractCommand(options) {
|
|
|
22
23
|
if (options.dryRun) {
|
|
23
24
|
return renderExtractPrompt({ materials: manifest.materials }, request);
|
|
24
25
|
}
|
|
25
|
-
const
|
|
26
|
+
const autoRebuildCache = resolveAutoRebuildCache(options.autoRebuildCache);
|
|
27
|
+
const cacheResult = await ensureStoreKvCache({
|
|
28
|
+
storeDir,
|
|
29
|
+
storename: options.storename,
|
|
30
|
+
manifest,
|
|
31
|
+
autoRebuildCache,
|
|
32
|
+
});
|
|
33
|
+
if (cacheResult.rebuilt) {
|
|
34
|
+
console.error(formatKvCacheRebuildWarning(options.storename, manifest.materials.length));
|
|
35
|
+
}
|
|
36
|
+
const runtime = await createExtractRuntime({
|
|
26
37
|
model: manifest.model,
|
|
38
|
+
provider: getManifestProvider(manifest),
|
|
27
39
|
cacheDir: storeDir,
|
|
40
|
+
...(manifest.backend ? { backend: manifest.backend } : {}),
|
|
41
|
+
...(manifest.maxImageSize !== undefined ? { maxImageSize: manifest.maxImageSize } : {}),
|
|
28
42
|
});
|
|
29
43
|
try {
|
|
44
|
+
assertExtractRuntimeMatchesManifest(runtime, manifest);
|
|
30
45
|
const session = createExtractSession({
|
|
31
46
|
driver: runtime.driver,
|
|
32
47
|
cacheController: runtime.cacheController,
|
|
33
48
|
model: runtime.model,
|
|
49
|
+
maxImageSize: runtime.maxImageSize,
|
|
34
50
|
corpus: { materials: manifest.materials },
|
|
51
|
+
autoRebuildCache,
|
|
35
52
|
});
|
|
36
53
|
const result = await session.extract(request);
|
|
37
54
|
await session.close({ releaseCache: false });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract-command.js","sourceRoot":"","sources":["../../src/cli/extract-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"extract-command.js","sourceRoot":"","sources":["../../src/cli/extract-command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-command.d.ts","sourceRoot":"","sources":["../../src/cli/list-command.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;
|
|
1
|
+
{"version":3,"file":"list-command.d.ts","sourceRoot":"","sources":["../../src/cli/list-command.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAC;IAC5B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;CACrB;AAiBD,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAyB1E;AAoBD,wBAAsB,cAAc,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAOjF"}
|
package/dist/cli/list-command.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readdir } from 'node:fs/promises';
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
|
-
import {
|
|
4
|
-
import { manifestExists, readManifest } from './manifest.js';
|
|
3
|
+
import { inspectStoreKvCache } from './store.js';
|
|
4
|
+
import { getManifestProvider, manifestExists, readManifest } from './manifest.js';
|
|
5
5
|
async function listStoreDirectories(containerDir) {
|
|
6
6
|
try {
|
|
7
7
|
const entries = await readdir(containerDir, { withFileTypes: true });
|
|
@@ -17,10 +17,6 @@ async function listStoreDirectories(containerDir) {
|
|
|
17
17
|
throw error;
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
-
async function hasKvCache(storeDir) {
|
|
21
|
-
const entries = await readdir(storeDir, { withFileTypes: true });
|
|
22
|
-
return entries.some((entry) => entry.isFile() && isKvCacheFile(entry.name));
|
|
23
|
-
}
|
|
24
20
|
export async function listStores(cacheDir) {
|
|
25
21
|
const containerDir = resolve(cacheDir);
|
|
26
22
|
const storeNames = await listStoreDirectories(containerDir);
|
|
@@ -31,13 +27,15 @@ export async function listStores(cacheDir) {
|
|
|
31
27
|
continue;
|
|
32
28
|
}
|
|
33
29
|
const manifest = await readManifest(storeDir);
|
|
30
|
+
const cacheStatus = await inspectStoreKvCache(storeDir);
|
|
34
31
|
summaries.push({
|
|
35
32
|
storename: manifest.storename ?? storename,
|
|
36
33
|
model: manifest.model,
|
|
34
|
+
provider: getManifestProvider(manifest),
|
|
37
35
|
materialTitles: manifest.materials.map((material) => material.title),
|
|
38
36
|
createdAt: manifest.createdAt,
|
|
39
37
|
updatedAt: manifest.updatedAt,
|
|
40
|
-
hasKvCache:
|
|
38
|
+
hasKvCache: cacheStatus.hasKvCache,
|
|
41
39
|
});
|
|
42
40
|
}
|
|
43
41
|
return summaries;
|
|
@@ -49,6 +47,7 @@ function formatSummary(summary) {
|
|
|
49
47
|
const lines = [
|
|
50
48
|
`Store: ${summary.storename}`,
|
|
51
49
|
` Model: ${summary.model}`,
|
|
50
|
+
` Provider: ${summary.provider}`,
|
|
52
51
|
` Materials: ${summary.materialTitles.length}${materials}`,
|
|
53
52
|
` Created: ${summary.createdAt}`,
|
|
54
53
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-command.js","sourceRoot":"","sources":["../../src/cli/list-command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"list-command.js","sourceRoot":"","sources":["../../src/cli/list-command.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/manifest.d.ts
CHANGED
|
@@ -1,13 +1,24 @@
|
|
|
1
|
+
import type { MlxBackendMode } from '@modular-prompt/driver';
|
|
1
2
|
import type { MaterialInput } from '../extract-elements.js';
|
|
3
|
+
import type { ExtractProvider } from '../extract-runtime-types.js';
|
|
2
4
|
export interface ExtractCacheManifest {
|
|
3
5
|
version: 1;
|
|
4
6
|
/** Store name for self-describing cache directories. */
|
|
5
7
|
storename?: string;
|
|
6
8
|
model: string;
|
|
9
|
+
/** Provider that owns the persisted cache format. Missing means legacy MLX. */
|
|
10
|
+
provider?: ExtractProvider;
|
|
11
|
+
/** MLX backend selected when the store was prepared. Missing means `auto` for legacy stores. */
|
|
12
|
+
backend?: MlxBackendMode;
|
|
13
|
+
/** VLM image resize limit used to prepare the persisted cache. */
|
|
14
|
+
maxImageSize?: number;
|
|
7
15
|
materials: MaterialInput[];
|
|
8
16
|
createdAt: string;
|
|
9
17
|
updatedAt?: string;
|
|
10
18
|
}
|
|
19
|
+
export declare function isExtractProvider(value: unknown): value is ExtractProvider;
|
|
20
|
+
/** Resolve the provider of a manifest, preserving compatibility with MLX stores created before v1 provider metadata. */
|
|
21
|
+
export declare function getManifestProvider(manifest: ExtractCacheManifest): ExtractProvider;
|
|
11
22
|
export declare function manifestPath(cacheDir: string): string;
|
|
12
23
|
export declare function manifestExists(cacheDir: string): Promise<boolean>;
|
|
13
24
|
export declare function readManifest(cacheDir: string): Promise<ExtractCacheManifest>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/cli/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/cli/manifest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAGnE,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,CAAC,CAAC;IACX,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,gGAAgG;IAChG,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAED,wHAAwH;AACxH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,oBAAoB,GAAG,eAAe,CAEnF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvE;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAkBlF;AAED,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAMf"}
|
package/dist/cli/manifest.js
CHANGED
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { readFile, writeFile, access } from 'node:fs/promises';
|
|
2
2
|
import { join } from 'node:path';
|
|
3
3
|
import { MANIFEST_FILENAME } from './constants.js';
|
|
4
|
+
function isMlxBackend(value) {
|
|
5
|
+
return value === 'auto' || value === 'lm' || value === 'vlm' || value === 'optiq';
|
|
6
|
+
}
|
|
7
|
+
export function isExtractProvider(value) {
|
|
8
|
+
return value === 'mlx' || value === 'pytorch';
|
|
9
|
+
}
|
|
10
|
+
/** Resolve the provider of a manifest, preserving compatibility with MLX stores created before v1 provider metadata. */
|
|
11
|
+
export function getManifestProvider(manifest) {
|
|
12
|
+
return manifest.provider ?? 'mlx';
|
|
13
|
+
}
|
|
4
14
|
export function manifestPath(cacheDir) {
|
|
5
15
|
return join(cacheDir, MANIFEST_FILENAME);
|
|
6
16
|
}
|
|
@@ -19,6 +29,12 @@ export async function readManifest(cacheDir) {
|
|
|
19
29
|
if (parsed.version !== 1
|
|
20
30
|
|| !parsed.model
|
|
21
31
|
|| !Array.isArray(parsed.materials)
|
|
32
|
+
|| (parsed.provider !== undefined && !isExtractProvider(parsed.provider))
|
|
33
|
+
|| (parsed.backend !== undefined && !isMlxBackend(parsed.backend))
|
|
34
|
+
|| (parsed.maxImageSize !== undefined
|
|
35
|
+
&& (typeof parsed.maxImageSize !== 'number'
|
|
36
|
+
|| !Number.isFinite(parsed.maxImageSize)
|
|
37
|
+
|| parsed.maxImageSize <= 0))
|
|
22
38
|
|| (parsed.updatedAt !== undefined && typeof parsed.updatedAt !== 'string')) {
|
|
23
39
|
throw new Error(`Invalid manifest: ${manifestPath(cacheDir)}`);
|
|
24
40
|
}
|
package/dist/cli/manifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/cli/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/cli/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAkBnD,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,OAAO,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS,CAAC;AAChD,CAAC;AAED,wHAAwH;AACxH,MAAM,UAAU,mBAAmB,CAAC,QAA8B;IAChE,OAAO,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QACrC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;IACvD,IACE,MAAM,CAAC,OAAO,KAAK,CAAC;WACjB,CAAC,MAAM,CAAC,KAAK;WACb,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;WAChC,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;WACtE,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;WAC/D,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS;eAChC,CAAC,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ;mBACtC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC;mBACrC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;WAC9B,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,CAAC,EAC3E,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,QAA8B;IAE9B,MAAM,SAAS,CACb,YAAY,CAAC,QAAQ,CAAC,EACtB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACxC,OAAO,CACR,CAAC;AACJ,CAAC"}
|
package/dist/cli/store.d.ts
CHANGED
|
@@ -4,6 +4,26 @@ export declare function validateStorename(storename: string): void;
|
|
|
4
4
|
export declare function resolveStoreDir(containerDir: string, storename: string): string;
|
|
5
5
|
/** Return whether a path already exists, regardless of its file type. */
|
|
6
6
|
export declare function storeExists(storeDir: string): Promise<boolean>;
|
|
7
|
-
/** Return whether
|
|
7
|
+
/** Return whether a store entry is a persisted KV cache file or namespace. */
|
|
8
8
|
export declare function isKvCacheFile(filename: string): boolean;
|
|
9
|
+
export type StoreKvCacheIssue = 'missing' | 'cache-invalid' | 'index-invalid' | 'index-entry-missing';
|
|
10
|
+
export interface StoreKvCacheStatus {
|
|
11
|
+
/** Whether the store has a cache that can be used by a new extract session. */
|
|
12
|
+
hasKvCache: boolean;
|
|
13
|
+
/** Whether extract should run a full prefill before the user query. */
|
|
14
|
+
needsRebuild: boolean;
|
|
15
|
+
/** Whether the controller can use an indexed cache as an incremental base. */
|
|
16
|
+
hasIncrementalBase: boolean;
|
|
17
|
+
issue?: StoreKvCacheIssue;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Inspect the persisted cache without starting a model runtime.
|
|
21
|
+
*
|
|
22
|
+
* A cache-index entry is considered usable only when its referenced cache and
|
|
23
|
+
* token metadata exist. A store without an index can still be used for an
|
|
24
|
+
* exact cache hit (legacy layout), but it cannot provide an incremental base.
|
|
25
|
+
*/
|
|
26
|
+
export declare function inspectStoreKvCache(storeDir: string): Promise<StoreKvCacheStatus>;
|
|
27
|
+
/** Warning emitted after an automatic full cache rebuild. */
|
|
28
|
+
export declare function formatKvCacheRebuildWarning(storename: string, materialCount: number): string;
|
|
9
29
|
//# sourceMappingURL=store.d.ts.map
|
package/dist/cli/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cli/store.ts"],"names":[],"mappings":"AAMA,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAUzD;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/E;AAED,yEAAyE;AACzE,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUpE;AAED,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cli/store.ts"],"names":[],"mappings":"AAMA,kEAAkE;AAClE,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAUzD;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAG/E;AAED,yEAAyE;AACzE,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUpE;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAKvD;AAID,MAAM,MAAM,iBAAiB,GACzB,SAAS,GACT,eAAe,GACf,eAAe,GACf,qBAAqB,CAAC;AAE1B,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,UAAU,EAAE,OAAO,CAAC;IACpB,uEAAuE;IACvE,YAAY,EAAE,OAAO,CAAC;IACtB,8EAA8E;IAC9E,kBAAkB,EAAE,OAAO,CAAC;IAC5B,KAAK,CAAC,EAAE,iBAAiB,CAAC;CAC3B;AAwID;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgEvF;AAED,6DAA6D;AAC7D,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAG5F"}
|
package/dist/cli/store.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { stat } from 'node:fs/promises';
|
|
2
|
-
import { join } from 'node:path';
|
|
1
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { isAbsolute, join, relative, resolve, sep } from 'node:path';
|
|
3
3
|
const STORE_NAME_PATTERN = /^[a-zA-Z0-9][a-zA-Z0-9_-]*$/;
|
|
4
4
|
const RESERVED_STORE_NAMES = new Set(['create', 'add', 'extract', 'list', 'clean']);
|
|
5
5
|
/** Validate a store name used as a single directory component. */
|
|
@@ -29,8 +29,193 @@ export async function storeExists(storeDir) {
|
|
|
29
29
|
throw error;
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
/** Return whether
|
|
32
|
+
/** Return whether a store entry is a persisted KV cache file or namespace. */
|
|
33
33
|
export function isKvCacheFile(filename) {
|
|
34
|
-
return filename.endsWith('.safetensors.zip')
|
|
34
|
+
return filename.endsWith('.safetensors.zip')
|
|
35
|
+
|| filename.endsWith('.pytorch-cache')
|
|
36
|
+
|| filename.endsWith('.vlm.safetensors')
|
|
37
|
+
|| filename.endsWith('.vlm-vision.safetensors');
|
|
38
|
+
}
|
|
39
|
+
const CACHE_INDEX_FILENAME = 'cache-index.json';
|
|
40
|
+
function isRecord(value) {
|
|
41
|
+
return typeof value === 'object' && value !== null;
|
|
42
|
+
}
|
|
43
|
+
function isVlmCachePath(cachePath) {
|
|
44
|
+
return cachePath.split(sep).some((segment) => segment.endsWith('.vlm.safetensors')
|
|
45
|
+
|| segment.endsWith('.vlm-vision.safetensors'));
|
|
46
|
+
}
|
|
47
|
+
async function hasHealthyCacheFile(cachePath) {
|
|
48
|
+
let cacheStat;
|
|
49
|
+
try {
|
|
50
|
+
cacheStat = await stat(cachePath);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (cacheStat.isDirectory()) {
|
|
56
|
+
let entries;
|
|
57
|
+
try {
|
|
58
|
+
entries = await readdir(cachePath, { withFileTypes: true });
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
const childPath = join(cachePath, entry.name);
|
|
65
|
+
if (entry.isDirectory() && await hasHealthyCacheFile(childPath)) {
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
if (entry.isFile() && entry.name.endsWith('.safetensors')) {
|
|
69
|
+
if (await hasHealthyCacheFile(childPath)) {
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
if (!cacheStat.isFile()) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const metadata = JSON.parse(await readFile(`${cachePath}.meta.json`, 'utf-8'));
|
|
81
|
+
return typeof metadata.token_count === 'number' && metadata.token_count > 0;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async function readCacheIndex(storeDir) {
|
|
88
|
+
try {
|
|
89
|
+
const parsed = JSON.parse(await readFile(join(storeDir, CACHE_INDEX_FILENAME), 'utf-8'));
|
|
90
|
+
if (!isRecord(parsed)
|
|
91
|
+
|| parsed.version !== 1
|
|
92
|
+
|| !Array.isArray(parsed.entries)
|
|
93
|
+
|| !parsed.entries.every(isRecord)) {
|
|
94
|
+
return { present: true };
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
present: true,
|
|
98
|
+
entries: parsed.entries,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
|
|
103
|
+
return { present: false };
|
|
104
|
+
}
|
|
105
|
+
return { present: true };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function resolveIndexedCachePath(storeDir, entry) {
|
|
109
|
+
if (typeof entry.key !== 'string' || entry.key.length === 0) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
let indexedPath;
|
|
113
|
+
if (typeof entry.path === 'string') {
|
|
114
|
+
if (entry.path.startsWith('memory://')) {
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
indexedPath = entry.path;
|
|
118
|
+
}
|
|
119
|
+
else if (entry.backend === 'pytorch') {
|
|
120
|
+
indexedPath = `${entry.key}.pytorch-cache`;
|
|
121
|
+
}
|
|
122
|
+
else if (entry.backend === undefined || entry.backend === 'lm') {
|
|
123
|
+
indexedPath = `${entry.key}.safetensors.zip`;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
return undefined;
|
|
127
|
+
}
|
|
128
|
+
const resolvedStoreDir = resolve(storeDir);
|
|
129
|
+
const resolvedPath = isAbsolute(indexedPath)
|
|
130
|
+
? resolve(indexedPath)
|
|
131
|
+
: resolve(resolvedStoreDir, indexedPath);
|
|
132
|
+
const pathFromStore = relative(resolvedStoreDir, resolvedPath);
|
|
133
|
+
if (pathFromStore.length === 0
|
|
134
|
+
|| pathFromStore === '..'
|
|
135
|
+
|| pathFromStore.startsWith(`..${sep}`)) {
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
return resolvedPath;
|
|
139
|
+
}
|
|
140
|
+
async function listRawCachePaths(storeDir) {
|
|
141
|
+
let entries;
|
|
142
|
+
try {
|
|
143
|
+
entries = await readdir(storeDir, { withFileTypes: true });
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return [];
|
|
147
|
+
}
|
|
148
|
+
return entries
|
|
149
|
+
.filter((entry) => (entry.isFile() || entry.isDirectory()) && isKvCacheFile(entry.name))
|
|
150
|
+
.map((entry) => join(storeDir, entry.name));
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Inspect the persisted cache without starting a model runtime.
|
|
154
|
+
*
|
|
155
|
+
* A cache-index entry is considered usable only when its referenced cache and
|
|
156
|
+
* token metadata exist. A store without an index can still be used for an
|
|
157
|
+
* exact cache hit (legacy layout), but it cannot provide an incremental base.
|
|
158
|
+
*/
|
|
159
|
+
export async function inspectStoreKvCache(storeDir) {
|
|
160
|
+
const rawCachePaths = await listRawCachePaths(storeDir);
|
|
161
|
+
const index = await readCacheIndex(storeDir);
|
|
162
|
+
if (!index.present) {
|
|
163
|
+
const hasHealthyCache = (await Promise.all(rawCachePaths.map((cachePath) => hasHealthyCacheFile(cachePath)))).some(Boolean);
|
|
164
|
+
return {
|
|
165
|
+
hasKvCache: hasHealthyCache,
|
|
166
|
+
needsRebuild: !hasHealthyCache,
|
|
167
|
+
hasIncrementalBase: false,
|
|
168
|
+
...(hasHealthyCache
|
|
169
|
+
? {}
|
|
170
|
+
: { issue: rawCachePaths.length > 0 ? 'cache-invalid' : 'missing' }),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
if (!index.entries) {
|
|
174
|
+
return {
|
|
175
|
+
hasKvCache: false,
|
|
176
|
+
needsRebuild: true,
|
|
177
|
+
hasIncrementalBase: false,
|
|
178
|
+
issue: 'index-invalid',
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
const activeEntries = index.entries.filter((entry) => entry.hint !== 'release');
|
|
182
|
+
if (activeEntries.length === 0) {
|
|
183
|
+
return {
|
|
184
|
+
hasKvCache: false,
|
|
185
|
+
needsRebuild: true,
|
|
186
|
+
hasIncrementalBase: false,
|
|
187
|
+
issue: 'index-entry-missing',
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
const indexedCachePaths = activeEntries.map((entry) => resolveIndexedCachePath(storeDir, entry));
|
|
191
|
+
const entriesAreHealthy = await Promise.all(indexedCachePaths.map(async (cachePath) => {
|
|
192
|
+
return cachePath !== undefined && await hasHealthyCacheFile(cachePath);
|
|
193
|
+
}));
|
|
194
|
+
if (!entriesAreHealthy.every(Boolean)) {
|
|
195
|
+
return {
|
|
196
|
+
hasKvCache: false,
|
|
197
|
+
needsRebuild: true,
|
|
198
|
+
hasIncrementalBase: false,
|
|
199
|
+
issue: 'index-entry-missing',
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
// VLM exact snapshots are valid exact-cache hits, but the VLM controllers
|
|
203
|
+
// intentionally do not search them as incremental bases. `add` must
|
|
204
|
+
// therefore take the full-rebuild path even when the snapshot is healthy.
|
|
205
|
+
const hasVlmNamespace = activeEntries.some((entry, index) => {
|
|
206
|
+
const indexedPath = indexedCachePaths[index];
|
|
207
|
+
return entry.backend === 'vlm'
|
|
208
|
+
|| (indexedPath !== undefined && isVlmCachePath(indexedPath));
|
|
209
|
+
});
|
|
210
|
+
return {
|
|
211
|
+
hasKvCache: true,
|
|
212
|
+
needsRebuild: false,
|
|
213
|
+
hasIncrementalBase: !hasVlmNamespace,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
/** Warning emitted after an automatic full cache rebuild. */
|
|
217
|
+
export function formatKvCacheRebuildWarning(storename, materialCount) {
|
|
218
|
+
return `warning: KV cache missing for store '${storename}'; `
|
|
219
|
+
+ `rebuilt cache from manifest (${materialCount} materials).`;
|
|
35
220
|
}
|
|
36
221
|
//# sourceMappingURL=store.js.map
|
package/dist/cli/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cli/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cli/store.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -15,9 +15,9 @@ function printHelp() {
|
|
|
15
15
|
console.log(`modular-prompt-extract v${packageJson.version}
|
|
16
16
|
|
|
17
17
|
Usage:
|
|
18
|
-
modular-prompt-extract create <storename> [-d <cache-dir>] [-m <model>] [--dry-run] <files...>
|
|
19
|
-
modular-prompt-extract add <storename> [-d <cache-dir>] [--dry-run] <files...>
|
|
20
|
-
modular-prompt-extract extract <storename> [-d <cache-dir>] [--max-tokens <n>] [--dry-run] <query...>
|
|
18
|
+
modular-prompt-extract create <storename> [-d <cache-dir>] [-m <model>] [--provider <mlx|pytorch>] [--dry-run] <files...>
|
|
19
|
+
modular-prompt-extract add <storename> [-d <cache-dir>] [--auto-rebuild-cache|--no-auto-rebuild-cache] [--dry-run] <files...>
|
|
20
|
+
modular-prompt-extract extract <storename> [-d <cache-dir>] [--max-tokens <n>] [--auto-rebuild-cache|--no-auto-rebuild-cache] [--dry-run] <query...>
|
|
21
21
|
modular-prompt-extract list [-d <cache-dir>]
|
|
22
22
|
modular-prompt-extract clean <storename> [-d <cache-dir>]
|
|
23
23
|
modular-prompt-extract clean --all [-d <cache-dir>]
|
|
@@ -31,9 +31,12 @@ Commands:
|
|
|
31
31
|
|
|
32
32
|
Options:
|
|
33
33
|
-d, --cache-dir <path> Store container directory (default: ${resolveDefaultContainerDir()})
|
|
34
|
-
-m, --model <model>
|
|
34
|
+
-m, --model <model> Model alias from models.yaml or raw model id
|
|
35
|
+
--provider <provider> Extract provider for create (mlx or pytorch)
|
|
35
36
|
--max-tokens <n> Max tokens for extract (default: ${DEFAULT_MAX_TOKENS})
|
|
36
|
-
--
|
|
37
|
+
--auto-rebuild-cache Enable KV cache regeneration (add/extract; default)
|
|
38
|
+
--no-auto-rebuild-cache Do not regenerate a missing KV cache (add/extract)
|
|
39
|
+
--dry-run Compile and print full prompt text (no driver / no cache write)
|
|
37
40
|
--all Remove the entire cache container (clean only)
|
|
38
41
|
-h, --help Show help
|
|
39
42
|
|
|
@@ -41,11 +44,13 @@ Store name:
|
|
|
41
44
|
Must match [a-zA-Z0-9][a-zA-Z0-9_-]* and cannot be create, add, extract, list, or clean.
|
|
42
45
|
|
|
43
46
|
Note:
|
|
44
|
-
Without -m, models.default
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
MLX backend
|
|
47
|
+
Without -m, models.default is selected from ~/.modular-prompt/models.yaml
|
|
48
|
+
(MODULAR_PROMPT_HOME can override its location). No model is bundled.
|
|
49
|
+
If no model is configured, specify -m <model-id-or-alias> or define models.default
|
|
50
|
+
in the user models.yaml.
|
|
51
|
+
MLX backend follows models.yaml (backend: auto by default; lm/vlm may be
|
|
52
|
+
selected explicitly). PyTorch extract is text-only and uses device/venvPath
|
|
53
|
+
from models.yaml driverOptions. Store manifests persist provider and model.
|
|
49
54
|
`);
|
|
50
55
|
}
|
|
51
56
|
async function main() {
|
|
@@ -63,6 +68,7 @@ async function main() {
|
|
|
63
68
|
cacheDir,
|
|
64
69
|
storename: parsed.storename,
|
|
65
70
|
model: parsed.model,
|
|
71
|
+
provider: parsed.provider,
|
|
66
72
|
files: parsed.positional,
|
|
67
73
|
dryRun: parsed.dryRun,
|
|
68
74
|
});
|
|
@@ -77,6 +83,7 @@ async function main() {
|
|
|
77
83
|
storename: parsed.storename,
|
|
78
84
|
files: parsed.positional,
|
|
79
85
|
dryRun: parsed.dryRun,
|
|
86
|
+
autoRebuildCache: parsed.autoRebuildCache,
|
|
80
87
|
});
|
|
81
88
|
if (typeof output === 'string') {
|
|
82
89
|
process.stdout.write(`${output}\n`);
|
|
@@ -90,6 +97,7 @@ async function main() {
|
|
|
90
97
|
query: parsed.positional.join(' '),
|
|
91
98
|
maxTokens: parsed.maxTokens,
|
|
92
99
|
dryRun: parsed.dryRun,
|
|
100
|
+
autoRebuildCache: parsed.autoRebuildCache,
|
|
93
101
|
});
|
|
94
102
|
process.stdout.write(`${text}\n`);
|
|
95
103
|
return;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CACnC,CAAC;AAEzB,SAAS,SAAS;IAChB,OAAO,CAAC,GAAG,CAAC,2BAA2B,WAAW,CAAC,OAAO;;;;;;;;;;;;;;;;;;iEAkBK,0BAA0B,EAAE
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { MlxBackendMode } from '@modular-prompt/driver';
|
|
2
|
+
import { type ExtractProvider } from './model-resolution.js';
|
|
3
|
+
import type { ExtractRuntime } from './extract-runtime-types.js';
|
|
4
|
+
export interface ExtractRuntimeOptions {
|
|
5
|
+
/** Model alias or provider-specific model ID. */
|
|
6
|
+
model?: string;
|
|
7
|
+
/** Explicit provider for raw IDs or persisted store validation. */
|
|
8
|
+
provider?: ExtractProvider;
|
|
9
|
+
/** Fixed cache directory. When omitted, a managed temp directory is used. */
|
|
10
|
+
cacheDir?: string;
|
|
11
|
+
/** MLX backend; ignored for PyTorch. */
|
|
12
|
+
backend?: MlxBackendMode;
|
|
13
|
+
/** MLX VLM image resize limit; ignored for PyTorch. */
|
|
14
|
+
maxImageSize?: number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create the cache-capable runtime selected by the resolved model provider.
|
|
18
|
+
* The original model reference is passed to the provider runtime so alias
|
|
19
|
+
* driverOptions (device, venvPath, backend, and so on) are preserved.
|
|
20
|
+
*/
|
|
21
|
+
export declare function createExtractRuntime(options: ExtractRuntimeOptions): Promise<ExtractRuntime>;
|
|
22
|
+
//# sourceMappingURL=create-extract-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-extract-runtime.d.ts","sourceRoot":"","sources":["../src/create-extract-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,OAAO,EAGL,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,WAAW,qBAAqB;IACpC,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,cAAc,CAAC,CA0BzB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createMlxExtractRuntime } from './create-mlx-extract-runtime.js';
|
|
2
|
+
import { createPytorchExtractRuntime } from './create-pytorch-extract-runtime.js';
|
|
3
|
+
import { resolveMergedModels, resolveModelSpec, } from './model-resolution.js';
|
|
4
|
+
/**
|
|
5
|
+
* Create the cache-capable runtime selected by the resolved model provider.
|
|
6
|
+
* The original model reference is passed to the provider runtime so alias
|
|
7
|
+
* driverOptions (device, venvPath, backend, and so on) are preserved.
|
|
8
|
+
*/
|
|
9
|
+
export async function createExtractRuntime(options) {
|
|
10
|
+
const resolved = resolveModelSpec(options.model, resolveMergedModels(), options.provider);
|
|
11
|
+
if (resolved.provider === 'mlx') {
|
|
12
|
+
return createMlxExtractRuntime({
|
|
13
|
+
model: options.model,
|
|
14
|
+
...(options.backend !== undefined ? { backend: options.backend } : {}),
|
|
15
|
+
...(options.cacheDir !== undefined ? { cacheDir: options.cacheDir } : {}),
|
|
16
|
+
...(options.maxImageSize !== undefined ? { maxImageSize: options.maxImageSize } : {}),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
if (resolved.provider === 'pytorch') {
|
|
20
|
+
return createPytorchExtractRuntime({
|
|
21
|
+
model: options.model,
|
|
22
|
+
...(options.cacheDir !== undefined ? { cacheDir: options.cacheDir } : {}),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
throw new Error(`Extract supports MLX and PyTorch models, but '${resolved.model}' uses provider '${resolved.provider}'`);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=create-extract-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-extract-runtime.js","sourceRoot":"","sources":["../src/create-extract-runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GAEjB,MAAM,uBAAuB,CAAC;AAgB/B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAA8B;IAE9B,MAAM,QAAQ,GAAG,gBAAgB,CAC/B,OAAO,CAAC,KAAK,EACb,mBAAmB,EAAE,EACrB,OAAO,CAAC,QAAQ,CACjB,CAAC;IAEF,IAAI,QAAQ,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAChC,OAAO,uBAAuB,CAAC;YAC7B,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACtF,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpC,OAAO,2BAA2B,CAAC;YACjC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1E,CAAC,CAAC;IACL,CAAC;IAED,MAAM,IAAI,KAAK,CACb,iDAAiD,QAAQ,CAAC,KAAK,oBAAoB,QAAQ,CAAC,QAAQ,GAAG,CACxG,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-extract-session.d.ts","sourceRoot":"","sources":["../src/create-extract-session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAiC,cAAc,EAA8B,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAyBnI,wBAAgB,oBAAoB,CAAC,QAAQ,GAAG,cAAc,EAC5D,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,GACvC,cAAc,
|
|
1
|
+
{"version":3,"file":"create-extract-session.d.ts","sourceRoot":"","sources":["../src/create-extract-session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EAAiC,cAAc,EAA8B,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAyBnI,wBAAgB,oBAAoB,CAAC,QAAQ,GAAG,cAAc,EAC5D,OAAO,EAAE,qBAAqB,CAAC,QAAQ,CAAC,GACvC,cAAc,CAiFhB"}
|