hoomanjs 1.42.0 → 1.43.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 (47) hide show
  1. package/README.md +3 -3
  2. package/dist/acp/acp-agent.js +21 -3
  3. package/dist/acp/acp-agent.js.map +1 -1
  4. package/dist/chat/app.js +19 -2
  5. package/dist/chat/app.js.map +1 -1
  6. package/dist/chat/components/BottomChrome.d.ts +1 -0
  7. package/dist/chat/components/BottomChrome.js.map +1 -1
  8. package/dist/chat/components/StatusBar.d.ts +1 -0
  9. package/dist/chat/components/StatusBar.js +3 -0
  10. package/dist/chat/components/StatusBar.js.map +1 -1
  11. package/dist/configure/app.js +153 -4
  12. package/dist/configure/app.js.map +1 -1
  13. package/dist/configure/types.d.ts +3 -0
  14. package/dist/core/config.d.ts +75 -5
  15. package/dist/core/config.js +43 -0
  16. package/dist/core/config.js.map +1 -1
  17. package/dist/core/models/hub-download.d.ts +27 -0
  18. package/dist/core/models/hub-download.js +136 -0
  19. package/dist/core/models/hub-download.js.map +1 -0
  20. package/dist/core/models/index.js +1 -0
  21. package/dist/core/models/index.js.map +1 -1
  22. package/dist/core/models/llama-cpp/index.js +6 -3
  23. package/dist/core/models/llama-cpp/index.js.map +1 -1
  24. package/dist/core/models/llama-cpp/resolve-model.js +3 -132
  25. package/dist/core/models/llama-cpp/resolve-model.js.map +1 -1
  26. package/dist/core/models/llama-cpp/strands-llama-cpp.d.ts +7 -1
  27. package/dist/core/models/llama-cpp/strands-llama-cpp.js +9 -3
  28. package/dist/core/models/llama-cpp/strands-llama-cpp.js.map +1 -1
  29. package/dist/core/models/mlx/index.d.ts +13 -0
  30. package/dist/core/models/mlx/index.js +47 -0
  31. package/dist/core/models/mlx/index.js.map +1 -0
  32. package/dist/core/models/mlx/resolve-model.d.ts +31 -0
  33. package/dist/core/models/mlx/resolve-model.js +149 -0
  34. package/dist/core/models/mlx/resolve-model.js.map +1 -0
  35. package/dist/core/models/mlx/strands-mlx.d.ts +45 -0
  36. package/dist/core/models/mlx/strands-mlx.js +439 -0
  37. package/dist/core/models/mlx/strands-mlx.js.map +1 -0
  38. package/dist/core/models/types.d.ts +168 -14
  39. package/dist/core/models/types.js +43 -3
  40. package/dist/core/models/types.js.map +1 -1
  41. package/dist/core/skills/built-in/hooman-config/SKILL.md +40 -5
  42. package/dist/core/skills/built-in/hooman-config/providers.md +4 -1
  43. package/dist/core/utils/billing.d.ts +29 -2
  44. package/dist/core/utils/billing.js +45 -4
  45. package/dist/core/utils/billing.js.map +1 -1
  46. package/dist/core/utils/reasoning-effort.d.ts +1 -0
  47. package/package.json +2 -1
@@ -0,0 +1,439 @@
1
+ import { Model, ModelError } from "@strands-agents/sdk";
2
+ import { ModelContentBlockDeltaEvent, ModelContentBlockStartEvent, ModelContentBlockStopEvent, ModelMessageStartEvent, ModelMessageStopEvent, ModelMetadataEvent, } from "@strands-agents/sdk";
3
+ import { resolveModelDir } from "./resolve-model.js";
4
+ /**
5
+ * mlex.js caps generation at 256 tokens when `maxTokens` is unset — far too
6
+ * low for agent turns — so apply our own default instead.
7
+ */
8
+ const DEFAULT_MAX_TOKENS = 8192;
9
+ /**
10
+ * Loaded MLX models are expensive (weights in unified memory), so share them
11
+ * process-wide keyed by resolved model directory. mlex.js is stateless like
12
+ * the OpenAI/Anthropic APIs — every `generate` call takes the full
13
+ * transcript, and an internal prompt-cache pool transparently reuses KV
14
+ * state for whatever prefix a previous call already computed.
15
+ */
16
+ const loadedModelPromises = new Map();
17
+ /**
18
+ * Streamed token classification is best-effort at token granularity, so the
19
+ * reasoning-span markers themselves (`<think>`/`</think>`, Gemma4's channel
20
+ * markers) can arrive inside `kind: "reasoning"` deltas. The final result's
21
+ * `reasoning` field is marker-stripped — only the incremental stream carries
22
+ * them — so strip them here to keep the reasoning block to the chain of
23
+ * thought.
24
+ */
25
+ const REASONING_MARKER_RE = /<\/?think>|<\|channel\|?>thought|<\/?channel\|>/g;
26
+ function extractSystemText(system) {
27
+ if (system === undefined) {
28
+ return undefined;
29
+ }
30
+ if (typeof system === "string") {
31
+ return system;
32
+ }
33
+ const parts = [];
34
+ for (const block of system) {
35
+ if (block.type === "textBlock") {
36
+ parts.push(block.text);
37
+ }
38
+ }
39
+ const joined = parts.join("\n").trim();
40
+ return joined.length > 0 ? joined : undefined;
41
+ }
42
+ function toolResultToText(block) {
43
+ const parts = [];
44
+ for (const c of block.content) {
45
+ if (c.type === "textBlock") {
46
+ parts.push(c.text);
47
+ }
48
+ else if (c.type === "jsonBlock") {
49
+ parts.push(JSON.stringify(c.json));
50
+ }
51
+ else if (c.type === "imageBlock") {
52
+ parts.push("(mlx: image tool results are not supported)");
53
+ }
54
+ }
55
+ const joined = parts.join("\n");
56
+ if (joined.length > 0) {
57
+ return joined;
58
+ }
59
+ return block.status === "error" ? "(tool error)" : "";
60
+ }
61
+ /**
62
+ * Convert Strands conversation history to mlex.js `JsChatMessage[]` — the
63
+ * same OpenAI-style layout: assistant toolUse blocks become `toolCalls` on
64
+ * the assistant message and the matching toolResult blocks (which Strands
65
+ * puts on the following user message) become `role: "tool"` messages
66
+ * referencing the call id. Image blocks with inline bytes are attached as
67
+ * `images` when the loaded checkpoint accepts them.
68
+ */
69
+ function strandsMessagesToHistory(messages, systemText, supportsImages) {
70
+ const history = [];
71
+ if (systemText) {
72
+ history.push({ role: "system", content: systemText });
73
+ }
74
+ const appendText = (msg, text) => {
75
+ msg.content = msg.content.length > 0 ? `${msg.content}\n${text}` : text;
76
+ };
77
+ const blockToText = (block) => {
78
+ if (block.type === "textBlock") {
79
+ return block.text;
80
+ }
81
+ if (block.type === "imageBlock" ||
82
+ block.type === "videoBlock" ||
83
+ block.type === "documentBlock") {
84
+ return `(mlx: ${block.type} content is not supported by this model)`;
85
+ }
86
+ return undefined;
87
+ };
88
+ for (const msg of messages) {
89
+ for (const block of msg.content) {
90
+ if (msg.role === "assistant") {
91
+ if (block.type === "toolUseBlock") {
92
+ const b = block;
93
+ const call = {
94
+ id: b.toolUseId,
95
+ name: b.name,
96
+ argumentsJson: JSON.stringify(b.input ?? {}),
97
+ };
98
+ const last = history.at(-1);
99
+ if (last?.role === "assistant") {
100
+ last.toolCalls = [...(last.toolCalls ?? []), call];
101
+ }
102
+ else {
103
+ history.push({ role: "assistant", content: "", toolCalls: [call] });
104
+ }
105
+ continue;
106
+ }
107
+ if (block.type === "reasoningBlock") {
108
+ // Prior turns' chain of thought is not replayed into the context.
109
+ continue;
110
+ }
111
+ const text = blockToText(block);
112
+ if (text !== undefined && text.length > 0) {
113
+ const last = history.at(-1);
114
+ if (last?.role === "assistant") {
115
+ appendText(last, text);
116
+ }
117
+ else {
118
+ history.push({ role: "assistant", content: text });
119
+ }
120
+ }
121
+ continue;
122
+ }
123
+ // user role
124
+ if (block.type === "toolResultBlock") {
125
+ const b = block;
126
+ history.push({
127
+ role: "tool",
128
+ content: toolResultToText(b),
129
+ toolCallId: b.toolUseId,
130
+ });
131
+ continue;
132
+ }
133
+ if (block.type === "imageBlock" && supportsImages) {
134
+ const source = block.source;
135
+ if (source.bytes !== undefined) {
136
+ const last = history.at(-1);
137
+ const target = last?.role === "user" && last.toolCalls === undefined
138
+ ? last
139
+ : (history.push({ role: "user", content: "" }),
140
+ history.at(-1));
141
+ target.images = [...(target.images ?? []), Buffer.from(source.bytes)];
142
+ continue;
143
+ }
144
+ }
145
+ const text = blockToText(block);
146
+ if (text !== undefined && text.length > 0) {
147
+ const last = history.at(-1);
148
+ if (last?.role === "user" && last.toolCalls === undefined) {
149
+ appendText(last, text);
150
+ }
151
+ else {
152
+ history.push({ role: "user", content: text });
153
+ }
154
+ }
155
+ }
156
+ }
157
+ return history;
158
+ }
159
+ /**
160
+ * Convert Strands tool specs to mlex.js `JsTool`s. mlex takes standard JSON
161
+ * Schema `parameters` directly — no GBNF conversion or schema mangling.
162
+ */
163
+ function strandsToolsToDefinitions(toolSpecs) {
164
+ if (!toolSpecs?.length) {
165
+ return undefined;
166
+ }
167
+ return toolSpecs.map((spec) => ({
168
+ name: spec.name,
169
+ ...(spec.description ? { description: spec.description } : {}),
170
+ parameters: spec.inputSchema ?? { type: "object", properties: {} },
171
+ }));
172
+ }
173
+ /** Strands {@link Model} backed by in-process Apple MLX via `mlex.js`. */
174
+ export class StrandsMlxModel extends Model {
175
+ config;
176
+ modelPromise;
177
+ constructor(config) {
178
+ super();
179
+ this.config = { ...config };
180
+ }
181
+ updateConfig(modelConfig) {
182
+ const modelKey = (c) => JSON.stringify([c.modelId, c.promptCache ?? null]);
183
+ const before = modelKey(this.config);
184
+ this.config = { ...this.config, ...modelConfig };
185
+ if (modelKey(this.config) !== before) {
186
+ // Weights stay cached process-wide; just re-resolve on the next stream.
187
+ this.modelPromise = undefined;
188
+ }
189
+ }
190
+ getConfig() {
191
+ return { ...this.config };
192
+ }
193
+ getModel() {
194
+ this.modelPromise ??= this.initModel();
195
+ return this.modelPromise;
196
+ }
197
+ async initModel() {
198
+ const modelId = this.config.modelId;
199
+ if (!modelId) {
200
+ throw new ModelError("MLX model is not configured");
201
+ }
202
+ const modelDir = await resolveModelDir(modelId, this.config.hfToken);
203
+ const promptCache = this.config.promptCache;
204
+ const cacheEnabled = promptCache !== undefined && promptCache !== false;
205
+ // The prompt-cache pool is sized once at load time; key the shared
206
+ // instance by pool config too so two provider configs pointing at the
207
+ // same model directory with different sizing each get their own
208
+ // session instead of silently reusing whichever loaded first.
209
+ const cacheKey = `${modelDir}\u0000${JSON.stringify(cacheEnabled ? promptCache : false)}`;
210
+ let promise = loadedModelPromises.get(cacheKey);
211
+ if (!promise) {
212
+ promise = (async () => {
213
+ const { MlexModel } = await import("mlex.js");
214
+ return MlexModel.load(modelDir, cacheEnabled
215
+ ? {
216
+ ...(promptCache.maxEntries !== undefined
217
+ ? { maxEntries: promptCache.maxEntries }
218
+ : {}),
219
+ ...(promptCache.ttl !== undefined
220
+ ? { ttlSeconds: promptCache.ttl }
221
+ : {}),
222
+ ...(promptCache.minTokens !== undefined
223
+ ? { minCacheableTokens: promptCache.minTokens }
224
+ : {}),
225
+ }
226
+ : undefined);
227
+ })();
228
+ loadedModelPromises.set(cacheKey, promise);
229
+ promise.catch(() => loadedModelPromises.delete(cacheKey));
230
+ }
231
+ return promise;
232
+ }
233
+ buildGenerateOptions(toolSpecs) {
234
+ const reasoningEnabled = this.config.reasoning !== undefined;
235
+ const tools = strandsToolsToDefinitions(toolSpecs);
236
+ return {
237
+ maxTokens: this.config.maxTokens ?? DEFAULT_MAX_TOKENS,
238
+ ...(this.config.temperature !== undefined
239
+ ? { temperature: this.config.temperature }
240
+ : {}),
241
+ ...(this.config.topP !== undefined ? { topP: this.config.topP } : {}),
242
+ ...(tools ? { tools } : {}),
243
+ ...(this.config.promptCache === undefined || this.config.promptCache === false
244
+ ? { promptCache: false }
245
+ : {}),
246
+ // Presence of `reasoning` opts into thinking with a token budget;
247
+ // absence pins it off (the template default for every supported
248
+ // family, made explicit).
249
+ enableThinking: reasoningEnabled,
250
+ ...(reasoningEnabled && this.config.thoughtBudgetTokens !== undefined
251
+ ? { reasoningBudgetTokens: this.config.thoughtBudgetTokens }
252
+ : {}),
253
+ };
254
+ }
255
+ async *stream(messages, options) {
256
+ let model;
257
+ try {
258
+ model = await this.getModel();
259
+ }
260
+ catch (e) {
261
+ // Let a failed init (bad model spec, download failure) be retried.
262
+ this.modelPromise = undefined;
263
+ if (e instanceof ModelError) {
264
+ throw e;
265
+ }
266
+ const msg = e instanceof Error ? e.message : String(e);
267
+ throw new ModelError(`MLX initialization failed: ${msg}`, { cause: e });
268
+ }
269
+ const systemText = extractSystemText(options?.systemPrompt);
270
+ const history = strandsMessagesToHistory(messages, systemText, model.supportsImages());
271
+ const generateOptions = this.buildGenerateOptions(options?.toolSpecs);
272
+ // Adapt mlex's onToken callback + result promise to a pull-based queue
273
+ // the generator below can drain with backpressure-free yields.
274
+ const queue = [];
275
+ let notify;
276
+ const push = (item) => {
277
+ queue.push(item);
278
+ notify?.();
279
+ notify = undefined;
280
+ };
281
+ const waitForItem = () => queue.length > 0
282
+ ? Promise.resolve()
283
+ : new Promise((resolve) => {
284
+ notify = resolve;
285
+ });
286
+ model
287
+ .generate(history, generateOptions, (err, token) => {
288
+ if (err) {
289
+ push({ error: err });
290
+ }
291
+ else {
292
+ push({ token });
293
+ }
294
+ })
295
+ .then((result) => push({ result }), (error) => push({ error }));
296
+ yield new ModelMessageStartEvent({
297
+ type: "modelMessageStartEvent",
298
+ role: "assistant",
299
+ });
300
+ let textBlockOpen = false;
301
+ let reasoningBlockOpen = false;
302
+ const closeOpenBlock = () => {
303
+ if (textBlockOpen || reasoningBlockOpen) {
304
+ textBlockOpen = false;
305
+ reasoningBlockOpen = false;
306
+ return new ModelContentBlockStopEvent({
307
+ type: "modelContentBlockStopEvent",
308
+ });
309
+ }
310
+ return undefined;
311
+ };
312
+ try {
313
+ let finalResult;
314
+ while (finalResult === undefined) {
315
+ await waitForItem();
316
+ while (queue.length > 0 && finalResult === undefined) {
317
+ const item = queue.shift();
318
+ if ("error" in item) {
319
+ const e = item.error;
320
+ const msg = e instanceof Error ? e.message : String(e);
321
+ throw new ModelError(`MLX generation error: ${msg}`, { cause: e });
322
+ }
323
+ if ("result" in item) {
324
+ finalResult = item.result;
325
+ break;
326
+ }
327
+ const token = item.token;
328
+ if (token.kind === "toolCall") {
329
+ // Raw, not-yet-parsed tool-call syntax; the parsed calls arrive
330
+ // on the final result.
331
+ continue;
332
+ }
333
+ const isReasoning = token.kind === "reasoning";
334
+ const text = isReasoning
335
+ ? token.text.replace(REASONING_MARKER_RE, "")
336
+ : token.text;
337
+ if (text.length === 0) {
338
+ continue;
339
+ }
340
+ // Templates emit a newline right after the thinking marker; don't
341
+ // open the reasoning block on whitespace alone.
342
+ if (isReasoning && !reasoningBlockOpen && text.trim().length === 0) {
343
+ continue;
344
+ }
345
+ if (isReasoning ? textBlockOpen : reasoningBlockOpen) {
346
+ const stop = closeOpenBlock();
347
+ if (stop) {
348
+ yield stop;
349
+ }
350
+ }
351
+ if (!textBlockOpen && !reasoningBlockOpen) {
352
+ yield new ModelContentBlockStartEvent({
353
+ type: "modelContentBlockStartEvent",
354
+ });
355
+ if (isReasoning) {
356
+ reasoningBlockOpen = true;
357
+ }
358
+ else {
359
+ textBlockOpen = true;
360
+ }
361
+ }
362
+ yield new ModelContentBlockDeltaEvent({
363
+ type: "modelContentBlockDeltaEvent",
364
+ delta: isReasoning
365
+ ? { type: "reasoningContentDelta", text }
366
+ : { type: "textDelta", text },
367
+ });
368
+ }
369
+ }
370
+ const stop = closeOpenBlock();
371
+ if (stop) {
372
+ yield stop;
373
+ }
374
+ for (const call of finalResult.toolCalls) {
375
+ let input = {};
376
+ try {
377
+ input = JSON.parse(call.argumentsJson) ?? {};
378
+ }
379
+ catch {
380
+ // Unparseable arguments degrade to an empty object; the tool's own
381
+ // schema validation will surface the problem to the model.
382
+ }
383
+ yield new ModelContentBlockStartEvent({
384
+ type: "modelContentBlockStartEvent",
385
+ start: {
386
+ type: "toolUseStart",
387
+ name: call.name,
388
+ toolUseId: call.id,
389
+ },
390
+ });
391
+ yield new ModelContentBlockDeltaEvent({
392
+ type: "modelContentBlockDeltaEvent",
393
+ delta: {
394
+ type: "toolUseInputDelta",
395
+ input: JSON.stringify(input),
396
+ },
397
+ });
398
+ yield new ModelContentBlockStopEvent({
399
+ type: "modelContentBlockStopEvent",
400
+ });
401
+ }
402
+ // Native finish reason from mlex ("stop" | "length" | "toolCalls" |
403
+ // "aborted"), mapped onto Strands' stop reasons. "aborted" (the
404
+ // onToken callback stopped generation early — unused by this
405
+ // provider) degrades to endTurn.
406
+ const stopReason = finalResult.finishReason === "toolCalls"
407
+ ? "toolUse"
408
+ : finalResult.finishReason === "length"
409
+ ? "maxTokens"
410
+ : "endTurn";
411
+ yield new ModelMessageStopEvent({
412
+ type: "modelMessageStopEvent",
413
+ stopReason,
414
+ });
415
+ // mlex reports OpenAI-style usage: `promptTokens` is the full prompt
416
+ // and `cachedTokens` a subset of it served from the prompt-cache pool.
417
+ // The factory marks this model total-inclusive so billing meters
418
+ // normalize it to the additive shape.
419
+ const { promptTokens, cachedTokens, completionTokens } = finalResult.usage;
420
+ yield new ModelMetadataEvent({
421
+ type: "modelMetadataEvent",
422
+ usage: {
423
+ inputTokens: promptTokens,
424
+ outputTokens: completionTokens,
425
+ totalTokens: promptTokens + completionTokens,
426
+ ...(cachedTokens > 0 ? { cacheReadInputTokens: cachedTokens } : {}),
427
+ },
428
+ });
429
+ }
430
+ catch (e) {
431
+ if (e instanceof ModelError) {
432
+ throw e;
433
+ }
434
+ const msg = e instanceof Error ? e.message : String(e);
435
+ throw new ModelError(`MLX generation error: ${msg}`, { cause: e });
436
+ }
437
+ }
438
+ }
439
+ //# sourceMappingURL=strands-mlx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strands-mlx.js","sourceRoot":"","sources":["../../../../src/core/models/mlx/strands-mlx.ts"],"names":[],"mappings":"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"}