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.
@@ -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, onNestedEvent) {
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.onNestedEvent = onNestedEvent;
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
- onNestedEvent: this.onNestedEvent
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.onNestedEvent
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
- // Nested event callback for subagent gadgets
4908
- onNestedEvent;
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.onNestedEvent = options.onNestedEvent;
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
- onNestedEvent: this.onNestedEvent
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
- nestedEventCallback;
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 nested subagent events.
6110
+ * Set the callback for subagent events.
6041
6111
  *
6042
- * Subagent gadgets (like BrowseWeb) can use ExecutionContext.onNestedEvent
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 nested agent events
6116
+ * @param callback - Function to handle subagent events
6047
6117
  * @returns This builder for chaining
6048
6118
  *
6049
6119
  * @example
6050
6120
  * ```typescript
6051
- * .withNestedEventCallback((event) => {
6121
+ * .withSubagentEventCallback((event) => {
6052
6122
  * if (event.type === "llm_call_start") {
6053
- * console.log(` Nested LLM #${event.event.iteration} starting...`);
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
- withNestedEventCallback(callback) {
6061
- this.nestedEventCallback = callback;
6130
+ withSubagentEventCallback(callback) {
6131
+ this.subagentEventCallback = callback;
6062
6132
  return this;
6063
6133
  }
6064
6134
  /**
6065
- * Enable automatic nested event forwarding to parent agent.
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 `onNestedEvent` from the execution
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.onNestedEvent && ctx.invocationId) {
6168
+ if (ctx.onSubagentEvent && ctx.invocationId) {
6099
6169
  this.parentContext = {
6100
6170
  invocationId: ctx.invocationId,
6101
- onNestedEvent: ctx.onNestedEvent,
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
- * - Nested event forwarding for LLM calls (if parentContext is set)
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, onNestedEvent, depth } = this.parentContext;
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
- onNestedEvent({
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
- onNestedEvent({
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 onNestedEvent = this.nestedEventCallback;
6412
+ let onSubagentEvent = this.subagentEventCallback;
6304
6413
  if (this.parentContext) {
6305
- const { invocationId, onNestedEvent: parentCallback, depth } = this.parentContext;
6306
- const existingCallback = this.nestedEventCallback;
6307
- onNestedEvent = (event) => {
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
- onNestedEvent
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 onNestedEvent = this.nestedEventCallback;
6608
+ let onSubagentEvent = this.subagentEventCallback;
6500
6609
  if (this.parentContext) {
6501
- const { invocationId, onNestedEvent: parentCallback, depth } = this.parentContext;
6502
- const existingCallback = this.nestedEventCallback;
6503
- onNestedEvent = (event) => {
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
- onNestedEvent
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-JCFPJMRQ.js.map
11710
+ //# sourceMappingURL=chunk-3SZIQI45.js.map