@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
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { cpSync, existsSync, mkdirSync, readdirSync } from 'fs';
|
|
2
|
+
import { dirname, join } from 'path';
|
|
3
|
+
|
|
4
|
+
const PRESERVED_RUNTIME_FILES = new Set(['pyproject.toml', 'uv.lock']);
|
|
5
|
+
|
|
6
|
+
function copyTemplateContents(templateDir, runtimePythonDir) {
|
|
7
|
+
mkdirSync(runtimePythonDir, { recursive: true });
|
|
8
|
+
for (const entry of readdirSync(templateDir)) {
|
|
9
|
+
if (PRESERVED_RUNTIME_FILES.has(entry)) {
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
cpSync(join(templateDir, entry), join(runtimePythonDir, entry), {
|
|
13
|
+
recursive: true,
|
|
14
|
+
force: true,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function assertTemplateExists(templateDir) {
|
|
20
|
+
if (!existsSync(templateDir)) {
|
|
21
|
+
throw new Error(`PyTorch template not found: ${templateDir}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 初回 setup 用に template 一式を runtime へ seed する。
|
|
27
|
+
* 既存 runtime の pyproject.toml / uv.lock はユーザー管理として保持する。
|
|
28
|
+
*/
|
|
29
|
+
export function seedPytorchTemplate(templateDir, runtimePythonDir) {
|
|
30
|
+
assertTemplateExists(templateDir);
|
|
31
|
+
if (!existsSync(runtimePythonDir)) {
|
|
32
|
+
mkdirSync(dirname(runtimePythonDir), { recursive: true });
|
|
33
|
+
cpSync(templateDir, runtimePythonDir, { recursive: true });
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
copyTemplateContents(templateDir, runtimePythonDir);
|
|
38
|
+
for (const file of PRESERVED_RUNTIME_FILES) {
|
|
39
|
+
const templateFile = join(templateDir, file);
|
|
40
|
+
const runtimeFile = join(runtimePythonDir, file);
|
|
41
|
+
if (!existsSync(runtimeFile) && existsSync(templateFile)) {
|
|
42
|
+
cpSync(templateFile, runtimeFile, { force: true });
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* 既存 runtime のコードを template から同期する。
|
|
49
|
+
* pyproject.toml と uv.lock は上書きしない。
|
|
50
|
+
*/
|
|
51
|
+
export function syncPytorchTemplate(templateDir, runtimePythonDir) {
|
|
52
|
+
assertTemplateExists(templateDir);
|
|
53
|
+
copyTemplateContents(templateDir, runtimePythonDir);
|
|
54
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pytorch-template-core.mjs","sourceRoot":"","sources":["../../src/runtime/pytorch-template-core.mjs"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAChE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAErC,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC;AAEvE,SAAS,oBAAoB,CAAC,WAAW,EAAE,gBAAgB;IACzD,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7C,IAAI,uBAAuB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACvC,SAAS;QACX,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,EAAE;YAC9D,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,oBAAoB,CAAC,WAAW;IACvC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,+BAA+B,WAAW,EAAE,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAW,EAAE,gBAAgB;IAC/D,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAClC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAClC,SAAS,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,MAAM,CAAC,WAAW,EAAE,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,OAAO;IACT,CAAC;IAED,oBAAoB,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IACpD,KAAK,MAAM,IAAI,IAAI,uBAAuB,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YACzD,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAW,EAAE,gBAAgB;IAC/D,oBAAoB,CAAC,WAAW,CAAC,CAAC;IAClC,oBAAoB,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -10,4 +10,7 @@ export const SETUP_PYTORCH_MONOREPO: "pnpm run setup-pytorch";
|
|
|
10
10
|
/** @modular-prompt/driver を npm インストールした環境向け */
|
|
11
11
|
export const SETUP_MLX_CLI: "modular-prompt-runtime setup mlx";
|
|
12
12
|
export const SETUP_PYTORCH_CLI: "modular-prompt-runtime setup pytorch";
|
|
13
|
+
/** PyTorch runtime のコード・依存を再同期するコマンド */
|
|
14
|
+
export const SYNC_PYTORCH_MONOREPO: "pnpm run sync-pytorch";
|
|
15
|
+
export const SYNC_PYTORCH_CLI: "modular-prompt-runtime sync pytorch";
|
|
13
16
|
//# sourceMappingURL=setup-commands-core.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-commands-core.d.mts","sourceRoot":"","sources":["../../src/runtime/setup-commands-core.mjs"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kEAAkE;AAClE,iCAAkC,oBAAoB,CAAC;AACvD,qCAAsC,wBAAwB,CAAC;AAE/D,gDAAgD;AAChD,4BAA6B,kCAAkC,CAAC;AAChE,gCAAiC,sCAAsC,CAAC"}
|
|
1
|
+
{"version":3,"file":"setup-commands-core.d.mts","sourceRoot":"","sources":["../../src/runtime/setup-commands-core.mjs"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kEAAkE;AAClE,iCAAkC,oBAAoB,CAAC;AACvD,qCAAsC,wBAAwB,CAAC;AAE/D,gDAAgD;AAChD,4BAA6B,kCAAkC,CAAC;AAChE,gCAAiC,sCAAsC,CAAC;AAExE,wCAAwC;AACxC,oCAAqC,uBAAuB,CAAC;AAC7D,+BAAgC,qCAAqC,CAAC"}
|
|
@@ -12,3 +12,7 @@ export const SETUP_PYTORCH_MONOREPO = 'pnpm run setup-pytorch';
|
|
|
12
12
|
/** @modular-prompt/driver を npm インストールした環境向け */
|
|
13
13
|
export const SETUP_MLX_CLI = 'modular-prompt-runtime setup mlx';
|
|
14
14
|
export const SETUP_PYTORCH_CLI = 'modular-prompt-runtime setup pytorch';
|
|
15
|
+
|
|
16
|
+
/** PyTorch runtime のコード・依存を再同期するコマンド */
|
|
17
|
+
export const SYNC_PYTORCH_MONOREPO = 'pnpm run sync-pytorch';
|
|
18
|
+
export const SYNC_PYTORCH_CLI = 'modular-prompt-runtime sync pytorch';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-commands-core.mjs","sourceRoot":"","sources":["../../src/runtime/setup-commands-core.mjs"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kEAAkE;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAE/D,gDAAgD;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,kCAAkC,CAAC;AAChE,MAAM,CAAC,MAAM,iBAAiB,GAAG,sCAAsC,CAAC"}
|
|
1
|
+
{"version":3,"file":"setup-commands-core.mjs","sourceRoot":"","sources":["../../src/runtime/setup-commands-core.mjs"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kEAAkE;AAClE,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD,MAAM,CAAC,MAAM,sBAAsB,GAAG,wBAAwB,CAAC;AAE/D,gDAAgD;AAChD,MAAM,CAAC,MAAM,aAAa,GAAG,kCAAkC,CAAC;AAChE,MAAM,CAAC,MAAM,iBAAiB,GAAG,sCAAsC,CAAC;AAExE,wCAAwC;AACxC,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAC7D,MAAM,CAAC,MAAM,gBAAgB,GAAG,qCAAqC,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { SETUP_MLX_MONOREPO, SETUP_PYTORCH_MONOREPO, SETUP_MLX_CLI, SETUP_PYTORCH_CLI, } from './setup-commands-core.mjs';
|
|
1
|
+
export { SETUP_MLX_MONOREPO, SETUP_PYTORCH_MONOREPO, SETUP_MLX_CLI, SETUP_PYTORCH_CLI, SYNC_PYTORCH_MONOREPO, SYNC_PYTORCH_CLI, } from './setup-commands-core.mjs';
|
|
2
2
|
//# sourceMappingURL=setup-commands.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-commands.d.ts","sourceRoot":"","sources":["../../src/runtime/setup-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,
|
|
1
|
+
{"version":3,"file":"setup-commands.d.ts","sourceRoot":"","sources":["../../src/runtime/setup-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { SETUP_MLX_MONOREPO, SETUP_PYTORCH_MONOREPO, SETUP_MLX_CLI, SETUP_PYTORCH_CLI, } from './setup-commands-core.mjs';
|
|
1
|
+
export { SETUP_MLX_MONOREPO, SETUP_PYTORCH_MONOREPO, SETUP_MLX_CLI, SETUP_PYTORCH_CLI, SYNC_PYTORCH_MONOREPO, SYNC_PYTORCH_CLI, } from './setup-commands-core.mjs';
|
|
2
2
|
//# sourceMappingURL=setup-commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-commands.js","sourceRoot":"","sources":["../../src/runtime/setup-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,
|
|
1
|
+
{"version":3,"file":"setup-commands.js","sourceRoot":"","sources":["../../src/runtime/setup-commands.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,455 @@
|
|
|
1
|
+
# Driver APIリファレンス
|
|
2
|
+
|
|
3
|
+
`@modular-prompt/driver`パッケージのAPIリファレンス。
|
|
4
|
+
|
|
5
|
+
## 目次
|
|
6
|
+
|
|
7
|
+
- [インターフェース](#インターフェース)
|
|
8
|
+
- [利用可能なドライバー](#利用可能なドライバー)
|
|
9
|
+
- [PyTorchProcess の KV cache](#pytorchprocess-の-kv-cache)
|
|
10
|
+
- [PyTorchDriver の PromptCacheController](#pytorchdriver-の-promptcachecontroller)
|
|
11
|
+
- [型定義](#型定義)
|
|
12
|
+
- [推論キャンセル(AbortSignal)](#推論キャンセルabortsignal)
|
|
13
|
+
- [トークン使用量(usage)](#トークン使用量usage)
|
|
14
|
+
- [共通ユーティリティ(query-utils)](#共通ユーティリティquery-utils)
|
|
15
|
+
- [エラーハンドリング](#エラーハンドリング)
|
|
16
|
+
- [関連ドキュメント](#関連ドキュメント)
|
|
17
|
+
|
|
18
|
+
## インターフェース
|
|
19
|
+
|
|
20
|
+
### AIDriver
|
|
21
|
+
|
|
22
|
+
すべてのドライバーが実装すべき基本インターフェース。
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
interface AIDriver {
|
|
26
|
+
query(prompt: CompiledPrompt, options?: QueryOptions): Promise<QueryResult>;
|
|
27
|
+
streamQuery(prompt: CompiledPrompt, options?: QueryOptions): Promise<StreamResult>;
|
|
28
|
+
close(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
#### メソッド
|
|
33
|
+
|
|
34
|
+
**query()**
|
|
35
|
+
|
|
36
|
+
コンパイル済みプロンプトでAIモデルにクエリを送信。
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
query(prompt: CompiledPrompt, options?: QueryOptions): Promise<QueryResult>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**streamQuery()**
|
|
43
|
+
|
|
44
|
+
ストリーミングレスポンスを生成。`stream`(テキスト断片)と `result`(最終集計)は別経路です。usage は `result.usage` にのみ載せ、各チャンクには含めません。
|
|
45
|
+
|
|
46
|
+
```typescript
|
|
47
|
+
streamQuery(prompt: CompiledPrompt, options?: QueryOptions): Promise<StreamResult>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**close()**
|
|
51
|
+
|
|
52
|
+
ドライバーのリソースをクリーンアップ。
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
close(): Promise<void>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## 利用可能なドライバー
|
|
59
|
+
|
|
60
|
+
### クラウドサービス
|
|
61
|
+
|
|
62
|
+
| ドライバー | プロバイダー | Structured Outputs | 用途 |
|
|
63
|
+
|----------|------------|-------------------|------|
|
|
64
|
+
| OpenAIDriver | OpenAI | ✅ ネイティブ | GPT-4, GPT-3.5 |
|
|
65
|
+
| AnthropicDriver | Anthropic | ✅ JSON抽出 | Claude |
|
|
66
|
+
| VertexAIDriver | Google Cloud | ✅ ネイティブ | Gemini + Model Garden(Qwen, Llama等) |
|
|
67
|
+
| GoogleGenAIDriver | Google AI | ✅ ネイティブ | Gemini (API Key) |
|
|
68
|
+
|
|
69
|
+
### ローカル実行
|
|
70
|
+
|
|
71
|
+
| ドライバー | プロバイダー | Structured Outputs | 用途 |
|
|
72
|
+
|----------|------------|-------------------|------|
|
|
73
|
+
| OllamaDriver | Ollama | ✅ ネイティブ(継承) | ローカルLLM(OpenAI互換) |
|
|
74
|
+
| MlxDriver | MLX | ✅ JSON抽出 | Apple Silicon最適化(VLM対応) |
|
|
75
|
+
| PyTorchDriver | PyTorch | ✅ JSON抽出 | Transformers + PyTorch(LIP、Windows/Linux 等) |
|
|
76
|
+
| VllmDriver | vLLM | ✅ JSON抽出 | CUDA GPU推論(Linux) |
|
|
77
|
+
|
|
78
|
+
### テスト用
|
|
79
|
+
|
|
80
|
+
| ドライバー | プロバイダー | Structured Outputs | 用途 |
|
|
81
|
+
|----------|------------|-------------------|------|
|
|
82
|
+
| TestDriver | - | ✅ JSON抽出 | ユニットテスト、モック |
|
|
83
|
+
| EchoDriver | - | ✅ JSON抽出 | デバッグ、プロンプト検証 |
|
|
84
|
+
|
|
85
|
+
詳細な使用方法、設定オプション、カスタムドライバーの実装については、[packages/driver/README.md](../packages/driver/README.md)を参照してください。
|
|
86
|
+
|
|
87
|
+
### PyTorchProcess の KV cache
|
|
88
|
+
|
|
89
|
+
`PyTorchProcess` は、`PyTorchDriver` の自動 cache 管理を構成する低レベルの LIP 操作として、text-only Transformers LM の KV cache を扱えます。`memory://` ref は Python 子プロセス内だけで有効です。`cpu-minimal` backend では通常のファイルパスを指定すると、PyTorch backend 固有の `pytorch_kv_v1` 形式で cache と `.meta.json` を保存できます。CUDA backend は process-local cache のみを使用し、cache ファイルを作成しません。
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
import { PyTorchProcess } from '@modular-prompt/driver';
|
|
93
|
+
|
|
94
|
+
const pytorch = new PyTorchProcess('Qwen/Qwen2.5-0.5B-Instruct');
|
|
95
|
+
const prefix = [{ role: 'system' as const, content: 'You are concise.' }];
|
|
96
|
+
const messages = [...prefix, { role: 'user' as const, content: 'Hello.' }];
|
|
97
|
+
|
|
98
|
+
const prefill = await pytorch.cachePrefill('memory://system-prefix', prefix);
|
|
99
|
+
console.log(prefill.cache_write_tokens); // prefill で書き込んだ token 数
|
|
100
|
+
|
|
101
|
+
const rendered = await pytorch.render(messages);
|
|
102
|
+
if (rendered.error || rendered.formatted_prompt == null) {
|
|
103
|
+
throw new Error(rendered.error ?? 'render failed');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const stream = await pytorch.generate(
|
|
107
|
+
rendered.formatted_prompt,
|
|
108
|
+
{ max_tokens: 64, temperature: 0 },
|
|
109
|
+
undefined,
|
|
110
|
+
undefined,
|
|
111
|
+
prefill.cache_path,
|
|
112
|
+
);
|
|
113
|
+
for await (const chunk of stream) {
|
|
114
|
+
process.stdout.write(String(chunk));
|
|
115
|
+
}
|
|
116
|
+
await pytorch.exit();
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
`cachePrefill()` に渡した prefix と、`generate()` に渡す rendered prompt の先頭 token 列は一致している必要があります。`generate()` は cache を読み込んで suffix だけを推論し、cache 自体への書き戻しは行いません。`cacheTrimTokens` を指定した場合も、trim は生成用の clone に適用されるため、登録済みの元 cache ref は変更されません。cache を使えた場合の Python 側 stream meta には `cache_read_tokens`、最初の利用時だけ `cache_write_tokens`、`cache_loaded: true` が含まれ、`cache_loaded: false` の場合は `cacheReadTokens` に算入されません。`baseCachePath` と `trimToTokens` を指定した `cachePrefill()` では、既存 cache の共通 prefix を再利用して suffix だけを prefill します。
|
|
120
|
+
|
|
121
|
+
契約は次のとおりです。
|
|
122
|
+
|
|
123
|
+
- `cachePrefill()` の結果には `cache_write_tokens`(prefill で新規に書き込んだ token 数)が含まれ、`PyTorchProcess.cachePrefill()` からそのまま参照できます。同じ値は最初の cache 利用時の stream meta にも付与されますが、同じ prefill 操作を後続 generate の書き込みとして重複計上するものではありません。
|
|
124
|
+
- `memory://` ref は同じ Python 子プロセスの registry にだけ存在します。プロセス終了・`exit()`・restart 後は cache miss になり、`generate` は full prompt の cold path にフォールバックします。
|
|
125
|
+
- `cpu-minimal` のファイル cache の `.meta.json` には `token_count`、`prefix_offsets`、`prefix_hashes`、`model_id`、dtype、device、layout が記録されます。モデル・dtype・device が現在の backend と一致しない cache は安全のため読み込まず、cold path にフォールバックします。
|
|
126
|
+
- CUDA backend は cache ref と KV state を Python process-local registry に保持し、ファイルを作成しません。incremental prefill / prefix metadata を受け付けず、controller は plain prefill にフォールバックします。プロセス終了・restart 後は cache miss になります。
|
|
127
|
+
- PyTorch の cache 形式は MLX / provider の形式と互換ではありません。VLM / 画像入力の cache は現在の PyTorch backend では無効です。
|
|
128
|
+
|
|
129
|
+
### PyTorchDriver の PromptCacheController
|
|
130
|
+
|
|
131
|
+
`PyTorchDriver` に `PyTorchCacheController` を指定すると、`LocalInferenceDriver` の通常の cache lifecycle に PyTorch の `cachePrefill()` / `generate()` を接続できます。`cache: true`(または省略時の既定値)で cacheable prefix を自動作成し、prefill・再利用の結果は `QueryResult.usage.cacheReadTokens` / `cacheWriteTokens` に反映されます。固定 `cacheDir` の `cache-index.json` と `pytorch_kv_v1` cache をプロセス再起動後に再利用できるのは `cpu-minimal` backend です。CUDA backend は process-local のため restart 後に再利用できません。
|
|
132
|
+
|
|
133
|
+
固定 `cacheDir` は一つの PyTorch runtime variant / device 専用です。index は runtime identity を区別しないため、`cpu-minimal` と CUDA で同じ固定 `cacheDir` を共有することは禁止します。runtime ごとに別のディレクトリを指定してください。
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
import {
|
|
137
|
+
PyTorchCacheController,
|
|
138
|
+
PyTorchDriver,
|
|
139
|
+
} from '@modular-prompt/driver';
|
|
140
|
+
|
|
141
|
+
const driver = new PyTorchDriver({
|
|
142
|
+
model: 'Qwen/Qwen2.5-0.5B-Instruct',
|
|
143
|
+
cacheController: new PyTorchCacheController({
|
|
144
|
+
cacheDir: '/path/to/pytorch-cache',
|
|
145
|
+
}),
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
const result = await driver.query(prompt, { cache: true });
|
|
149
|
+
console.log(result.usage?.cacheReadTokens);
|
|
150
|
+
console.log(result.usage?.cacheWriteTokens);
|
|
151
|
+
await driver.close();
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
PyTorch の現行 backend は VLM・画像入力をサポートしないため、そのモデルでは controller は bind されず cache は無効になります。`cpu-minimal` の cache は固定 `cacheDir` で永続化できますが、CUDA の cache は process-local です。PyTorch cache は MLX cache と相互運用しません。
|
|
155
|
+
|
|
156
|
+
## 型定義
|
|
157
|
+
|
|
158
|
+
### ChatMessage
|
|
159
|
+
|
|
160
|
+
対話メッセージの型。
|
|
161
|
+
|
|
162
|
+
```typescript
|
|
163
|
+
interface ChatMessage {
|
|
164
|
+
role: 'system' | 'assistant' | 'user';
|
|
165
|
+
content: string | Attachment[]; // MLX VLMモデルでは画像をAttachmentで指定可能
|
|
166
|
+
name?: string;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
interface Attachment {
|
|
170
|
+
type: 'text' | 'image_url' | 'file';
|
|
171
|
+
text?: string;
|
|
172
|
+
image_url?: { url: string }; // driver-dependent: local path, URL, or data source
|
|
173
|
+
file?: { path: string; mime_type: string };
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
`Attachment` は共通型ですが、入力源の対応範囲は driver ごとに異なります。MLX VLM の画像入力および画像 cache 経路は local file path のみ対応し、URL / data URI は未対応です。MLX は local path を `PIL.Image.open()` で読み込むため、URL や data URI を自動取得しません。他 driver の URL / data source 対応は各 driver の仕様に従います。
|
|
178
|
+
|
|
179
|
+
### QueryOptions
|
|
180
|
+
|
|
181
|
+
クエリ実行時のオプション。
|
|
182
|
+
|
|
183
|
+
```typescript
|
|
184
|
+
interface QueryOptions {
|
|
185
|
+
temperature?: number; // 生成のランダム性 (0-2)
|
|
186
|
+
maxTokens?: number; // 最大トークン数
|
|
187
|
+
topP?: number; // トップPサンプリング
|
|
188
|
+
stream?: boolean; // ストリーミング有効化
|
|
189
|
+
reasoningEffort?: 'low' | 'medium' | 'high'; // 推論深度(thinking系モデル用)
|
|
190
|
+
signal?: AbortSignal; // 推論キャンセル(未対応ドライバーは無視)
|
|
191
|
+
cache?: boolean | 'read-only'; // プロンプトキャッシュ(ドライバー依存)
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**signal**: 進行中の推論をキャンセルするための `AbortSignal` です。
|
|
196
|
+
- 呼び出し時点で `aborted` の場合、推論を開始せず `finishReason: 'error'` で `result` を resolve します
|
|
197
|
+
- ストリーム消費中の abort では `result` を reject しません(キャンセル判定は `signal.aborted`)
|
|
198
|
+
- 現時点で対応しているのは MLX ドライバーのみです
|
|
199
|
+
|
|
200
|
+
**reasoningEffort**: 推論特化モデル(OpenAI o-series、llm-jp-4-thinking等)の思考深度を制御します。
|
|
201
|
+
- 対応ドライバー: OpenAI(APIパラメータとして送信)、MLX(`apply_chat_template`に渡す)
|
|
202
|
+
- 非対応ドライバーでは無視されます
|
|
203
|
+
|
|
204
|
+
### QueryResult
|
|
205
|
+
|
|
206
|
+
クエリ結果の型。
|
|
207
|
+
|
|
208
|
+
```typescript
|
|
209
|
+
interface QueryResult {
|
|
210
|
+
content: string; // テキストレスポンス
|
|
211
|
+
thinkingContent?: string; // 思考・推論チャネルの内容
|
|
212
|
+
structuredOutput?: unknown; // 構造化出力(スキーマ指定時)
|
|
213
|
+
finishReason?: 'stop' | 'length' | 'error' | 'tool_calls';
|
|
214
|
+
usage?: {
|
|
215
|
+
promptTokens: number; // プロンプト側トークン総数(プロバイダ報告値)
|
|
216
|
+
completionTokens: number; // 生成トークン数
|
|
217
|
+
totalTokens: number; // promptTokens + completionTokens と整合
|
|
218
|
+
cacheReadTokens?: number; // 今回リクエストでキャッシュから読んだトークン数
|
|
219
|
+
cacheWriteTokens?: number; // 今回リクエストでキャッシュに新規書き込みしたトークン数
|
|
220
|
+
};
|
|
221
|
+
logEntries?: LogEntry[]; // クエリ実行中のログエントリ
|
|
222
|
+
errors?: LogEntry[]; // エラーレベルのログエントリ
|
|
223
|
+
}
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
**thinkingContent**: モデルの思考・推論過程の内容を格納します。
|
|
227
|
+
- Harmonyフォーマット(llm-jp-4等)の `analysis` チャネル
|
|
228
|
+
- 将来的にAnthropicのthinkingブロック等にも対応予定
|
|
229
|
+
|
|
230
|
+
**usage**: トークン使用量は `stream` チャンクではなく `result.usage` にのみ載せます。
|
|
231
|
+
- `promptTokens` はキャッシュ分を差し引く前のプロバイダ報告値です
|
|
232
|
+
- `cacheReadTokens` / `cacheWriteTokens` はプロンプトキャッシュ対応ドライバーが任意で付与します(未取得時は省略または 0)
|
|
233
|
+
- MLX ドライバーは `prompt_tokens` / `generation_tokens` をマッピングし、KV キャッシュ利用時は `cacheReadTokens` を付与します
|
|
234
|
+
- PyTorch の低レベル `cachePrefill()` は操作結果の `cache_write_tokens` を返します。`PyTorchCacheController` 経由の `PyTorchDriver` では、同一 query の新規 prefill 分を `cacheWriteTokens`、実際に load できた cache の token 数を `cacheReadTokens` として `QueryResult.usage` に反映します。CPU の disk hit と CUDA の process-local hit のどちらもこの契約に従います
|
|
235
|
+
|
|
236
|
+
### StreamResult
|
|
237
|
+
|
|
238
|
+
ストリーミング結果の型。
|
|
239
|
+
|
|
240
|
+
```typescript
|
|
241
|
+
interface StreamResult {
|
|
242
|
+
stream: AsyncIterable<string>; // ストリームチャンク
|
|
243
|
+
result: Promise<QueryResult>; // 最終結果
|
|
244
|
+
}
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### ModelSpec
|
|
248
|
+
|
|
249
|
+
モデルの仕様定義。
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
interface ModelSpec {
|
|
253
|
+
model: string; // モデル識別子
|
|
254
|
+
provider: DriverProvider; // プロバイダー名
|
|
255
|
+
capabilities: DriverCapability[]; // モデルの能力
|
|
256
|
+
maxInputTokens?: number; // 最大入力トークン数
|
|
257
|
+
maxOutputTokens?: number; // 最大出力トークン数
|
|
258
|
+
priority?: number; // 優先度(低い値ほど優先)
|
|
259
|
+
enabled?: boolean; // 有効/無効フラグ
|
|
260
|
+
cost?: {
|
|
261
|
+
input: number; // 入力コスト(per 1K tokens)
|
|
262
|
+
output: number; // 出力コスト(per 1K tokens)
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
### DriverCapability
|
|
268
|
+
|
|
269
|
+
ドライバーの能力を表すフラグ。
|
|
270
|
+
|
|
271
|
+
```typescript
|
|
272
|
+
type DriverCapability =
|
|
273
|
+
| 'streaming' // ストリーミング対応
|
|
274
|
+
| 'tools' // Function Calling対応
|
|
275
|
+
| 'vision' // 画像入力対応
|
|
276
|
+
| 'japanese' // 日本語対応
|
|
277
|
+
| 'reasoning' // 推論特化
|
|
278
|
+
| 'fast' // 高速応答
|
|
279
|
+
| 'local' // ローカル実行
|
|
280
|
+
| 'structured-output' // Structured Outputs対応
|
|
281
|
+
| string; // カスタム能力
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### DriverProvider
|
|
285
|
+
|
|
286
|
+
利用可能なプロバイダー。
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
type DriverProvider =
|
|
290
|
+
| 'openai'
|
|
291
|
+
| 'anthropic'
|
|
292
|
+
| 'vertexai'
|
|
293
|
+
| 'ollama'
|
|
294
|
+
| 'mlx'
|
|
295
|
+
| 'vllm'
|
|
296
|
+
| 'test'
|
|
297
|
+
| 'echo'
|
|
298
|
+
| string; // カスタムプロバイダー
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## 推論キャンセル(AbortSignal)
|
|
302
|
+
|
|
303
|
+
`QueryOptions.signal` で進行中の推論をキャンセルします。未対応ドライバーはこのオプションを無視します。
|
|
304
|
+
|
|
305
|
+
### 契約
|
|
306
|
+
|
|
307
|
+
| 条件 | 振る舞い |
|
|
308
|
+
|---|---|
|
|
309
|
+
| 呼び出し時点で `signal.aborted` | 推論を開始しない。`result` は reject せず `finishReason: 'error'` で resolve |
|
|
310
|
+
| ストリーム消費中に `abort()` | バックエンドの推論を止め、`stream` を終了させる |
|
|
311
|
+
| キャンセル判定 | `finishReason === 'error'` かつ `signal.aborted`(呼び出し側がキャンセルとエラーを区別) |
|
|
312
|
+
| 部分応答 | キャンセル前に yield されたテキストは `result.content` に保持 |
|
|
313
|
+
|
|
314
|
+
### ドライバー対応状況
|
|
315
|
+
|
|
316
|
+
| ドライバー | `signal` 対応 |
|
|
317
|
+
|---|---|
|
|
318
|
+
| MlxDriver | ✅(Python 子プロセス連携) |
|
|
319
|
+
| その他 | 未実装(無視) |
|
|
320
|
+
|
|
321
|
+
### 使用例
|
|
322
|
+
|
|
323
|
+
```typescript
|
|
324
|
+
const controller = new AbortController();
|
|
325
|
+
|
|
326
|
+
const { stream, result } = await driver.streamQuery(prompt, {
|
|
327
|
+
signal: controller.signal,
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
for await (const chunk of stream) {
|
|
331
|
+
process.stdout.write(chunk);
|
|
332
|
+
if (shouldCancel) controller.abort();
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
const final = await result;
|
|
336
|
+
if (controller.signal.aborted) {
|
|
337
|
+
// キャンセル(Pi 連携では stopReason: "aborted" に変換)
|
|
338
|
+
} else if (final.finishReason === 'error') {
|
|
339
|
+
// 推論エラー
|
|
340
|
+
}
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### MLX ドライバーの実装概要
|
|
344
|
+
|
|
345
|
+
TS 側が `{"method":"cancel"}\n` を Python 子プロセスの stdin に送り、Python は `stream_generate` の各チャンク前に `poll_cancel()` で非ブロッキング検知してループを抜けます。同時に Node 側の `Readable` を `destroy()` し、stdout をドレインして次リクエストがキュー詰まりしないようにします。詳細は [プロンプトキャッシュ設計](./CACHE_DESIGN.md#queryresultusage-との関係) および `packages/driver/src/mlx-ml/python/handlers/cancel.py` を参照。
|
|
346
|
+
|
|
347
|
+
## トークン使用量(usage)
|
|
348
|
+
|
|
349
|
+
`QueryResult.usage` はプロバイダ報告のトークン数を正規化したオブジェクトです。
|
|
350
|
+
|
|
351
|
+
| フィールド | 意味 |
|
|
352
|
+
|---|---|
|
|
353
|
+
| `promptTokens` | プロンプト側トークン総数(キャッシュ分を差し引く前の生値) |
|
|
354
|
+
| `completionTokens` | 今回の生成トークン数 |
|
|
355
|
+
| `totalTokens` | 少なくとも `promptTokens + completionTokens` と整合 |
|
|
356
|
+
| `cacheReadTokens` | 今回リクエストでキャッシュから読んだトークン数(任意) |
|
|
357
|
+
| `cacheWriteTokens` | 今回リクエストでキャッシュに新規書き込みしたトークン数(任意) |
|
|
358
|
+
|
|
359
|
+
driver は `promptTokens` を「非キャッシュ入力」に分解しません(`promptTokens - cacheRead - cacheWrite` のような計算は行いません)。
|
|
360
|
+
|
|
361
|
+
### ドライバー対応状況
|
|
362
|
+
|
|
363
|
+
| ドライバー | `usage` 基本3フィールド | `cacheReadTokens` / `cacheWriteTokens` |
|
|
364
|
+
|---|---|---|
|
|
365
|
+
| OpenAI / Anthropic / VertexAI / GoogleGenAI | ✅ | 未対応(省略) |
|
|
366
|
+
| MlxDriver | ✅ | ✅(KV キャッシュ利用時) |
|
|
367
|
+
| PyTorchDriver | ✅ | ✅(`PyTorchCacheController` 利用時) |
|
|
368
|
+
| その他 | 状況により異なる | 未対応 |
|
|
369
|
+
|
|
370
|
+
MLX では Python 側の `prompt_tokens` / `generation_tokens` をマッピングし、`cacheReadTokens` は KV ヒット分、`cacheWriteTokens` は同一クエリ内の `prepare()` による新規 prefill 分を報告します。PyTorch も同じ usage 契約に従い、`PyTorchCacheController` の `prepare()` による新規 prefill 分と、Python stream meta が報告する実際の cache load token 数をマッピングします。cache load に失敗して `cache_loaded: false` になった場合、`cacheReadTokens` はその query では算入されません。
|
|
371
|
+
|
|
372
|
+
## 共通ユーティリティ(query-utils)
|
|
373
|
+
|
|
374
|
+
`@modular-prompt/driver` が提供するヘルパー。カスタムドライバーやアダプタ実装で利用できます。
|
|
375
|
+
|
|
376
|
+
```typescript
|
|
377
|
+
import {
|
|
378
|
+
buildQueryUsage,
|
|
379
|
+
createAbortedStreamResult,
|
|
380
|
+
isAborted,
|
|
381
|
+
watchAbortSignal,
|
|
382
|
+
} from '@modular-prompt/driver';
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
| 関数 | 用途 |
|
|
386
|
+
|---|---|
|
|
387
|
+
| `buildQueryUsage(counts)` | 生トークン数から `QueryResult.usage` を組み立て(全ゼロなら `undefined`) |
|
|
388
|
+
| `createAbortedStreamResult(extras?)` | 即時 abort 用の空 `StreamResult`(`result` は resolve) |
|
|
389
|
+
| `isAborted(signal?)` | `signal?.aborted ?? false` |
|
|
390
|
+
| `watchAbortSignal(signal, onAbort)` | abort リスナー登録。既に aborted なら即 `onAbort` を呼ぶ |
|
|
391
|
+
|
|
392
|
+
## エラーハンドリング
|
|
393
|
+
|
|
394
|
+
すべてのドライバーは統一されたエラーハンドリングを提供:
|
|
395
|
+
|
|
396
|
+
```typescript
|
|
397
|
+
const result = await driver.query(prompt);
|
|
398
|
+
|
|
399
|
+
if (result.finishReason === 'error') {
|
|
400
|
+
// エラーまたはキャンセル — signal.aborted で区別
|
|
401
|
+
if (options?.signal?.aborted) {
|
|
402
|
+
console.log('Query was cancelled');
|
|
403
|
+
} else if (result.errors) {
|
|
404
|
+
for (const entry of result.errors) {
|
|
405
|
+
console.error(`[${entry.prefix}] ${entry.message}`);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
} else if (result.finishReason === 'length') {
|
|
409
|
+
// トークン数制限により切り詰め
|
|
410
|
+
console.warn('Response was truncated');
|
|
411
|
+
} else if (result.finishReason === 'stop') {
|
|
412
|
+
// 正常終了
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
// logEntries で全レベルのログを確認可能
|
|
416
|
+
if (result.logEntries) {
|
|
417
|
+
console.log(`Query produced ${result.logEntries.length} log entries`);
|
|
418
|
+
}
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### ドライバー実装者向けログ規約
|
|
422
|
+
|
|
423
|
+
ドライバー実装では `QueryLogger` を使用してクエリスコープのログを記録する。`console.error` / `console.warn` の直接使用は禁止。
|
|
424
|
+
|
|
425
|
+
```typescript
|
|
426
|
+
import { QueryLogger } from '../query-logger.js';
|
|
427
|
+
|
|
428
|
+
class MyDriver implements AIDriver {
|
|
429
|
+
private queryLogger = new QueryLogger('MyDriver');
|
|
430
|
+
|
|
431
|
+
async streamQuery(prompt, options) {
|
|
432
|
+
this.queryLogger.mark(); // 各クエリの先頭で呼ぶ
|
|
433
|
+
try {
|
|
434
|
+
// ... API呼び出し
|
|
435
|
+
const result = { content, finishReason, usage };
|
|
436
|
+
return { stream, result: Promise.resolve({ ...result, ...this.queryLogger.collect() }) };
|
|
437
|
+
} catch (error) {
|
|
438
|
+
this.queryLogger.log.error('Query error:', error instanceof Error ? error.message : String(error));
|
|
439
|
+
return {
|
|
440
|
+
stream: (async function* () {})(),
|
|
441
|
+
result: Promise.resolve({ content: '', finishReason: 'error', ...this.queryLogger.collect() })
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
**prefix 命名規則**: ドライバー名を使用(`OpenAI`, `Anthropic`, `VertexAI`, `GoogleGenAI`, `MLX`, `vLLM`)。詳細は [UTILITIES.md](./UTILITIES.md) の Logger セクションを参照。
|
|
449
|
+
|
|
450
|
+
## 関連ドキュメント
|
|
451
|
+
|
|
452
|
+
- [packages/driver/README.md](../packages/driver/README.md) - 詳細な使用方法とカスタムドライバーの実装
|
|
453
|
+
- [Structured Outputs仕様](./STRUCTURED_OUTPUTS.md) - 構造化出力の詳細
|
|
454
|
+
- [AIService完全ガイド](./AI_SERVICE_GUIDE.md) - 動的ドライバー選択
|
|
455
|
+
- [テスト用ドライバーガイド](./TEST_DRIVERS.md) - TestDriver/EchoDriverの使い方
|