@gobing-ai/ts-laya-mlx 0.5.22 → 0.5.24

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 CHANGED
@@ -59,6 +59,11 @@ Measured on an Apple Silicon Mac (official checkpoint, f16, 3-question batch, 20
59
59
  createLayaDriver({ core: 'mlx-native', modelPath: '/models/laya-ft-kk' });
60
60
  ```
61
61
 
62
+ The returned driver implements `dispose()`, which closes the client it was built with — the
63
+ `mlx-python` worker is held warm for the client's lifetime, and its open pipes otherwise keep a
64
+ one-shot parent process alive after the last answer. Call it through `maker.dispose()` (from
65
+ `createDecisionMaker`) or `registry.dispose('laya-local')`.
66
+
62
67
  ---
63
68
 
64
69
  ## Backend selection (`ts-ai-runner`)
@@ -99,6 +104,7 @@ Resolution order: `options.driver` (custom driver double) → `options.backend`
99
104
  | Dimension | Hosted TypeSafe (`ts-ai-runner`) | Local Laya (`ts-laya-mlx`) | Notes |
100
105
  |-----------|----------------------------------|---------------------------|-------|
101
106
  | **Factory** | `createTypesafeDriver(config)` | `createLayaDriver(options)` | Both return `DecisionDriver` with single `ask()` method. |
107
+ | **Release** | none (stateless HTTP) | `dispose()` closes the warm worker | A `laya-local` maker must be disposed or a one-shot parent never exits. |
102
108
  | **Driver name** | `'typesafe'` | `'laya-local'` | Available on `driver.name`. |
103
109
  | **Credentials** | `apiKey: string` (`TYPESAFE_API_KEY`) | `env.HF_TOKEN` (optional) | Local inference needs no key; token only for gated HF repos. |
104
110
  | **Model selector** | `model?: string` | `modelId?: string` | Default: `'convaiinnovations/laya-multilingual'`. |
@@ -1 +1 @@
1
- {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACH,KAAK,MAAM,EAGX,KAAK,cAAc,EAInB,KAAK,QAAQ,EAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAEH,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACtB,MAAM,iBAAiB,CAAC;AAEzB;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,MAAM,CAAC;AAI5D,8CAA8C;AAC9C,MAAM,WAAW,UAAU;IACvB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzF,OAAO,IAAI,IAAI,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,iBAAkB,SAAQ,uBAAuB;IAC9D,qEAAqE;IACrE,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,uFAAuF;IACvF,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACnC;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,OAAO,GAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,KAAK,CAAM,GAAG,QAAQ,CAS/F;AA8CD,kDAAkD;AAClD,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CAS5E;AAuBD,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,CA8BnE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CA2E9E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,cAAc,CAoChF"}
1
+ {"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACH,KAAK,MAAM,EAGX,KAAK,cAAc,EAInB,KAAK,QAAQ,EAChB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAEH,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACtB,MAAM,iBAAiB,CAAC;AAEzB;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,MAAM,CAAC;AAI5D,8CAA8C;AAC9C,MAAM,WAAW,UAAU;IACvB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzF,OAAO,IAAI,IAAI,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,iBAAkB,SAAQ,uBAAuB;IAC9D,qEAAqE;IACrE,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,uFAAuF;IACvF,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,6EAA6E;IAC7E,YAAY,CAAC,EAAE,gBAAgB,CAAC;CACnC;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,OAAO,GAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,GAAG,KAAK,CAAM,GAAG,QAAQ,CAS/F;AA8CD,kDAAkD;AAClD,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,UAAU,CAS5E;AAuBD,qFAAqF;AACrF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,cAAc,CA8BnE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CA2E9E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,cAAc,CAwChF"}
package/dist/driver.js CHANGED
@@ -210,6 +210,10 @@ export function createLayaDriver(options = {}) {
210
210
  const client = options.client ?? createLayaClient(options);
211
211
  return {
212
212
  name: 'laya-local',
213
+ // The client holds a warm Python worker for its lifetime (and the worker's open pipes keep
214
+ // a one-shot parent alive), so the driver exposes the release the client already owns; a
215
+ // consumer that made no call has nothing to close and every dispose is idempotent.
216
+ dispose: () => client.dispose(),
213
217
  async ask({ state, questions, }) {
214
218
  if (!questions || typeof questions !== 'object' || Object.keys(questions).length === 0) {
215
219
  throw new DecisionRequestError('expected a nonempty question map', undefined, undefined);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gobing-ai/ts-laya-mlx",
3
- "version": "0.5.22",
3
+ "version": "0.5.24",
4
4
  "description": "@gobing-ai/ts-laya-mlx — Local Laya decision backend driving the vendored MLX runtime over a process bridge.",
5
5
  "keywords": [
6
6
  "typescript",
@@ -52,8 +52,8 @@
52
52
  "release": "echo 'Manual publish is disabled. Releases go through GitHub Actions via Trusted Publishing — push a tag: git tag @gobing-ai/ts-laya-mlx-v<version> && git push --tags' && exit 1"
53
53
  },
54
54
  "dependencies": {
55
- "@gobing-ai/ts-ai-runner": "^0.5.22",
56
- "@gobing-ai/ts-runtime": "^0.5.22",
55
+ "@gobing-ai/ts-ai-runner": "^0.5.24",
56
+ "@gobing-ai/ts-runtime": "^0.5.24",
57
57
  "@johnhenry/laya": "0.3.2"
58
58
  },
59
59
  "optionalDependencies": {
package/src/driver.ts CHANGED
@@ -262,6 +262,10 @@ export function createLayaDriver(options: LayaDriverOptions = {}): DecisionDrive
262
262
 
263
263
  return {
264
264
  name: 'laya-local',
265
+ // The client holds a warm Python worker for its lifetime (and the worker's open pipes keep
266
+ // a one-shot parent alive), so the driver exposes the release the client already owns; a
267
+ // consumer that made no call has nothing to close and every dispose is idempotent.
268
+ dispose: () => client.dispose(),
265
269
  async ask({
266
270
  state,
267
271
  questions,