@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.
Files changed (81) hide show
  1. package/README.md +83 -24
  2. package/dist/cache-lifecycle.d.ts +5 -1
  3. package/dist/cache-lifecycle.d.ts.map +1 -1
  4. package/dist/cache-lifecycle.js +22 -0
  5. package/dist/cache-lifecycle.js.map +1 -1
  6. package/dist/cli/add-command.d.ts +2 -0
  7. package/dist/cli/add-command.d.ts.map +1 -1
  8. package/dist/cli/add-command.js +9 -3
  9. package/dist/cli/add-command.js.map +1 -1
  10. package/dist/cli/args.d.ts +3 -0
  11. package/dist/cli/args.d.ts.map +1 -1
  12. package/dist/cli/args.js +29 -0
  13. package/dist/cli/args.js.map +1 -1
  14. package/dist/cli/constants.d.ts +4 -0
  15. package/dist/cli/constants.d.ts.map +1 -1
  16. package/dist/cli/constants.js +19 -0
  17. package/dist/cli/constants.js.map +1 -1
  18. package/dist/cli/create-command.d.ts +2 -0
  19. package/dist/cli/create-command.d.ts.map +1 -1
  20. package/dist/cli/create-command.js +11 -4
  21. package/dist/cli/create-command.js.map +1 -1
  22. package/dist/cli/extract-command.d.ts +2 -0
  23. package/dist/cli/extract-command.d.ts.map +1 -1
  24. package/dist/cli/extract-command.js +22 -5
  25. package/dist/cli/extract-command.js.map +1 -1
  26. package/dist/cli/list-command.d.ts +1 -0
  27. package/dist/cli/list-command.d.ts.map +1 -1
  28. package/dist/cli/list-command.js +6 -7
  29. package/dist/cli/list-command.js.map +1 -1
  30. package/dist/cli/manifest.d.ts +11 -0
  31. package/dist/cli/manifest.d.ts.map +1 -1
  32. package/dist/cli/manifest.js +16 -0
  33. package/dist/cli/manifest.js.map +1 -1
  34. package/dist/cli/store.d.ts +21 -1
  35. package/dist/cli/store.d.ts.map +1 -1
  36. package/dist/cli/store.js +189 -4
  37. package/dist/cli/store.js.map +1 -1
  38. package/dist/cli.js +18 -10
  39. package/dist/cli.js.map +1 -1
  40. package/dist/create-extract-runtime.d.ts +22 -0
  41. package/dist/create-extract-runtime.d.ts.map +1 -0
  42. package/dist/create-extract-runtime.js +27 -0
  43. package/dist/create-extract-runtime.js.map +1 -0
  44. package/dist/create-extract-session.d.ts.map +1 -1
  45. package/dist/create-extract-session.js +8 -2
  46. package/dist/create-extract-session.js.map +1 -1
  47. package/dist/create-mlx-extract-runtime.d.ts +18 -7
  48. package/dist/create-mlx-extract-runtime.d.ts.map +1 -1
  49. package/dist/create-mlx-extract-runtime.js +11 -1
  50. package/dist/create-mlx-extract-runtime.js.map +1 -1
  51. package/dist/create-pytorch-extract-runtime.d.ts +13 -0
  52. package/dist/create-pytorch-extract-runtime.d.ts.map +1 -0
  53. package/dist/create-pytorch-extract-runtime.js +52 -0
  54. package/dist/create-pytorch-extract-runtime.js.map +1 -0
  55. package/dist/default-models.d.ts +3 -8
  56. package/dist/default-models.d.ts.map +1 -1
  57. package/dist/default-models.js +4 -16
  58. package/dist/default-models.js.map +1 -1
  59. package/dist/extract-runtime-types.d.ts +16 -0
  60. package/dist/extract-runtime-types.d.ts.map +1 -0
  61. package/dist/extract-runtime-types.js +2 -0
  62. package/dist/extract-runtime-types.js.map +1 -0
  63. package/dist/extract-store.d.ts +48 -2
  64. package/dist/extract-store.d.ts.map +1 -1
  65. package/dist/extract-store.js +108 -10
  66. package/dist/extract-store.js.map +1 -1
  67. package/dist/index.d.ts +5 -0
  68. package/dist/index.d.ts.map +1 -1
  69. package/dist/index.js +2 -0
  70. package/dist/index.js.map +1 -1
  71. package/dist/model-resolution.d.ts +15 -5
  72. package/dist/model-resolution.d.ts.map +1 -1
  73. package/dist/model-resolution.js +87 -27
  74. package/dist/model-resolution.js.map +1 -1
  75. package/dist/types.d.ts +12 -0
  76. package/dist/types.d.ts.map +1 -1
  77. package/docs/API.md +320 -0
  78. package/docs/CACHE_DESIGN.md +557 -0
  79. package/docs/LOCAL_MODEL_SETUP.md +765 -0
  80. package/docs/PROMPT_MODULE_SPEC.md +482 -0
  81. package/package.json +6 -4
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EACL,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EACV,UAAU,EACV,eAAe,EACf,WAAW,EACX,aAAa,EACb,cAAc,EACd,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,aAAa,EACb,cAAc,EACd,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EACV,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EACL,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,YAAY,EACV,UAAU,EACV,eAAe,EACf,WAAW,EACX,aAAa,EACb,cAAc,EACd,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,aAAa,EACb,cAAc,EACd,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,qBAAqB,GACtB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AACzC,YAAY,EACV,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,cAAc,EACd,eAAe,GAChB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACzE,YAAY,EACV,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,7 @@
1
1
  export { createExtractSession } from './create-extract-session.js';
2
2
  export { createMlxExtractRuntime } from './create-mlx-extract-runtime.js';
3
+ export { createPytorchExtractRuntime } from './create-pytorch-extract-runtime.js';
4
+ export { createExtractRuntime } from './create-extract-runtime.js';
3
5
  export { createDriver, resolveMergedModels, resolveModelSpec, } from './model-resolution.js';
4
6
  export { resolveSessionModules } from './resolve-session-modules.js';
5
7
  export { resolveDefaultContainerDir, } from './cli/constants.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EACL,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EACL,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EACL,UAAU,EACV,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC"}
@@ -1,24 +1,34 @@
1
- import { type AIDriver, type ModelSpec, type ModelsConfig, type PromptCacheController } from '@modular-prompt/driver';
1
+ import { type AIDriver, type MlxBackendMode, type ModelSpec, type ModelsConfig, type PromptCacheController } from '@modular-prompt/driver';
2
+ import type { ExtractProvider } from './extract-runtime-types.js';
3
+ export type { ExtractProvider } from './extract-runtime-types.js';
2
4
  /** createDriver に渡す extract 固有の runtime オプション */
3
5
  export interface ExtractDriverOptions {
4
6
  /** セッションと共有する KV cache controller */
5
7
  cacheController?: PromptCacheController;
8
+ /** Explicit extract provider, used for raw model IDs and store validation. */
9
+ provider?: ExtractProvider;
10
+ /** Persisted or explicitly selected MLX backend for extract. */
11
+ backend?: MlxBackendMode;
12
+ /** VLM image resize limit for driver/cache alignment. */
13
+ maxImageSize?: number;
6
14
  }
7
15
  export interface ExtractDriverResult {
8
16
  driver: AIDriver;
9
17
  /** alias 解決後の生 model ID */
10
18
  spec: ModelSpec;
11
19
  }
12
- /** bundled + user models.yaml を解決する(user の default/alias が優先)。 */
20
+ export declare function isExtractProvider(value: unknown): value is ExtractProvider;
21
+ /** user models.yaml を含む models 設定を解決する(user の default/alias を使用)。 */
13
22
  export declare function resolveMergedModels(): ModelsConfig;
14
23
  /**
15
24
  * extract で使用する ModelSpec を解決する。
16
25
  *
17
- * 優先順位は明示 model(alias または生 ID)→ models.default → models の先頭。
26
+ * 優先順位は明示 model(alias または生 ID)→ models.default。
27
+ * 同梱の暗黙 default や models の先頭エントリは使用しない。
18
28
  */
19
- export declare function resolveModelSpec(model: string | undefined, models?: ModelsConfig): ModelSpec;
29
+ export declare function resolveModelSpec(model: string | undefined, models?: ModelsConfig, provider?: ExtractProvider): ModelSpec;
20
30
  /**
21
- * ModelSpec を AIService 経由で MLX driver に変換する。
31
+ * ModelSpec を AIService 経由で extract 対応 driver に変換する。
22
32
  * runtime が作成した cache controller は driver と共有する。
23
33
  */
24
34
  export declare function createDriver(model: string | undefined, options?: ExtractDriverOptions): Promise<ExtractDriverResult>;
@@ -1 +1 @@
1
- {"version":3,"file":"model-resolution.d.ts","sourceRoot":"","sources":["../src/model-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,QAAQ,EAEb,KAAK,SAAS,EACd,KAAK,YAAY,EAEjB,KAAK,qBAAqB,EAC3B,MAAM,wBAAwB,CAAC;AAGhC,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,eAAe,CAAC,EAAE,qBAAqB,CAAC;CACzC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,QAAQ,CAAC;IACjB,2BAA2B;IAC3B,IAAI,EAAE,SAAS,CAAC;CACjB;AAWD,kEAAkE;AAClE,wBAAgB,mBAAmB,IAAI,YAAY,CAElD;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,GAAE,YAAoC,GAC3C,SAAS,CAgBX;AAyBD;;;GAGG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAK9B"}
1
+ {"version":3,"file":"model-resolution.d.ts","sourceRoot":"","sources":["../src/model-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,QAAQ,EACb,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,YAAY,EAGjB,KAAK,qBAAqB,EAC3B,MAAM,wBAAwB,CAAC;AAEhC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,YAAY,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,eAAe,CAAC,EAAE,qBAAqB,CAAC;IACxC,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,gEAAgE;IAChE,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,yDAAyD;IACzD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,QAAQ,CAAC;IACjB,2BAA2B;IAC3B,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AAMD,qEAAqE;AACrE,wBAAgB,mBAAmB,IAAI,YAAY,CAElD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,MAAM,GAAE,YAAoC,EAC5C,QAAQ,CAAC,EAAE,eAAe,GACzB,SAAS,CA6CX;AAmED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAQ9B"}
@@ -1,56 +1,116 @@
1
- import { AIService, resolveDefaultModelFromConfig, resolveModelName, resolveModelReference, } from '@modular-prompt/driver';
1
+ import { AIService, inferProvider, resolveModelName, resolveModelReference, } from '@modular-prompt/driver';
2
2
  import { BUNDLED_MODELS_CONFIG } from './default-models.js';
3
- function inferProvider(_model) {
4
- // extract runtime は MLX 専用。生の model ID は MLX model として扱う。
5
- return 'mlx';
3
+ export function isExtractProvider(value) {
4
+ return value === 'mlx' || value === 'pytorch';
6
5
  }
7
6
  function createAIService() {
8
7
  return AIService.fromMergedConfig(BUNDLED_MODELS_CONFIG, undefined, { mode: 'merge' });
9
8
  }
10
- /** bundled + user models.yaml を解決する(user の default/alias が優先)。 */
9
+ /** user models.yaml を含む models 設定を解決する(user の default/alias を使用)。 */
11
10
  export function resolveMergedModels() {
12
11
  return createAIService().modelsConfig;
13
12
  }
14
13
  /**
15
14
  * extract で使用する ModelSpec を解決する。
16
15
  *
17
- * 優先順位は明示 model(alias または生 ID)→ models.default → models の先頭。
16
+ * 優先順位は明示 model(alias または生 ID)→ models.default。
17
+ * 同梱の暗黙 default や models の先頭エントリは使用しない。
18
18
  */
19
- export function resolveModelSpec(model, models = resolveMergedModels()) {
19
+ export function resolveModelSpec(model, models = resolveMergedModels(), provider) {
20
20
  const explicitModel = model?.trim();
21
21
  if (explicitModel) {
22
- return resolveModelReference({ ref: explicitModel }, models)
23
- ?? resolveModelName(explicitModel, models, inferProvider);
22
+ const alias = resolveModelReference({ ref: explicitModel }, models);
23
+ if (alias) {
24
+ if (provider && alias.provider !== provider) {
25
+ throw providerMismatchError(alias.model, provider, alias.provider);
26
+ }
27
+ return alias;
28
+ }
29
+ // Validate raw IDs against exact models.yaml matches when one exists.
30
+ // An explicit provider makes otherwise unconfigured raw IDs usable.
31
+ if (provider) {
32
+ const matchingEntry = Object.values(models.models ?? {})
33
+ .find(entry => entry.model === explicitModel);
34
+ if (matchingEntry) {
35
+ const configured = resolveModelName(explicitModel, models, inferProvider);
36
+ if (configured.provider !== provider) {
37
+ throw providerMismatchError(explicitModel, provider, configured.provider);
38
+ }
39
+ return configured;
40
+ }
41
+ return {
42
+ model: explicitModel,
43
+ provider,
44
+ capabilities: [],
45
+ };
46
+ }
47
+ return resolveModelName(explicitModel, models, inferProvider);
24
48
  }
25
- const fallback = resolveDefaultModelFromConfig(models);
26
- if (fallback) {
27
- return fallback;
49
+ const configuredDefault = resolveModelReference({ ref: 'default' }, models);
50
+ if (configuredDefault) {
51
+ if (provider && configuredDefault.provider !== provider) {
52
+ throw providerMismatchError(configuredDefault.model, provider, configuredDefault.provider);
53
+ }
54
+ return configuredDefault;
28
55
  }
29
- throw new Error('No extract model configured: specify -m <model-id-or-alias> '
56
+ throw new Error('No model configured: specify -m <model-id-or-alias> '
30
57
  + 'or define models.default in ~/.modular-prompt/models.yaml');
31
58
  }
59
+ function providerMismatchError(model, expected, actual) {
60
+ return new Error(`Extract provider mismatch for model '${model}': expected '${expected}', got '${actual}'`);
61
+ }
32
62
  function withExtractDriverOptions(spec, options) {
33
- if (spec.provider !== 'mlx') {
34
- throw new Error(`Extract requires an MLX model, but '${spec.model}' uses provider '${spec.provider}'`);
63
+ if (spec.provider === 'mlx') {
64
+ const existingDriverOptions = spec.driverOptions;
65
+ // Preserve a model's explicit backend and let MLX auto-detect when none is
66
+ // configured. In particular, extract must not force a VLM model through
67
+ // the mlx-lm backend just to enable prompt caching.
68
+ const backend = options.backend ?? spec.backend ?? existingDriverOptions?.backend ?? 'auto';
69
+ const maxImageSize = options.maxImageSize ?? existingDriverOptions?.maxImageSize;
70
+ const driverOptions = {
71
+ ...existingDriverOptions,
72
+ backend,
73
+ ...(maxImageSize !== undefined ? { maxImageSize } : {}),
74
+ ...(options.cacheController ? { cacheController: options.cacheController } : {}),
75
+ };
76
+ return {
77
+ ...spec,
78
+ backend,
79
+ driverOptions,
80
+ };
81
+ }
82
+ if (spec.provider === 'pytorch') {
83
+ const existingDriverOptions = spec.driverOptions;
84
+ // MLX-only backend/image options intentionally do not cross into the
85
+ // text-only PyTorch runtime. Keep PyTorch-specific options intact.
86
+ const pytorchSpec = { ...spec };
87
+ delete pytorchSpec.backend;
88
+ const driverOptions = {
89
+ ...(existingDriverOptions?.venvPath !== undefined
90
+ ? { venvPath: existingDriverOptions.venvPath }
91
+ : {}),
92
+ ...(existingDriverOptions?.device !== undefined
93
+ ? { device: existingDriverOptions.device }
94
+ : {}),
95
+ ...(existingDriverOptions?.cacheDir !== undefined
96
+ ? { cacheDir: existingDriverOptions.cacheDir }
97
+ : {}),
98
+ ...(options.cacheController ? { cacheController: options.cacheController } : {}),
99
+ };
100
+ return {
101
+ ...pytorchSpec,
102
+ driverOptions,
103
+ };
35
104
  }
36
- const driverOptions = {
37
- ...spec.driverOptions,
38
- backend: 'lm',
39
- ...(options.cacheController ? { cacheController: options.cacheController } : {}),
40
- };
41
- return {
42
- ...spec,
43
- backend: 'lm',
44
- driverOptions,
45
- };
105
+ throw new Error(`Extract supports MLX and PyTorch models, but '${spec.model}' uses provider '${spec.provider}'`);
46
106
  }
47
107
  /**
48
- * ModelSpec を AIService 経由で MLX driver に変換する。
108
+ * ModelSpec を AIService 経由で extract 対応 driver に変換する。
49
109
  * runtime が作成した cache controller は driver と共有する。
50
110
  */
51
111
  export async function createDriver(model, options = {}) {
52
112
  const ai = createAIService();
53
- const spec = withExtractDriverOptions(resolveModelSpec(model, ai.modelsConfig), options);
113
+ const spec = withExtractDriverOptions(resolveModelSpec(model, ai.modelsConfig, options.provider), options);
54
114
  const driver = await ai.createDriver(spec);
55
115
  return { driver, spec };
56
116
  }
@@ -1 +1 @@
1
- {"version":3,"file":"model-resolution.js","sourceRoot":"","sources":["../src/model-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,6BAA6B,EAC7B,gBAAgB,EAChB,qBAAqB,GAOtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAc5D,SAAS,aAAa,CAAC,MAAc;IACnC,0DAA0D;IAC1D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,SAAS,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,mBAAmB;IACjC,OAAO,eAAe,EAAE,CAAC,YAAY,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAyB,EACzB,SAAuB,mBAAmB,EAAE;IAE5C,MAAM,aAAa,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC;IACpC,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,qBAAqB,CAAC,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,MAAM,CAAC;eACvD,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,QAAQ,GAAG,6BAA6B,CAAC,MAAM,CAAC,CAAC;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,KAAK,CACb,8DAA8D;UAC5D,2DAA2D,CAC9D,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,IAAe,EACf,OAA6B;IAE7B,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,uCAAuC,IAAI,CAAC,KAAK,oBAAoB,IAAI,CAAC,QAAQ,GAAG,CACtF,CAAC;IACJ,CAAC;IAED,MAAM,aAAa,GAA0B;QAC3C,GAAI,IAAI,CAAC,aAAmD;QAC5D,OAAO,EAAE,IAAI;QACb,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACjF,CAAC;IAEF,OAAO;QACL,GAAG,IAAI;QACP,OAAO,EAAE,IAAI;QACb,aAAa;KACd,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAyB,EACzB,UAAgC,EAAE;IAElC,MAAM,EAAE,GAAG,eAAe,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"model-resolution.js","sourceRoot":"","sources":["../src/model-resolution.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -16,6 +16,12 @@ export interface ExtractSessionOptions<TContext = ExtractContext> {
16
16
  cacheController: PromptCacheController;
17
17
  /** Model identifier for cache prepare (must match the driver). */
18
18
  model: string;
19
+ /**
20
+ * Maximum image edge used by the MLX VLM cache normalizer. The MLX extract
21
+ * runtime supplies this automatically; custom sessions should match the
22
+ * driver's `maxImageSize` setting.
23
+ */
24
+ maxImageSize?: number;
19
25
  /**
20
26
  * Base prompt for extraction task.
21
27
  * 省略時は {@link defaultExtractBaseModule} を使用する。
@@ -30,6 +36,12 @@ export interface ExtractSessionOptions<TContext = ExtractContext> {
30
36
  corpus: ExtractCorpus;
31
37
  /** Output schema (Phase 3: structured output). Accepted at session creation. */
32
38
  schema?: object;
39
+ /**
40
+ * Automatically create a missing disk cache. Existing cache hits remain
41
+ * usable when this is false; misses fall back to an uncached query.
42
+ * Defaults to true.
43
+ */
44
+ autoRebuildCache?: boolean;
33
45
  /**
34
46
  * Cache preparation policy. Normal sessions are best-effort; store
35
47
  * preparation uses `required` so an empty cache handle cannot be committed.
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACzG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,iCAAiC;IACjC,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB,CAAC,QAAQ,GAAG,cAAc;IAC9D,MAAM,EAAE,QAAQ,CAAC;IACjB,kDAAkD;IAClD,eAAe,EAAE,qBAAqB,CAAC;IACvC,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,UAAU,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,kDAAkD;IAClD,MAAM,EAAE,aAAa,CAAC;IACtB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC;IAC7B,6CAA6C;IAC7C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACzD,UAAU,IAAI,aAAa,CAAC,aAAa,CAAC,CAAC;IAC3C,KAAK,CAAC,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACzG,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,aAAa,EACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,oEAAoE;AACpE,MAAM,WAAW,aAAa;IAC5B,oCAAoC;IACpC,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,iCAAiC;IACjC,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB,CAAC,QAAQ,GAAG,cAAc;IAC9D,MAAM,EAAE,QAAQ,CAAC;IACjB,kDAAkD;IAClD,eAAe,EAAE,qBAAqB,CAAC;IACvC,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,UAAU,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACpC;;;OAGG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtC,kDAAkD;IAClD,MAAM,EAAE,aAAa,CAAC;IACtB,gFAAgF;IAChF,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,aAAa,GAAG,UAAU,CAAC;CAC/C;AAED,MAAM,WAAW,cAAc;IAC7B,6DAA6D;IAC7D,GAAG,EAAE,MAAM,GAAG,cAAc,CAAC;IAC7B,6CAA6C;IAC7C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;IAC7B,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACzD,UAAU,IAAI,aAAa,CAAC,aAAa,CAAC,CAAC;IAC3C,KAAK,CAAC,OAAO,CAAC,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5D"}
package/docs/API.md ADDED
@@ -0,0 +1,320 @@
1
+ # @modular-prompt/extract API 仕様
2
+
3
+ > **対象バージョン**: `0.1.0`
4
+ > **利用者向けガイド**: [README.md](./README.md)(サンプル・キャッシュ制約含む)
5
+
6
+ ## 概要
7
+
8
+ `@modular-prompt/extract` は、同一 corpus(文書・対話ログ)に対して **複数の切り口(cue)で繰り返し情報抽出** するためのセッション API を提供する。
9
+
10
+ - 基盤プロンプト(`baseModule`)と corpus(`materials` / `messages`)はセッション存続中固定
11
+ - 各 `extract()` 呼び出しで `cue`(出力切り口)と `inputs`(補強情報)を差し替え
12
+ - **KV キャッシュ連携は必須** — `driver` / `cacheController` / `model` は呼び出し側が用意する
13
+ - **リソースのライフサイクルは呼び出し側が管理** — `ExtractSession.close()` はセッション内 cache handle の `release()` のみ行う
14
+
15
+ ## 責務の分離
16
+
17
+ | コンポーネント | 生成 | 終了 |
18
+ |--------------|------|------|
19
+ | `driver` + `cacheController` | 呼び出し側(または provider runtime factory) | 呼び出し側(`runtime.close()` 等) |
20
+ | `ExtractSession` | `createExtractSession()` | `session.close()` — handle `release()` のみ |
21
+
22
+ `ExtractSession` は driver / cacheController を **借りる** だけで、所有しない。
23
+
24
+ ---
25
+
26
+ ## モジュール構成
27
+
28
+ ```
29
+ base (+ domain) + corpus (materials / messages) + request (inputs) ← cue
30
+ ```
31
+
32
+ | レイヤ | 指定方法 | 役割 |
33
+ |--------|---------|------|
34
+ | **base** | 省略可 → `defaultExtractBaseModule` | 抽出タスクの基本方針 |
35
+ | **domain** | `domainModule`(任意) | 用語定義・追加指示などのドメイン調整 |
36
+ | **data** | `corpus` + `request.inputs` | 抽出対象・補強情報 |
37
+ | **cue** | `request.cue` | 今回の抽出切り口 |
38
+
39
+ ### 入力型(最小入力 → Element 正規化)
40
+
41
+ API 境界では Element を直接渡さない。`buildExtractContext` が正規化する。
42
+
43
+ | スロット | 入力型 | 正規化結果 |
44
+ |---------|--------|-----------|
45
+ | `corpus.materials` | `MaterialInput \| MaterialInput[]` | `MaterialElement`(`cacheHint: immutable`) |
46
+ | `corpus.messages` | `MessageInput \| MessageInput[]` | `MessageElement`(role 別 cacheHint) |
47
+ | `request.inputs` | `string \| ChunkInput \| ...[]` | `ChunkElement`(`cacheHint: contextual`) |
48
+ | `request.cue` | `string \| SectionContent` | `TextElement`(`cacheHint: contextual`) |
49
+
50
+ #### `MaterialInput`
51
+
52
+ ```typescript
53
+ { title: string; content: string | Attachment[]; id?: string; usage?: number }
54
+ ```
55
+
56
+ `id` 省略時は `title` を使用。
57
+
58
+ library API では `content: Attachment[]` による画像 material を指定できます。MLX VLM の画像 cache 経路で利用できる画像は local file path のみで、URL / data URI は未対応です。CLI の `create` / `add` は入力ファイルを UTF-8 text として読むだけで `Attachment` を生成しないため、CLI 画像 material は Phase 3 の対象外です。
59
+
60
+ #### `MessageInput`
61
+
62
+ 標準: `{ role: 'system' | 'assistant' | 'user'; content: ... }`
63
+ ツール結果: `{ role: 'tool'; toolCallId; name; kind; value }`
64
+
65
+ #### `ChunkInput` / `ChunkInputValue`
66
+
67
+ `string` は `content` の省略記法。`partOf` 省略時は `'inputs'`。
68
+
69
+ ---
70
+
71
+ ## エントリポイント
72
+
73
+ ```typescript
74
+ import {
75
+ createExtractSession,
76
+ createMlxExtractRuntime,
77
+ createPytorchExtractRuntime,
78
+ createExtractRuntime,
79
+ resolveModelSpec,
80
+ createDriver,
81
+ buildPreviousExtractionsInputs,
82
+ inputChunk,
83
+ inputChunksFromJson,
84
+ mergeExtractBaseModule,
85
+ defaultExtractBaseModule,
86
+ resolveDefaultContainerDir,
87
+ resolveStoreDir,
88
+ validateStorename,
89
+ } from '@modular-prompt/extract';
90
+ ```
91
+
92
+ named store のパス解決と入力検証をライブラリから利用する場合:
93
+
94
+ ```typescript
95
+ import {
96
+ resolveDefaultContainerDir,
97
+ resolveStoreDir,
98
+ validateStorename,
99
+ } from '@modular-prompt/extract';
100
+
101
+ validateStorename('meeting');
102
+ const storeDir = resolveStoreDir(resolveDefaultContainerDir(), 'meeting');
103
+ ```
104
+
105
+ ### 公開シンボル
106
+
107
+ | シンボル | 種別 | 説明 |
108
+ |---------|------|------|
109
+ | `createExtractSession` | 関数 | 抽出セッションを生成 |
110
+ | `createMlxExtractRuntime` | 関数 | MLX 用 driver + cacheController バンドル |
111
+ | `createPytorchExtractRuntime` | 関数 | PyTorch 用 driver + cacheController バンドル(text-only) |
112
+ | `createExtractRuntime` | 関数 | 解決済み provider に応じた runtime factory |
113
+ | `resolveModelSpec` | 関数 | models.yaml の alias または生 model ID を extract 用 ModelSpec に解決 |
114
+ | `createDriver` | 関数 | 解決済み ModelSpec から AIService 経由で MLX / PyTorch driver を生成 |
115
+ | `resolveSessionModules` | 関数 | base (+ domain) モジュールを解決 |
116
+ | `resolveDefaultContainerDir` | 関数 | `MODULAR_PROMPT_HOME` に基づくデフォルト cache container を解決 |
117
+ | `resolveStoreDir` | 関数 | cache コンテナと storename から store ディレクトリを解決 |
118
+ | `validateStorename` | 関数 | storename の形式と予約語を検証 |
119
+ | `compileExtractPrompt` | 関数 | context 付き compile(高度な用途) |
120
+ | `buildExtractContext` | 関数 | corpus + request から `ExtractContext` を構築 |
121
+ | `defaultExtractBaseModule` | 定数 | デフォルト base `PromptModule` |
122
+ | `mergeExtractBaseModule` | 関数 | デフォルト base に overlay を merge |
123
+ | `buildPreviousExtractionsInputs` | 関数 | 過去抽出結果を `inputs` に変換 |
124
+ | `formatPreviousExtractions` | 関数 | 過去抽出結果をテキストブロック列に整形 |
125
+ | `inputChunk` / `inputChunksFromJson` | 関数 | chunk 入力ヘルパ |
126
+ | `normalizeMaterials` 等 | 関数 | 正規化ヘルパ(テスト・高度な用途) |
127
+
128
+ ### 内部 API(named store 拡張の共有実装)
129
+
130
+ `src/extract-store.ts` は package root からは export しない内部 API ですが、CLI と将来の store 管理入口が共有する disk 上の store 操作を担当します。`add-command.ts` はファイル読み込み、引数由来のエラー、`--dry-run` の出力だけを担当し、prefill と manifest の更新はこの層を呼び出します。
131
+
132
+ | API | 入力 / 出力 | 責務と保証 |
133
+ |-----|-------------|------------|
134
+ | `mergeMaterials(existing, incoming)` | `MaterialInput[]` → merged `MaterialInput[]` | `id`(省略時は `title`)で順序を保ってマージ。同一 id・同一内容はスキップし、内容差分はエラー |
135
+ | `prepareExtractCache({ cacheDir, model, provider?, backend?, maxImageSize?, materials })` | `Promise<{ model, provider, backend?, maxImageSize? }>`(解決済み model/provider) | prepare cue で corpus を KV prefill し、session/runtime を close。manifest は変更しない |
136
+ | `ensureStoreKvCache({ storeDir, storename, manifest?, autoRebuildCache? })` | `Promise<{ status, rebuilt }>` | extract 前に cache-index と cache 実体を検査し、必要なら staging store で manifest から full prefill。manifest は変更しない |
137
+ | `appendToExtractStore({ storeDir, storename, incomingMaterials, existingManifest?, now?, autoRebuildCache? })` | `Promise<{ manifest, model, provider, backend?, addedMaterials, cacheRebuilt }>` | 既存 store を staging に複製して incremental prefill と manifest 更新を行い、成功時に rename 交換。incremental base が無い場合は既定で full prefill にフォールバックし、`autoRebuildCache: false` なら明示エラーで停止する。prefill / manifest / runtime の失敗時は元の corpus・manifest・KV を保持 |
138
+
139
+ `appendToExtractStore` は `manifest.provider`(未指定の legacy manifest は MLX)、`manifest.model`、`manifest.backend`(MLX のみ。未指定時は `auto` fallback)、および保存済み `maxImageSize` を使い、provider + model の不一致を検証します。成功時だけ `updatedAt`、materials、解決済み provider/backend、画像 resize 条件を反映します。`readExtractStoreManifest` は store の存在と manifest を検証し、存在しない store には `create` を案内するエラーを返します。ライブラリ層のマージ、prefill、失敗時保全は `src/extract-store.test.ts` で CLI から独立して検証しています。
140
+
141
+ ---
142
+
143
+ create/add が内部で使う `prepareExtractCache` は `cachePreparation: 'required'` で session を実行するため、cache controller が空 handle を返した場合は driver query、manifest 書き込み、store の rename 交換に進みません。通常の `createExtractSession` は省略時の `best-effort` 契約を維持します。
144
+
145
+ ## `createMlxExtractRuntime(options)`
146
+
147
+ ```typescript
148
+ function createMlxExtractRuntime(
149
+ options: MlxExtractRuntimeOptions
150
+ ): Promise<MlxExtractRuntime>
151
+ ```
152
+
153
+ | プロパティ | 型 | 必須 | 説明 |
154
+ |-----------|-----|------|------|
155
+ | `model` | `string` | — | MLX モデルの alias または生の HF model ID。省略時は user models.yaml の `models.default` から解決。未設定時はエラー |
156
+ | `backend` | `'auto' \| 'lm' \| 'vlm' \| 'optiq'` | — | MLX backend の明示指定。省略時は models.yaml の指定、さらに未指定なら `auto` |
157
+ | `cacheDir` | `string` | — | 固定キャッシュディレクトリ。省略時は managed temp dir |
158
+ | `maxImageSize` | `number` | — | VLM 画像キャッシュの最大辺。省略時は models.yaml の指定、さらに未指定なら 768 |
159
+
160
+ `MlxExtractRuntime.close()` は `driver.close()` + `cacheController.close()` を行う。
161
+
162
+ runtime の `backend` プロパティは実際に driver へ渡した選択値であり、extract store の manifest に保存されます。backend のない既存 manifest は `auto` として再開します。
163
+
164
+ `createMlxExtractRuntime` は AIService 経由でモデルを解決・生成し、models.yaml の MLX backend 指定を保持する。backend 未指定時は `auto` としてモデル種別に応じて `mlx-lm` / `mlx-vlm` を選択する。`backend: 'vlm'` の場合、画像なしの text-only exact KV cache と、画像 material を含む vision cache を固定 cacheDir に別 namespace で永続化できる。画像付き cache は text-only VLM / LM cache と非互換で、VLM incremental prefill は対象外。モデル指定を省略した場合は user の `~/.modular-prompt/models.yaml` にある `models.default` を使用する。同梱モデルや `models` の先頭エントリへの fallback はなく、モデル未設定時は driver 作成前にエラーになる。生の model ID を指定する場合は、models.yaml の一致エントリで `provider: mlx` を設定するか、既知の MLX model 名パターンを使用してください。provider を推論できない ID はエラーになります。
165
+
166
+ ## `createPytorchExtractRuntime(options)`
167
+
168
+ ```typescript
169
+ function createPytorchExtractRuntime(
170
+ options: PyTorchExtractRuntimeOptions
171
+ ): Promise<PyTorchExtractRuntime>
172
+ ```
173
+
174
+ | プロパティ | 型 | 必須 | 説明 |
175
+ |-----------|-----|------|------|
176
+ | `model` | `string` | — | PyTorch (Transformers) モデルの alias または生の HF model ID。省略時は user models.yaml の `models.default` から解決 |
177
+ | `cacheDir` | `string` | — | 固定キャッシュディレクトリ。省略時は managed temp dir |
178
+
179
+ PyTorch runtime は `PyTorchCacheController` と `PyTorchDriver` を共有し、`getCapabilities()` で cache binding を完了してから返します。現状の PyTorch backend は text-only のため、MLX の `backend` / `maxImageSize` は渡されません。`runtime.close()` は driver と cache controller を解放します。
180
+
181
+ ## `createExtractRuntime(options)`
182
+
183
+ `createExtractRuntime({ model, provider?, cacheDir?, backend?, maxImageSize? })` は alias / raw model の解決結果に応じて MLX または PyTorch runtime を生成します。`provider` を指定した場合は models.yaml の alias/provider と一致することを検証し、raw model ID の provider を明示できます。PyTorch では `backend` / `maxImageSize` は無視されます。
184
+
185
+ `createDriver(model, { provider?, cacheController, backend?, maxImageSize? })` は runtime 内部で使用する低レベル helper で、戻り値は `{ driver, spec }`。`spec.model` は alias 解決後の生 model ID である。
186
+
187
+ ---
188
+
189
+ ## `createExtractSession(options)`
190
+
191
+ ```typescript
192
+ function createExtractSession<TContext = ExtractContext>(
193
+ options: ExtractSessionOptions<TContext>
194
+ ): ExtractSession
195
+ ```
196
+
197
+ ### `ExtractSessionOptions<TContext>`
198
+
199
+ | プロパティ | 型 | 必須 | 説明 |
200
+ |-----------|-----|------|------|
201
+ | `driver` | `AIDriver` | ✅ | 推論実行ドライバー |
202
+ | `cacheController` | `PromptCacheController` | ✅ | KV キャッシュコントローラ |
203
+ | `model` | `string` | ✅ | `prepare()` 用モデル識別子 |
204
+ | `baseModule` | `PromptModule<TContext>` | — | 省略時 `defaultExtractBaseModule` |
205
+ | `domainModule` | `PromptModule<TContext>` | — | base の上に merge |
206
+ | `corpus` | `ExtractCorpus` | ✅ | セッション固定 corpus |
207
+ | `schema` | `object` | — | JSON Schema(structured output) |
208
+ | `autoRebuildCache` | `boolean` | — | 欠損 cache を自動作成するか(既定 `true`)。`false` では既存 cache の read-only hit のみ利用し、miss は cache を作らず uncached query にフォールバック |
209
+ | `cachePreparation` | `'best-effort' \| 'required'` | — | 通常は `best-effort`(省略時)。`required` は空 handle をエラーにして driver query を実行しない |
210
+ | `maxImageSize` | `number` | — | VLM 画像キャッシュの正規化に使う最大辺。driver の設定と一致させる。runtime 経由では自動設定 |
211
+
212
+ #### `ExtractCorpus`
213
+
214
+ | プロパティ | 型 | 説明 |
215
+ |-----------|-----|------|
216
+ | `materials` | `MaterialsInput` | 文書 corpus |
217
+ | `messages` | `MessagesInput` | 対話ログ |
218
+
219
+ ### `ExtractSession.extract(request)`
220
+
221
+ #### `ExtractRequest`
222
+
223
+ | プロパティ | 型 | 必須 | 説明 |
224
+ |-----------|-----|------|------|
225
+ | `cue` | `string \| SectionContent` | ✅ | 抽出切り口 |
226
+ | `inputs` | `InputsInput` | — | 補強情報 |
227
+ | `options` | `QueryOptions` | — | ドライバークエリオプション |
228
+
229
+ #### `ExtractResult`
230
+
231
+ | プロパティ | 型 | 説明 |
232
+ |-----------|-----|------|
233
+ | `text` | `string` | 抽出テキスト |
234
+ | `structured` | `unknown` | schema 指定時の構造化出力 |
235
+ | `usage` | `QueryResult['usage']` | トークン使用量(`cacheReadTokens` 含む) |
236
+ | `index` | `number` | セッション内連番(0 始まり) |
237
+
238
+ ### `getHistory()` / `close()`
239
+
240
+ - `getHistory()` — セッション内全結果のコピー
241
+ - `close(options?)` — セッション終了(冪等)。`close()` 後の `extract()` は拒否
242
+ - `releaseCache`(デフォルト `true`)— `false` のとき handle を release しない。固定 cacheDir をプロセス間で再利用する場合に使う
243
+ - `releaseCache: true` のとき `cacheController.release()` が呼ばれ、続く `runtime.close()` で KV ファイルが削除される(固定 cacheDir モード)
244
+
245
+ CLI の `clean <storename>` で store 単位、`clean --all` で cache container 全体を削除できる。対象が存在しない場合は no-op になる。
246
+
247
+ ---
248
+
249
+ ## CLI(`modular-prompt-extract`)
250
+
251
+ `modular-prompt-extract` は cache container 内に named store を作成・利用する。`-d` の値は container パスで、create/add/extract/list/clean 共通で使用する。省略時は `~/.modular-prompt/extract-cache`(`MODULAR_PROMPT_HOME` を設定した場合は `${MODULAR_PROMPT_HOME}/extract-cache`)。
252
+
253
+ CLI の `create` / `add` は各入力ファイルを UTF-8 の文字列として `MaterialInput.content` に格納します。画像ファイルを `Attachment` に変換する CLI 経路はなく、CLI 画像 material は Phase 3 の対象外です。画像 material の縦切りは library API の `MaterialInput.content: Attachment[]` を使用してください。
254
+
255
+ ```bash
256
+ modular-prompt-extract create <storename> [-m <model>] [--provider <mlx|pytorch>] [--dry-run] <files...>
257
+ modular-prompt-extract add <storename> [--auto-rebuild-cache|--no-auto-rebuild-cache] [--dry-run] <files...>
258
+ modular-prompt-extract extract <storename> [--max-tokens <n>] [--auto-rebuild-cache|--no-auto-rebuild-cache] [--dry-run] <query...>
259
+ modular-prompt-extract list
260
+ modular-prompt-extract clean <storename>
261
+ modular-prompt-extract clean --all
262
+ ```
263
+
264
+ container を指定する場合は、各コマンドに `-d <cache-dir>` を追加する。
265
+
266
+ ```bash
267
+ modular-prompt-extract create meeting -d ~/.modular-prompt/extract-cache -m default docs/meeting.txt
268
+ modular-prompt-extract add meeting -d ~/.modular-prompt/extract-cache docs/day2.txt
269
+ modular-prompt-extract extract meeting -d ~/.modular-prompt/extract-cache '参加者を列挙'
270
+ modular-prompt-extract list -d ~/.modular-prompt/extract-cache
271
+ modular-prompt-extract clean meeting -d ~/.modular-prompt/extract-cache
272
+ modular-prompt-extract clean --all -d ~/.modular-prompt/extract-cache
273
+ ```
274
+
275
+ `<storename>` は create/add/extract/clean の positional 第1引数として必須(`clean --all` を除く)で、`[a-zA-Z0-9][a-zA-Z0-9_-]*` に一致する必要がある。`create`、`add`、`extract`、`list`、`clean` は予約語である。
276
+
277
+ `add <storename> [--dry-run] <files...>` は既存 store の manifest にファイルを追記し、manifest の model で prepare cue を実行する。既存 cache を staging store に複製してから incremental prefill と manifest 更新を行い、成功時にだけ store を入れ替える。incremental base が無い場合は既定で full prefill にフォールバックし、再生成時だけ stderr に warning を出す。`--no-auto-rebuild-cache` を指定すると、その場合は明示エラーで停止する。prefill または manifest 更新が失敗した場合は元の store を保持する。同じ絶対パス `id` の同一内容はスキップし、内容が異なる場合は `clean` + `create` を案内してエラーにする。
278
+
279
+ `add --dry-run` はマージ後の compile 済みプロンプトを表示し、driver の起動・KV cache の書き込み・manifest の更新を行わない。`add` では `-m`、`--provider`、`--max-tokens` は指定できない。create の `--provider` は `mlx` または `pytorch` を受け付け、以降の add/extract は manifest に保存された provider を使用する。
280
+
281
+ `create` は store と `manifest.json` を作るために必須です。KV cache は manifest から再生成できる派生データであり、`extract` は欠損・破損・`cache-index.json` が指す実体の欠損を検知すると既定で full prefill を行ってから抽出を続けます。`list` の `KV cache: missing` はこの復旧対象を示します。`MODULAR_PROMPT_EXTRACT_AUTO_REBUILD_CACHE=false`(`0` / `no` / `off` も可)または `--no-auto-rebuild-cache` で自動再生成を無効化できます。環境変数が OFF のときに一時的に有効化する場合は `--auto-rebuild-cache` を指定します。CLI 引数が環境変数より優先され、既定値は有効です。ライブラリの `ExtractSessionOptions.autoRebuildCache: false` では既存 cache の read-only hit を利用し、miss は cache を作らず uncached query にフォールバックします。
282
+
283
+ これは破壊的変更であり、旧 CLI 引数形式と旧レイアウト(container 直下の `manifest.json` と cache files)はサポートしない。旧デフォルト `./.extract-cache` の自動検出・自動移行も行わない。既存データを利用する場合は、[README の旧 CLI / キャッシュレイアウトからの手動移行手順](./README.md#旧-cli--キャッシュレイアウトからの移行)に従って、新しいデフォルトまたは `-d` で指定した store container へ移動する。
284
+
285
+ ---
286
+
287
+ ## キャッシュ連携
288
+
289
+ 毎回の `extract()` で:
290
+
291
+ 1. `compileExtractPrompt` — `ExtractContext` を解決して compile
292
+ 2. `cacheController.prepare()` — cacheable 部分を prefill
293
+ 3. `supersedes` 返却時 — 旧 handle を `release()`
294
+ 4. `driver.query()` — `{ cache: false, cacheHandle }` で二重 prepare を回避
295
+
296
+ | セクション | キャッシュ |
297
+ |-----------|-----------|
298
+ | baseModule(instructions) | ✅ |
299
+ | corpus(materials, messages) | ✅ |
300
+ | inputs | ✅(incremental) |
301
+ | cue | ❌ |
302
+
303
+ ### 制約(再掲)
304
+
305
+ - **corpus / baseModule 変更** → 新セッション
306
+ - **inputs 累積** → 自動ではない。`buildPreviousExtractionsInputs` 等で明示的に渡す
307
+ - **driver / cacheController の close** → 呼び出し側(`runtime.close()`)
308
+
309
+ ---
310
+
311
+ ## 実装状況
312
+
313
+ | 項目 | 状態 |
314
+ |------|------|
315
+ | Phase 1 コア API | ✅ |
316
+ | Phase 2 キャッシュ統合 | ✅ |
317
+ | Phase 3 便利機能 | ✅ |
318
+ | Phase 4 ドキュメント・サンプル | ✅ |
319
+
320
+ **テスト**: `pnpm --filter @modular-prompt/extract test:run`