llmist 3.1.0 → 5.0.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/dist/{chunk-JCFPJMRQ.js → chunk-3SZIQI45.js} +148 -36
- package/dist/chunk-3SZIQI45.js.map +1 -0
- package/dist/{chunk-LFI4WQVV.js → chunk-UBPZUVIN.js} +2 -2
- package/dist/chunk-UBPZUVIN.js.map +1 -0
- package/dist/cli.cjs +545 -280
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +371 -218
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +147 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js +2 -2
- package/dist/{mock-stream-CTLm00_q.d.cts → mock-stream-CAY53Q6u.d.cts} +106 -25
- package/dist/{mock-stream-CTLm00_q.d.ts → mock-stream-CAY53Q6u.d.ts} +106 -25
- package/dist/testing/index.cjs +147 -35
- package/dist/testing/index.cjs.map +1 -1
- package/dist/testing/index.d.cts +2 -2
- package/dist/testing/index.d.ts +2 -2
- package/dist/testing/index.js +1 -1
- package/package.json +3 -2
- package/dist/chunk-JCFPJMRQ.js.map +0 -1
- package/dist/chunk-LFI4WQVV.js.map +0 -1
|
@@ -3549,7 +3549,7 @@ var init_executor = __esm({
|
|
|
3549
3549
|
init_exceptions();
|
|
3550
3550
|
init_parser();
|
|
3551
3551
|
GadgetExecutor = class {
|
|
3552
|
-
constructor(registry, requestHumanInput, logger, defaultGadgetTimeoutMs, errorFormatterOptions, client, mediaStore, agentConfig, subagentConfig,
|
|
3552
|
+
constructor(registry, requestHumanInput, logger, defaultGadgetTimeoutMs, errorFormatterOptions, client, mediaStore, agentConfig, subagentConfig, onSubagentEvent) {
|
|
3553
3553
|
this.registry = registry;
|
|
3554
3554
|
this.requestHumanInput = requestHumanInput;
|
|
3555
3555
|
this.defaultGadgetTimeoutMs = defaultGadgetTimeoutMs;
|
|
@@ -3557,7 +3557,7 @@ var init_executor = __esm({
|
|
|
3557
3557
|
this.mediaStore = mediaStore;
|
|
3558
3558
|
this.agentConfig = agentConfig;
|
|
3559
3559
|
this.subagentConfig = subagentConfig;
|
|
3560
|
-
this.
|
|
3560
|
+
this.onSubagentEvent = onSubagentEvent;
|
|
3561
3561
|
this.logger = logger ?? createLogger({ name: "llmist:executor" });
|
|
3562
3562
|
this.errorFormatter = new GadgetExecutionErrorFormatter(errorFormatterOptions);
|
|
3563
3563
|
this.argPrefix = errorFormatterOptions?.argPrefix ?? GADGET_ARG_PREFIX;
|
|
@@ -3705,7 +3705,7 @@ var init_executor = __esm({
|
|
|
3705
3705
|
agentConfig: this.agentConfig,
|
|
3706
3706
|
subagentConfig: this.subagentConfig,
|
|
3707
3707
|
invocationId: call.invocationId,
|
|
3708
|
-
|
|
3708
|
+
onSubagentEvent: this.onSubagentEvent
|
|
3709
3709
|
};
|
|
3710
3710
|
let rawResult;
|
|
3711
3711
|
if (timeoutMs && timeoutMs > 0) {
|
|
@@ -3945,7 +3945,7 @@ var init_stream_processor = __esm({
|
|
|
3945
3945
|
options.mediaStore,
|
|
3946
3946
|
options.agentConfig,
|
|
3947
3947
|
options.subagentConfig,
|
|
3948
|
-
options.
|
|
3948
|
+
options.onSubagentEvent
|
|
3949
3949
|
);
|
|
3950
3950
|
}
|
|
3951
3951
|
/**
|
|
@@ -4904,8 +4904,12 @@ var init_agent = __esm({
|
|
|
4904
4904
|
// Subagent configuration
|
|
4905
4905
|
agentContextConfig;
|
|
4906
4906
|
subagentConfig;
|
|
4907
|
-
//
|
|
4908
|
-
|
|
4907
|
+
// Subagent event callback for subagent gadgets
|
|
4908
|
+
userSubagentEventCallback;
|
|
4909
|
+
// Internal queue for yielding subagent events in run()
|
|
4910
|
+
pendingSubagentEvents = [];
|
|
4911
|
+
// Combined callback that queues events AND calls user callback
|
|
4912
|
+
onSubagentEvent;
|
|
4909
4913
|
/**
|
|
4910
4914
|
* Creates a new Agent instance.
|
|
4911
4915
|
* @internal This constructor is private. Use LLMist.createAgent() or AgentBuilder instead.
|
|
@@ -4983,7 +4987,72 @@ var init_agent = __esm({
|
|
|
4983
4987
|
temperature: this.temperature
|
|
4984
4988
|
};
|
|
4985
4989
|
this.subagentConfig = options.subagentConfig;
|
|
4986
|
-
this.
|
|
4990
|
+
this.userSubagentEventCallback = options.onSubagentEvent;
|
|
4991
|
+
this.onSubagentEvent = (event) => {
|
|
4992
|
+
this.pendingSubagentEvents.push(event);
|
|
4993
|
+
this.userSubagentEventCallback?.(event);
|
|
4994
|
+
const subagentContext = {
|
|
4995
|
+
parentGadgetInvocationId: event.gadgetInvocationId,
|
|
4996
|
+
depth: event.depth
|
|
4997
|
+
};
|
|
4998
|
+
if (event.type === "llm_call_start") {
|
|
4999
|
+
const info = event.event;
|
|
5000
|
+
void this.hooks?.observers?.onLLMCallStart?.({
|
|
5001
|
+
iteration: info.iteration,
|
|
5002
|
+
options: { model: info.model, messages: [] },
|
|
5003
|
+
logger: this.logger,
|
|
5004
|
+
subagentContext
|
|
5005
|
+
});
|
|
5006
|
+
} else if (event.type === "llm_call_end") {
|
|
5007
|
+
const info = event.event;
|
|
5008
|
+
const usage = info.usage ?? (info.outputTokens ? {
|
|
5009
|
+
inputTokens: info.inputTokens ?? 0,
|
|
5010
|
+
outputTokens: info.outputTokens,
|
|
5011
|
+
totalTokens: (info.inputTokens ?? 0) + info.outputTokens
|
|
5012
|
+
} : void 0);
|
|
5013
|
+
void this.hooks?.observers?.onLLMCallComplete?.({
|
|
5014
|
+
iteration: info.iteration,
|
|
5015
|
+
options: { model: info.model, messages: [] },
|
|
5016
|
+
finishReason: info.finishReason ?? null,
|
|
5017
|
+
usage,
|
|
5018
|
+
rawResponse: "",
|
|
5019
|
+
finalMessage: "",
|
|
5020
|
+
logger: this.logger,
|
|
5021
|
+
subagentContext
|
|
5022
|
+
});
|
|
5023
|
+
} else if (event.type === "gadget_call") {
|
|
5024
|
+
const gadgetEvent = event.event;
|
|
5025
|
+
void this.hooks?.observers?.onGadgetExecutionStart?.({
|
|
5026
|
+
iteration: 0,
|
|
5027
|
+
gadgetName: gadgetEvent.call.gadgetName,
|
|
5028
|
+
invocationId: gadgetEvent.call.invocationId,
|
|
5029
|
+
parameters: gadgetEvent.call.parameters ?? {},
|
|
5030
|
+
logger: this.logger,
|
|
5031
|
+
subagentContext
|
|
5032
|
+
});
|
|
5033
|
+
} else if (event.type === "gadget_result") {
|
|
5034
|
+
const resultEvent = event.event;
|
|
5035
|
+
void this.hooks?.observers?.onGadgetExecutionComplete?.({
|
|
5036
|
+
iteration: 0,
|
|
5037
|
+
gadgetName: resultEvent.result.gadgetName ?? "unknown",
|
|
5038
|
+
invocationId: resultEvent.result.invocationId,
|
|
5039
|
+
parameters: {},
|
|
5040
|
+
executionTimeMs: resultEvent.result.executionTimeMs ?? 0,
|
|
5041
|
+
logger: this.logger,
|
|
5042
|
+
subagentContext
|
|
5043
|
+
});
|
|
5044
|
+
}
|
|
5045
|
+
};
|
|
5046
|
+
}
|
|
5047
|
+
/**
|
|
5048
|
+
* Flush pending subagent events as StreamEvents.
|
|
5049
|
+
* Called from run() to yield queued subagent events from subagent gadgets.
|
|
5050
|
+
*/
|
|
5051
|
+
*flushPendingSubagentEvents() {
|
|
5052
|
+
while (this.pendingSubagentEvents.length > 0) {
|
|
5053
|
+
const event = this.pendingSubagentEvents.shift();
|
|
5054
|
+
yield { type: "subagent_event", subagentEvent: event };
|
|
5055
|
+
}
|
|
4987
5056
|
}
|
|
4988
5057
|
/**
|
|
4989
5058
|
* Get the gadget registry for this agent.
|
|
@@ -5215,7 +5284,7 @@ var init_agent = __esm({
|
|
|
5215
5284
|
mediaStore: this.mediaStore,
|
|
5216
5285
|
agentConfig: this.agentContextConfig,
|
|
5217
5286
|
subagentConfig: this.subagentConfig,
|
|
5218
|
-
|
|
5287
|
+
onSubagentEvent: this.onSubagentEvent
|
|
5219
5288
|
});
|
|
5220
5289
|
let streamMetadata = null;
|
|
5221
5290
|
let gadgetCallCount = 0;
|
|
@@ -5233,6 +5302,7 @@ var init_agent = __esm({
|
|
|
5233
5302
|
gadgetResults.push(event);
|
|
5234
5303
|
}
|
|
5235
5304
|
yield event;
|
|
5305
|
+
yield* this.flushPendingSubagentEvents();
|
|
5236
5306
|
}
|
|
5237
5307
|
if (!streamMetadata) {
|
|
5238
5308
|
throw new Error("Stream processing completed without metadata event");
|
|
@@ -5538,7 +5608,7 @@ var init_builder = __esm({
|
|
|
5538
5608
|
signal;
|
|
5539
5609
|
trailingMessage;
|
|
5540
5610
|
subagentConfig;
|
|
5541
|
-
|
|
5611
|
+
subagentEventCallback;
|
|
5542
5612
|
parentContext;
|
|
5543
5613
|
constructor(client) {
|
|
5544
5614
|
this.client = client;
|
|
@@ -6037,38 +6107,38 @@ var init_builder = __esm({
|
|
|
6037
6107
|
return this;
|
|
6038
6108
|
}
|
|
6039
6109
|
/**
|
|
6040
|
-
* Set the callback for
|
|
6110
|
+
* Set the callback for subagent events.
|
|
6041
6111
|
*
|
|
6042
|
-
* Subagent gadgets (like BrowseWeb) can use ExecutionContext.
|
|
6112
|
+
* Subagent gadgets (like BrowseWeb) can use ExecutionContext.onSubagentEvent
|
|
6043
6113
|
* to report their internal LLM calls and gadget executions in real-time.
|
|
6044
6114
|
* This callback receives those events, enabling hierarchical progress display.
|
|
6045
6115
|
*
|
|
6046
|
-
* @param callback - Function to handle
|
|
6116
|
+
* @param callback - Function to handle subagent events
|
|
6047
6117
|
* @returns This builder for chaining
|
|
6048
6118
|
*
|
|
6049
6119
|
* @example
|
|
6050
6120
|
* ```typescript
|
|
6051
|
-
* .
|
|
6121
|
+
* .withSubagentEventCallback((event) => {
|
|
6052
6122
|
* if (event.type === "llm_call_start") {
|
|
6053
|
-
* console.log(`
|
|
6123
|
+
* console.log(` Subagent LLM #${event.event.iteration} starting...`);
|
|
6054
6124
|
* } else if (event.type === "gadget_call") {
|
|
6055
6125
|
* console.log(` ⏵ ${event.event.call.gadgetName}...`);
|
|
6056
6126
|
* }
|
|
6057
6127
|
* })
|
|
6058
6128
|
* ```
|
|
6059
6129
|
*/
|
|
6060
|
-
|
|
6061
|
-
this.
|
|
6130
|
+
withSubagentEventCallback(callback) {
|
|
6131
|
+
this.subagentEventCallback = callback;
|
|
6062
6132
|
return this;
|
|
6063
6133
|
}
|
|
6064
6134
|
/**
|
|
6065
|
-
* Enable automatic
|
|
6135
|
+
* Enable automatic subagent event forwarding to parent agent.
|
|
6066
6136
|
*
|
|
6067
6137
|
* When building a subagent inside a gadget, call this method to automatically
|
|
6068
6138
|
* forward all LLM calls and gadget events to the parent agent. This enables
|
|
6069
6139
|
* hierarchical progress display without any manual event handling.
|
|
6070
6140
|
*
|
|
6071
|
-
* The method extracts `invocationId` and `
|
|
6141
|
+
* The method extracts `invocationId` and `onSubagentEvent` from the execution
|
|
6072
6142
|
* context and sets up automatic forwarding via hooks and event wrapping.
|
|
6073
6143
|
*
|
|
6074
6144
|
* @param ctx - ExecutionContext passed to the gadget's execute() method
|
|
@@ -6095,10 +6165,10 @@ var init_builder = __esm({
|
|
|
6095
6165
|
* ```
|
|
6096
6166
|
*/
|
|
6097
6167
|
withParentContext(ctx, depth = 1) {
|
|
6098
|
-
if (ctx.
|
|
6168
|
+
if (ctx.onSubagentEvent && ctx.invocationId) {
|
|
6099
6169
|
this.parentContext = {
|
|
6100
6170
|
invocationId: ctx.invocationId,
|
|
6101
|
-
|
|
6171
|
+
onSubagentEvent: ctx.onSubagentEvent,
|
|
6102
6172
|
depth
|
|
6103
6173
|
};
|
|
6104
6174
|
}
|
|
@@ -6173,20 +6243,22 @@ ${endPrefix}`
|
|
|
6173
6243
|
/**
|
|
6174
6244
|
* Compose the final hooks, including:
|
|
6175
6245
|
* - Trailing message injection (if configured)
|
|
6176
|
-
* -
|
|
6246
|
+
* - Subagent event forwarding for LLM calls (if parentContext is set)
|
|
6177
6247
|
*/
|
|
6178
6248
|
composeHooks() {
|
|
6179
6249
|
let hooks = this.hooks;
|
|
6180
6250
|
if (this.parentContext) {
|
|
6181
|
-
const { invocationId,
|
|
6251
|
+
const { invocationId, onSubagentEvent, depth } = this.parentContext;
|
|
6182
6252
|
const existingOnLLMCallStart = hooks?.observers?.onLLMCallStart;
|
|
6183
6253
|
const existingOnLLMCallComplete = hooks?.observers?.onLLMCallComplete;
|
|
6254
|
+
const existingOnGadgetExecutionStart = hooks?.observers?.onGadgetExecutionStart;
|
|
6255
|
+
const existingOnGadgetExecutionComplete = hooks?.observers?.onGadgetExecutionComplete;
|
|
6184
6256
|
hooks = {
|
|
6185
6257
|
...hooks,
|
|
6186
6258
|
observers: {
|
|
6187
6259
|
...hooks?.observers,
|
|
6188
6260
|
onLLMCallStart: async (context) => {
|
|
6189
|
-
|
|
6261
|
+
onSubagentEvent({
|
|
6190
6262
|
type: "llm_call_start",
|
|
6191
6263
|
gadgetInvocationId: invocationId,
|
|
6192
6264
|
depth,
|
|
@@ -6200,20 +6272,57 @@ ${endPrefix}`
|
|
|
6200
6272
|
}
|
|
6201
6273
|
},
|
|
6202
6274
|
onLLMCallComplete: async (context) => {
|
|
6203
|
-
|
|
6275
|
+
onSubagentEvent({
|
|
6204
6276
|
type: "llm_call_end",
|
|
6205
6277
|
gadgetInvocationId: invocationId,
|
|
6206
6278
|
depth,
|
|
6207
6279
|
event: {
|
|
6208
6280
|
iteration: context.iteration,
|
|
6209
6281
|
model: context.options.model,
|
|
6282
|
+
// Backward compat fields
|
|
6283
|
+
inputTokens: context.usage?.inputTokens,
|
|
6210
6284
|
outputTokens: context.usage?.outputTokens,
|
|
6211
|
-
finishReason: context.finishReason
|
|
6285
|
+
finishReason: context.finishReason ?? void 0,
|
|
6286
|
+
// Full usage object with cache details (for first-class display)
|
|
6287
|
+
usage: context.usage
|
|
6288
|
+
// Cost will be calculated by parent if it has model registry
|
|
6212
6289
|
}
|
|
6213
6290
|
});
|
|
6214
6291
|
if (existingOnLLMCallComplete) {
|
|
6215
6292
|
await existingOnLLMCallComplete(context);
|
|
6216
6293
|
}
|
|
6294
|
+
},
|
|
6295
|
+
onGadgetExecutionStart: async (context) => {
|
|
6296
|
+
onSubagentEvent({
|
|
6297
|
+
type: "gadget_call",
|
|
6298
|
+
gadgetInvocationId: invocationId,
|
|
6299
|
+
depth,
|
|
6300
|
+
event: {
|
|
6301
|
+
call: {
|
|
6302
|
+
invocationId: context.invocationId,
|
|
6303
|
+
gadgetName: context.gadgetName,
|
|
6304
|
+
parameters: context.parameters
|
|
6305
|
+
}
|
|
6306
|
+
}
|
|
6307
|
+
});
|
|
6308
|
+
if (existingOnGadgetExecutionStart) {
|
|
6309
|
+
await existingOnGadgetExecutionStart(context);
|
|
6310
|
+
}
|
|
6311
|
+
},
|
|
6312
|
+
onGadgetExecutionComplete: async (context) => {
|
|
6313
|
+
onSubagentEvent({
|
|
6314
|
+
type: "gadget_result",
|
|
6315
|
+
gadgetInvocationId: invocationId,
|
|
6316
|
+
depth,
|
|
6317
|
+
event: {
|
|
6318
|
+
result: {
|
|
6319
|
+
invocationId: context.invocationId
|
|
6320
|
+
}
|
|
6321
|
+
}
|
|
6322
|
+
});
|
|
6323
|
+
if (existingOnGadgetExecutionComplete) {
|
|
6324
|
+
await existingOnGadgetExecutionComplete(context);
|
|
6325
|
+
}
|
|
6217
6326
|
}
|
|
6218
6327
|
}
|
|
6219
6328
|
};
|
|
@@ -6300,11 +6409,11 @@ ${endPrefix}`
|
|
|
6300
6409
|
this.client = new LLMistClass();
|
|
6301
6410
|
}
|
|
6302
6411
|
const registry = GadgetRegistry.from(this.gadgets);
|
|
6303
|
-
let
|
|
6412
|
+
let onSubagentEvent = this.subagentEventCallback;
|
|
6304
6413
|
if (this.parentContext) {
|
|
6305
|
-
const { invocationId,
|
|
6306
|
-
const existingCallback = this.
|
|
6307
|
-
|
|
6414
|
+
const { invocationId, onSubagentEvent: parentCallback, depth } = this.parentContext;
|
|
6415
|
+
const existingCallback = this.subagentEventCallback;
|
|
6416
|
+
onSubagentEvent = (event) => {
|
|
6308
6417
|
parentCallback({
|
|
6309
6418
|
...event,
|
|
6310
6419
|
gadgetInvocationId: invocationId,
|
|
@@ -6339,7 +6448,7 @@ ${endPrefix}`
|
|
|
6339
6448
|
compactionConfig: this.compactionConfig,
|
|
6340
6449
|
signal: this.signal,
|
|
6341
6450
|
subagentConfig: this.subagentConfig,
|
|
6342
|
-
|
|
6451
|
+
onSubagentEvent
|
|
6343
6452
|
};
|
|
6344
6453
|
}
|
|
6345
6454
|
ask(userPrompt) {
|
|
@@ -6496,11 +6605,11 @@ ${endPrefix}`
|
|
|
6496
6605
|
this.client = new LLMistClass();
|
|
6497
6606
|
}
|
|
6498
6607
|
const registry = GadgetRegistry.from(this.gadgets);
|
|
6499
|
-
let
|
|
6608
|
+
let onSubagentEvent = this.subagentEventCallback;
|
|
6500
6609
|
if (this.parentContext) {
|
|
6501
|
-
const { invocationId,
|
|
6502
|
-
const existingCallback = this.
|
|
6503
|
-
|
|
6610
|
+
const { invocationId, onSubagentEvent: parentCallback, depth } = this.parentContext;
|
|
6611
|
+
const existingCallback = this.subagentEventCallback;
|
|
6612
|
+
onSubagentEvent = (event) => {
|
|
6504
6613
|
parentCallback({
|
|
6505
6614
|
...event,
|
|
6506
6615
|
gadgetInvocationId: invocationId,
|
|
@@ -6535,7 +6644,7 @@ ${endPrefix}`
|
|
|
6535
6644
|
compactionConfig: this.compactionConfig,
|
|
6536
6645
|
signal: this.signal,
|
|
6537
6646
|
subagentConfig: this.subagentConfig,
|
|
6538
|
-
|
|
6647
|
+
onSubagentEvent
|
|
6539
6648
|
};
|
|
6540
6649
|
return new Agent(AGENT_INTERNAL_KEY, options);
|
|
6541
6650
|
}
|
|
@@ -8030,6 +8139,9 @@ var init_gemini = __esm({
|
|
|
8030
8139
|
async countTokens(messages, descriptor, _spec) {
|
|
8031
8140
|
const client = this.client;
|
|
8032
8141
|
const contents = this.convertMessagesToContents(messages);
|
|
8142
|
+
if (!contents || contents.length === 0) {
|
|
8143
|
+
return 0;
|
|
8144
|
+
}
|
|
8033
8145
|
try {
|
|
8034
8146
|
const response = await client.models.countTokens({
|
|
8035
8147
|
model: descriptor.name,
|
|
@@ -11595,4 +11707,4 @@ export {
|
|
|
11595
11707
|
createEmptyStream,
|
|
11596
11708
|
createErrorStream
|
|
11597
11709
|
};
|
|
11598
|
-
//# sourceMappingURL=chunk-
|
|
11710
|
+
//# sourceMappingURL=chunk-3SZIQI45.js.map
|