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.
- package/README.md +3 -3
- package/dist/acp/acp-agent.js +21 -3
- package/dist/acp/acp-agent.js.map +1 -1
- package/dist/chat/app.js +19 -2
- package/dist/chat/app.js.map +1 -1
- package/dist/chat/components/BottomChrome.d.ts +1 -0
- package/dist/chat/components/BottomChrome.js.map +1 -1
- package/dist/chat/components/StatusBar.d.ts +1 -0
- package/dist/chat/components/StatusBar.js +3 -0
- package/dist/chat/components/StatusBar.js.map +1 -1
- package/dist/configure/app.js +153 -4
- package/dist/configure/app.js.map +1 -1
- package/dist/configure/types.d.ts +3 -0
- package/dist/core/config.d.ts +75 -5
- package/dist/core/config.js +43 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/models/hub-download.d.ts +27 -0
- package/dist/core/models/hub-download.js +136 -0
- package/dist/core/models/hub-download.js.map +1 -0
- package/dist/core/models/index.js +1 -0
- package/dist/core/models/index.js.map +1 -1
- package/dist/core/models/llama-cpp/index.js +6 -3
- package/dist/core/models/llama-cpp/index.js.map +1 -1
- package/dist/core/models/llama-cpp/resolve-model.js +3 -132
- package/dist/core/models/llama-cpp/resolve-model.js.map +1 -1
- package/dist/core/models/llama-cpp/strands-llama-cpp.d.ts +7 -1
- package/dist/core/models/llama-cpp/strands-llama-cpp.js +9 -3
- package/dist/core/models/llama-cpp/strands-llama-cpp.js.map +1 -1
- package/dist/core/models/mlx/index.d.ts +13 -0
- package/dist/core/models/mlx/index.js +47 -0
- package/dist/core/models/mlx/index.js.map +1 -0
- package/dist/core/models/mlx/resolve-model.d.ts +31 -0
- package/dist/core/models/mlx/resolve-model.js +149 -0
- package/dist/core/models/mlx/resolve-model.js.map +1 -0
- package/dist/core/models/mlx/strands-mlx.d.ts +45 -0
- package/dist/core/models/mlx/strands-mlx.js +439 -0
- package/dist/core/models/mlx/strands-mlx.js.map +1 -0
- package/dist/core/models/types.d.ts +168 -14
- package/dist/core/models/types.js +43 -3
- package/dist/core/models/types.js.map +1 -1
- package/dist/core/skills/built-in/hooman-config/SKILL.md +40 -5
- package/dist/core/skills/built-in/hooman-config/providers.md +4 -1
- package/dist/core/utils/billing.d.ts +29 -2
- package/dist/core/utils/billing.js +45 -4
- package/dist/core/utils/billing.js.map +1 -1
- package/dist/core/utils/reasoning-effort.d.ts +1 -0
- 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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"}
|