@jaypie/llm 1.3.7 → 1.3.9

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 (183) hide show
  1. package/dist/cjs/{src/constants.d.ts → constants.d.ts} +4 -4
  2. package/dist/cjs/index.cjs +116 -29
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/cjs/index.d.cts +28 -8
  5. package/dist/{esm/src → cjs}/operate/hooks/HookRunner.d.ts +3 -0
  6. package/dist/cjs/{src/operate → operate}/types.d.ts +2 -0
  7. package/dist/{esm/src → cjs}/tools/Toolkit.class.d.ts +13 -1
  8. package/dist/{esm/src → cjs}/types/LlmProvider.interface.d.ts +11 -3
  9. package/dist/cjs/{src/util → util}/index.d.ts +1 -0
  10. package/dist/cjs/util/tallyOperate.d.ts +14 -0
  11. package/dist/esm/{src/constants.d.ts → constants.d.ts} +4 -4
  12. package/dist/esm/index.d.ts +28 -8
  13. package/dist/esm/index.js +116 -29
  14. package/dist/esm/index.js.map +1 -1
  15. package/dist/{cjs/src → esm}/operate/hooks/HookRunner.d.ts +3 -0
  16. package/dist/esm/{src/operate → operate}/types.d.ts +2 -0
  17. package/dist/{cjs/src → esm}/tools/Toolkit.class.d.ts +13 -1
  18. package/dist/{cjs/src → esm}/types/LlmProvider.interface.d.ts +11 -3
  19. package/dist/esm/{src/util → util}/index.d.ts +1 -0
  20. package/dist/esm/util/tallyOperate.d.ts +14 -0
  21. package/package.json +1 -1
  22. package/dist/esm/src/index.d.ts +0 -17
  23. /package/dist/cjs/{src/Llm.d.ts → Llm.d.ts} +0 -0
  24. /package/dist/cjs/{src/index.d.ts → index.d.ts} +0 -0
  25. /package/dist/cjs/{src/observability → observability}/llmobs.d.ts +0 -0
  26. /package/dist/cjs/{src/operate → operate}/OperateLoop.d.ts +0 -0
  27. /package/dist/cjs/{src/operate → operate}/StreamLoop.d.ts +0 -0
  28. /package/dist/cjs/{src/operate → operate}/adapters/AnthropicAdapter.d.ts +0 -0
  29. /package/dist/cjs/{src/operate → operate}/adapters/BedrockAdapter.d.ts +0 -0
  30. /package/dist/cjs/{src/operate → operate}/adapters/GoogleAdapter.d.ts +0 -0
  31. /package/dist/cjs/{src/operate → operate}/adapters/OpenAiAdapter.d.ts +0 -0
  32. /package/dist/cjs/{src/operate → operate}/adapters/OpenRouterAdapter.d.ts +0 -0
  33. /package/dist/cjs/{src/operate → operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
  34. /package/dist/cjs/{src/operate → operate}/adapters/XaiAdapter.d.ts +0 -0
  35. /package/dist/cjs/{src/operate → operate}/adapters/index.d.ts +0 -0
  36. /package/dist/cjs/{src/operate → operate}/hooks/index.d.ts +0 -0
  37. /package/dist/cjs/{src/operate → operate}/index.d.ts +0 -0
  38. /package/dist/cjs/{src/operate → operate}/input/InputProcessor.d.ts +0 -0
  39. /package/dist/cjs/{src/operate → operate}/input/index.d.ts +0 -0
  40. /package/dist/cjs/{src/operate → operate}/progress/emitProgress.d.ts +0 -0
  41. /package/dist/cjs/{src/operate → operate}/progress/index.d.ts +0 -0
  42. /package/dist/cjs/{src/operate → operate}/response/ResponseBuilder.d.ts +0 -0
  43. /package/dist/cjs/{src/operate → operate}/response/index.d.ts +0 -0
  44. /package/dist/cjs/{src/operate → operate}/retry/RetryExecutor.d.ts +0 -0
  45. /package/dist/cjs/{src/operate → operate}/retry/RetryPolicy.d.ts +0 -0
  46. /package/dist/cjs/{src/operate → operate}/retry/createStaleRejectionGuard.d.ts +0 -0
  47. /package/dist/cjs/{src/operate → operate}/retry/index.d.ts +0 -0
  48. /package/dist/cjs/{src/operate → operate}/retry/isTransientNetworkError.d.ts +0 -0
  49. /package/dist/cjs/{src/providers → providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
  50. /package/dist/cjs/{src/providers → providers}/anthropic/client.d.ts +0 -0
  51. /package/dist/cjs/{src/providers → providers}/anthropic/index.d.ts +0 -0
  52. /package/dist/cjs/{src/providers → providers}/anthropic/types.d.ts +0 -0
  53. /package/dist/cjs/{src/providers → providers}/anthropic/utils.d.ts +0 -0
  54. /package/dist/cjs/{src/providers → providers}/bedrock/BedrockProvider.class.d.ts +0 -0
  55. /package/dist/cjs/{src/providers → providers}/bedrock/index.d.ts +0 -0
  56. /package/dist/cjs/{src/providers → providers}/bedrock/utils.d.ts +0 -0
  57. /package/dist/cjs/{src/providers → providers}/google/GoogleProvider.class.d.ts +0 -0
  58. /package/dist/cjs/{src/providers → providers}/google/client.d.ts +0 -0
  59. /package/dist/cjs/{src/providers → providers}/google/index.d.ts +0 -0
  60. /package/dist/cjs/{src/providers → providers}/google/types.d.ts +0 -0
  61. /package/dist/cjs/{src/providers → providers}/google/utils.d.ts +0 -0
  62. /package/dist/cjs/{src/providers → providers}/openai/OpenAiProvider.class.d.ts +0 -0
  63. /package/dist/cjs/{src/providers → providers}/openai/client.d.ts +0 -0
  64. /package/dist/cjs/{src/providers → providers}/openai/index.d.ts +0 -0
  65. /package/dist/cjs/{src/providers → providers}/openai/responseFormat.d.ts +0 -0
  66. /package/dist/cjs/{src/providers → providers}/openai/types.d.ts +0 -0
  67. /package/dist/cjs/{src/providers → providers}/openai/utils.d.ts +0 -0
  68. /package/dist/cjs/{src/providers → providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
  69. /package/dist/cjs/{src/providers → providers}/openrouter/client.d.ts +0 -0
  70. /package/dist/cjs/{src/providers → providers}/openrouter/index.d.ts +0 -0
  71. /package/dist/cjs/{src/providers → providers}/openrouter/utils.d.ts +0 -0
  72. /package/dist/cjs/{src/providers → providers}/xai/XaiProvider.class.d.ts +0 -0
  73. /package/dist/cjs/{src/providers → providers}/xai/index.d.ts +0 -0
  74. /package/dist/cjs/{src/providers → providers}/xai/utils.d.ts +0 -0
  75. /package/dist/cjs/{src/tools → tools}/index.d.ts +0 -0
  76. /package/dist/cjs/{src/tools → tools}/random.d.ts +0 -0
  77. /package/dist/cjs/{src/tools → tools}/roll.d.ts +0 -0
  78. /package/dist/cjs/{src/tools → tools}/time.d.ts +0 -0
  79. /package/dist/cjs/{src/tools → tools}/weather.d.ts +0 -0
  80. /package/dist/cjs/{src/types → types}/LlmOperateInput.guards.d.ts +0 -0
  81. /package/dist/cjs/{src/types → types}/LlmStreamChunk.interface.d.ts +0 -0
  82. /package/dist/cjs/{src/types → types}/LlmTool.interface.d.ts +0 -0
  83. /package/dist/cjs/{src/upload → upload}/detectMimeType.d.ts +0 -0
  84. /package/dist/cjs/{src/upload → upload}/extractPdfPages.d.ts +0 -0
  85. /package/dist/cjs/{src/upload → upload}/index.d.ts +0 -0
  86. /package/dist/cjs/{src/upload → upload}/loadLocalFile.d.ts +0 -0
  87. /package/dist/cjs/{src/upload → upload}/loadS3File.d.ts +0 -0
  88. /package/dist/cjs/{src/upload → upload}/resolveOperateInput.d.ts +0 -0
  89. /package/dist/cjs/{src/util → util}/determineModelProvider.d.ts +0 -0
  90. /package/dist/cjs/{src/util → util}/extractReasoning.d.ts +0 -0
  91. /package/dist/cjs/{src/util → util}/fillFormatArrays.d.ts +0 -0
  92. /package/dist/cjs/{src/util → util}/formatOperateInput.d.ts +0 -0
  93. /package/dist/cjs/{src/util → util}/formatOperateMessage.d.ts +0 -0
  94. /package/dist/cjs/{src/util → util}/jsonSchema.d.ts +0 -0
  95. /package/dist/cjs/{src/util → util}/jsonSchemaToOpenApi3.d.ts +0 -0
  96. /package/dist/cjs/{src/util → util}/logger.d.ts +0 -0
  97. /package/dist/cjs/{src/util → util}/maxOutputTokens.d.ts +0 -0
  98. /package/dist/cjs/{src/util → util}/maxTurnsFromOptions.d.ts +0 -0
  99. /package/dist/cjs/{src/util → util}/naturalZodSchema.d.ts +0 -0
  100. /package/dist/cjs/{src/util → util}/random.d.ts +0 -0
  101. /package/dist/cjs/{src/util → util}/repairFormatKeys.d.ts +0 -0
  102. /package/dist/cjs/{src/util → util}/sse.d.ts +0 -0
  103. /package/dist/cjs/{src/util → util}/tryParseNumber.d.ts +0 -0
  104. /package/dist/esm/{src/Llm.d.ts → Llm.d.ts} +0 -0
  105. /package/dist/esm/{src/observability → observability}/llmobs.d.ts +0 -0
  106. /package/dist/esm/{src/operate → operate}/OperateLoop.d.ts +0 -0
  107. /package/dist/esm/{src/operate → operate}/StreamLoop.d.ts +0 -0
  108. /package/dist/esm/{src/operate → operate}/adapters/AnthropicAdapter.d.ts +0 -0
  109. /package/dist/esm/{src/operate → operate}/adapters/BedrockAdapter.d.ts +0 -0
  110. /package/dist/esm/{src/operate → operate}/adapters/GoogleAdapter.d.ts +0 -0
  111. /package/dist/esm/{src/operate → operate}/adapters/OpenAiAdapter.d.ts +0 -0
  112. /package/dist/esm/{src/operate → operate}/adapters/OpenRouterAdapter.d.ts +0 -0
  113. /package/dist/esm/{src/operate → operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
  114. /package/dist/esm/{src/operate → operate}/adapters/XaiAdapter.d.ts +0 -0
  115. /package/dist/esm/{src/operate → operate}/adapters/index.d.ts +0 -0
  116. /package/dist/esm/{src/operate → operate}/hooks/index.d.ts +0 -0
  117. /package/dist/esm/{src/operate → operate}/index.d.ts +0 -0
  118. /package/dist/esm/{src/operate → operate}/input/InputProcessor.d.ts +0 -0
  119. /package/dist/esm/{src/operate → operate}/input/index.d.ts +0 -0
  120. /package/dist/esm/{src/operate → operate}/progress/emitProgress.d.ts +0 -0
  121. /package/dist/esm/{src/operate → operate}/progress/index.d.ts +0 -0
  122. /package/dist/esm/{src/operate → operate}/response/ResponseBuilder.d.ts +0 -0
  123. /package/dist/esm/{src/operate → operate}/response/index.d.ts +0 -0
  124. /package/dist/esm/{src/operate → operate}/retry/RetryExecutor.d.ts +0 -0
  125. /package/dist/esm/{src/operate → operate}/retry/RetryPolicy.d.ts +0 -0
  126. /package/dist/esm/{src/operate → operate}/retry/createStaleRejectionGuard.d.ts +0 -0
  127. /package/dist/esm/{src/operate → operate}/retry/index.d.ts +0 -0
  128. /package/dist/esm/{src/operate → operate}/retry/isTransientNetworkError.d.ts +0 -0
  129. /package/dist/esm/{src/providers → providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
  130. /package/dist/esm/{src/providers → providers}/anthropic/client.d.ts +0 -0
  131. /package/dist/esm/{src/providers → providers}/anthropic/index.d.ts +0 -0
  132. /package/dist/esm/{src/providers → providers}/anthropic/types.d.ts +0 -0
  133. /package/dist/esm/{src/providers → providers}/anthropic/utils.d.ts +0 -0
  134. /package/dist/esm/{src/providers → providers}/bedrock/BedrockProvider.class.d.ts +0 -0
  135. /package/dist/esm/{src/providers → providers}/bedrock/index.d.ts +0 -0
  136. /package/dist/esm/{src/providers → providers}/bedrock/utils.d.ts +0 -0
  137. /package/dist/esm/{src/providers → providers}/google/GoogleProvider.class.d.ts +0 -0
  138. /package/dist/esm/{src/providers → providers}/google/client.d.ts +0 -0
  139. /package/dist/esm/{src/providers → providers}/google/index.d.ts +0 -0
  140. /package/dist/esm/{src/providers → providers}/google/types.d.ts +0 -0
  141. /package/dist/esm/{src/providers → providers}/google/utils.d.ts +0 -0
  142. /package/dist/esm/{src/providers → providers}/openai/OpenAiProvider.class.d.ts +0 -0
  143. /package/dist/esm/{src/providers → providers}/openai/client.d.ts +0 -0
  144. /package/dist/esm/{src/providers → providers}/openai/index.d.ts +0 -0
  145. /package/dist/esm/{src/providers → providers}/openai/responseFormat.d.ts +0 -0
  146. /package/dist/esm/{src/providers → providers}/openai/types.d.ts +0 -0
  147. /package/dist/esm/{src/providers → providers}/openai/utils.d.ts +0 -0
  148. /package/dist/esm/{src/providers → providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
  149. /package/dist/esm/{src/providers → providers}/openrouter/client.d.ts +0 -0
  150. /package/dist/esm/{src/providers → providers}/openrouter/index.d.ts +0 -0
  151. /package/dist/esm/{src/providers → providers}/openrouter/utils.d.ts +0 -0
  152. /package/dist/esm/{src/providers → providers}/xai/XaiProvider.class.d.ts +0 -0
  153. /package/dist/esm/{src/providers → providers}/xai/index.d.ts +0 -0
  154. /package/dist/esm/{src/providers → providers}/xai/utils.d.ts +0 -0
  155. /package/dist/esm/{src/tools → tools}/index.d.ts +0 -0
  156. /package/dist/esm/{src/tools → tools}/random.d.ts +0 -0
  157. /package/dist/esm/{src/tools → tools}/roll.d.ts +0 -0
  158. /package/dist/esm/{src/tools → tools}/time.d.ts +0 -0
  159. /package/dist/esm/{src/tools → tools}/weather.d.ts +0 -0
  160. /package/dist/esm/{src/types → types}/LlmOperateInput.guards.d.ts +0 -0
  161. /package/dist/esm/{src/types → types}/LlmStreamChunk.interface.d.ts +0 -0
  162. /package/dist/esm/{src/types → types}/LlmTool.interface.d.ts +0 -0
  163. /package/dist/esm/{src/upload → upload}/detectMimeType.d.ts +0 -0
  164. /package/dist/esm/{src/upload → upload}/extractPdfPages.d.ts +0 -0
  165. /package/dist/esm/{src/upload → upload}/index.d.ts +0 -0
  166. /package/dist/esm/{src/upload → upload}/loadLocalFile.d.ts +0 -0
  167. /package/dist/esm/{src/upload → upload}/loadS3File.d.ts +0 -0
  168. /package/dist/esm/{src/upload → upload}/resolveOperateInput.d.ts +0 -0
  169. /package/dist/esm/{src/util → util}/determineModelProvider.d.ts +0 -0
  170. /package/dist/esm/{src/util → util}/extractReasoning.d.ts +0 -0
  171. /package/dist/esm/{src/util → util}/fillFormatArrays.d.ts +0 -0
  172. /package/dist/esm/{src/util → util}/formatOperateInput.d.ts +0 -0
  173. /package/dist/esm/{src/util → util}/formatOperateMessage.d.ts +0 -0
  174. /package/dist/esm/{src/util → util}/jsonSchema.d.ts +0 -0
  175. /package/dist/esm/{src/util → util}/jsonSchemaToOpenApi3.d.ts +0 -0
  176. /package/dist/esm/{src/util → util}/logger.d.ts +0 -0
  177. /package/dist/esm/{src/util → util}/maxOutputTokens.d.ts +0 -0
  178. /package/dist/esm/{src/util → util}/maxTurnsFromOptions.d.ts +0 -0
  179. /package/dist/esm/{src/util → util}/naturalZodSchema.d.ts +0 -0
  180. /package/dist/esm/{src/util → util}/random.d.ts +0 -0
  181. /package/dist/esm/{src/util → util}/repairFormatKeys.d.ts +0 -0
  182. /package/dist/esm/{src/util → util}/sse.d.ts +0 -0
  183. /package/dist/esm/{src/util → util}/tryParseNumber.d.ts +0 -0
@@ -3,10 +3,10 @@ import { JsonObject, AnyValue, NaturalMap, NaturalSchema, JsonReturn } from '@ja
3
3
  import { z } from 'zod/v4';
4
4
 
5
5
  declare const MODEL: {
6
+ FABLE: string;
6
7
  OPUS: string;
7
8
  SONNET: string;
8
9
  HAIKU: string;
9
- FABLE: string;
10
10
  MYTHOS: string;
11
11
  GEMINI_FLASH: string;
12
12
  GEMINI_FLASH_LITE: string;
@@ -113,7 +113,7 @@ declare const PROVIDER: {
113
113
  readonly BASE_URL: "https://api.x.ai/v1";
114
114
  readonly MODEL: {
115
115
  readonly DEFAULT: "grok-latest";
116
- readonly LARGE: "grok-4.3-latest";
116
+ readonly LARGE: "grok-latest";
117
117
  readonly SMALL: "grok-4-1-fast-reasoning";
118
118
  readonly TINY: "grok-4-1-fast-non-reasoning";
119
119
  };
@@ -142,8 +142,8 @@ declare const DEFAULT: {
142
142
  };
143
143
  declare const ALL: {
144
144
  readonly BASE: readonly ["claude-sonnet-4-6", "gemini-3.1-pro-preview", "gpt-5.4", "grok-latest"];
145
- readonly COMBINED: readonly ("claude-opus-4-8" | "claude-sonnet-4-6" | "claude-haiku-4-5" | "gemini-3.5-flash" | "gemini-3.1-flash-lite" | "gemini-3.1-pro-preview" | "gpt-5.5" | "gpt-5.4-mini" | "gpt-5.4-nano" | "grok-latest" | "gpt-5.4" | "grok-4.3-latest" | "grok-4-1-fast-reasoning" | "grok-4-1-fast-non-reasoning")[];
146
- readonly LARGE: readonly ["claude-opus-4-8", "gemini-3.1-pro-preview", "gpt-5.5", "grok-4.3-latest"];
145
+ readonly COMBINED: readonly ("claude-opus-4-8" | "claude-haiku-4-5" | "gemini-3.5-flash" | "gemini-3.1-flash-lite" | "gemini-3.1-pro-preview" | "gpt-5.5" | "gpt-5.4-mini" | "gpt-5.4-nano" | "grok-latest" | "claude-sonnet-4-6" | "gpt-5.4" | "grok-4-1-fast-reasoning" | "grok-4-1-fast-non-reasoning")[];
146
+ readonly LARGE: readonly ["claude-opus-4-8", "gemini-3.1-pro-preview", "gpt-5.5", "grok-latest"];
147
147
  readonly SMALL: readonly ["claude-sonnet-4-6", "gemini-3.5-flash", "gpt-5.4-mini", "grok-4-1-fast-reasoning"];
148
148
  readonly TINY: readonly ["claude-haiku-4-5", "gemini-3.1-flash-lite", "gpt-5.4-nano", "grok-4-1-fast-non-reasoning"];
149
149
  };
@@ -227,9 +227,21 @@ declare class Toolkit {
227
227
  private readonly log;
228
228
  constructor(tools: LlmTool[], options?: ToolkitOptions);
229
229
  get tools(): Omit<LlmTool, "call">[];
230
- call({ name, arguments: args }: {
230
+ private parseArgs;
231
+ /**
232
+ * Resolve a tool's `message` (static string or function of args) without
233
+ * calling the tool. Returns undefined when the tool is missing or defines
234
+ * no message. Never throws; resolution errors log at warn.
235
+ */
236
+ resolveMessage({ name, arguments: args, }: {
237
+ name: string;
238
+ arguments: string;
239
+ }): Promise<string | undefined>;
240
+ call({ name, arguments: args, message: resolvedMessage, }: {
231
241
  name: string;
232
242
  arguments: string;
243
+ /** Pre-resolved tool message; skips re-resolving `tool.message` for logging */
244
+ message?: string;
233
245
  }): Promise<_jaypie_types.AnyValue>;
234
246
  extend(tools: LlmTool[], options?: {
235
247
  warn?: boolean;
@@ -415,6 +427,8 @@ declare enum LlmProgressEventType {
415
427
  interface LlmProgressToolCall {
416
428
  /** JSON string of arguments (tool_call events only) */
417
429
  arguments?: string;
430
+ /** Resolved `LlmTool.message`, when the tool defines one (tool_call events only) */
431
+ message?: string;
418
432
  /** Tool name */
419
433
  name: string;
420
434
  }
@@ -461,19 +475,23 @@ interface LlmOperateOptions {
461
475
  content: string | JsonObject;
462
476
  usage: LlmUsage;
463
477
  }) => unknown | Promise<unknown>;
464
- afterEachTool?: ({ result, toolName, args, }: {
478
+ afterEachTool?: ({ result, toolName, args, message, }: {
465
479
  result: unknown;
466
480
  toolName: string;
467
481
  args: string;
482
+ /** Resolved `LlmTool.message`, when the tool defines one */
483
+ message?: string;
468
484
  }) => unknown | Promise<unknown>;
469
485
  beforeEachModelRequest?: ({ input, options, providerRequest, }: {
470
486
  input: string | LlmHistory | LlmInputMessage;
471
487
  options?: LlmOperateOptions;
472
488
  providerRequest: any;
473
489
  }) => unknown | Promise<unknown>;
474
- beforeEachTool?: ({ toolName, args, }: {
490
+ beforeEachTool?: ({ toolName, args, message, }: {
475
491
  toolName: string;
476
492
  args: string;
493
+ /** Resolved `LlmTool.message`, when the tool defines one */
494
+ message?: string;
477
495
  }) => unknown | Promise<unknown>;
478
496
  onRetryableModelError?: ({ input, options, providerRequest, error, }: {
479
497
  input: string | LlmHistory | LlmInputMessage;
@@ -481,10 +499,12 @@ interface LlmOperateOptions {
481
499
  providerRequest: any;
482
500
  error: any;
483
501
  }) => unknown | Promise<unknown>;
484
- onToolError?: ({ error, toolName, args, }: {
502
+ onToolError?: ({ error, toolName, args, message, }: {
485
503
  error: Error;
486
504
  toolName: string;
487
505
  args: string;
506
+ /** Resolved `LlmTool.message`, when the tool defines one */
507
+ message?: string;
488
508
  }) => unknown | Promise<unknown>;
489
509
  onUnrecoverableModelError?: ({ input, options, providerRequest, error, }: {
490
510
  input: string | LlmHistory | LlmInputMessage;
@@ -15,16 +15,19 @@ export interface AfterModelResponseContext {
15
15
  }
16
16
  export interface BeforeToolContext {
17
17
  args: string;
18
+ message?: string;
18
19
  toolName: string;
19
20
  }
20
21
  export interface AfterToolContext {
21
22
  args: string;
23
+ message?: string;
22
24
  result: unknown;
23
25
  toolName: string;
24
26
  }
25
27
  export interface ToolErrorContext {
26
28
  args: string;
27
29
  error: Error;
30
+ message?: string;
28
31
  toolName: string;
29
32
  }
30
33
  export interface RetryableErrorContext {
@@ -133,6 +133,8 @@ export interface OperateLoopState {
133
133
  maxTurns: number;
134
134
  /** Response builder instance */
135
135
  responseBuilder: ResponseBuilder;
136
+ /** Names of tool calls executed across all turns (report tally) */
137
+ toolCallNames: string[];
136
138
  /** The toolkit for tool calls */
137
139
  toolkit?: Toolkit;
138
140
  }
@@ -14,9 +14,21 @@ export declare class Toolkit {
14
14
  private readonly log;
15
15
  constructor(tools: LlmTool[], options?: ToolkitOptions);
16
16
  get tools(): Omit<LlmTool, "call">[];
17
- call({ name, arguments: args }: {
17
+ private parseArgs;
18
+ /**
19
+ * Resolve a tool's `message` (static string or function of args) without
20
+ * calling the tool. Returns undefined when the tool is missing or defines
21
+ * no message. Never throws; resolution errors log at warn.
22
+ */
23
+ resolveMessage({ name, arguments: args, }: {
18
24
  name: string;
19
25
  arguments: string;
26
+ }): Promise<string | undefined>;
27
+ call({ name, arguments: args, message: resolvedMessage, }: {
28
+ name: string;
29
+ arguments: string;
30
+ /** Pre-resolved tool message; skips re-resolving `tool.message` for logging */
31
+ message?: string;
20
32
  }): Promise<import("@jaypie/types").AnyValue>;
21
33
  extend(tools: LlmTool[], options?: {
22
34
  warn?: boolean;
@@ -179,6 +179,8 @@ export declare enum LlmProgressEventType {
179
179
  export interface LlmProgressToolCall {
180
180
  /** JSON string of arguments (tool_call events only) */
181
181
  arguments?: string;
182
+ /** Resolved `LlmTool.message`, when the tool defines one (tool_call events only) */
183
+ message?: string;
182
184
  /** Tool name */
183
185
  name: string;
184
186
  }
@@ -225,19 +227,23 @@ export interface LlmOperateOptions {
225
227
  content: string | JsonObject;
226
228
  usage: LlmUsage;
227
229
  }) => unknown | Promise<unknown>;
228
- afterEachTool?: ({ result, toolName, args, }: {
230
+ afterEachTool?: ({ result, toolName, args, message, }: {
229
231
  result: unknown;
230
232
  toolName: string;
231
233
  args: string;
234
+ /** Resolved `LlmTool.message`, when the tool defines one */
235
+ message?: string;
232
236
  }) => unknown | Promise<unknown>;
233
237
  beforeEachModelRequest?: ({ input, options, providerRequest, }: {
234
238
  input: string | LlmHistory | LlmInputMessage;
235
239
  options?: LlmOperateOptions;
236
240
  providerRequest: any;
237
241
  }) => unknown | Promise<unknown>;
238
- beforeEachTool?: ({ toolName, args, }: {
242
+ beforeEachTool?: ({ toolName, args, message, }: {
239
243
  toolName: string;
240
244
  args: string;
245
+ /** Resolved `LlmTool.message`, when the tool defines one */
246
+ message?: string;
241
247
  }) => unknown | Promise<unknown>;
242
248
  onRetryableModelError?: ({ input, options, providerRequest, error, }: {
243
249
  input: string | LlmHistory | LlmInputMessage;
@@ -245,10 +251,12 @@ export interface LlmOperateOptions {
245
251
  providerRequest: any;
246
252
  error: any;
247
253
  }) => unknown | Promise<unknown>;
248
- onToolError?: ({ error, toolName, args, }: {
254
+ onToolError?: ({ error, toolName, args, message, }: {
249
255
  error: Error;
250
256
  toolName: string;
251
257
  args: string;
258
+ /** Resolved `LlmTool.message`, when the tool defines one */
259
+ message?: string;
252
260
  }) => unknown | Promise<unknown>;
253
261
  onUnrecoverableModelError?: ({ input, options, providerRequest, error, }: {
254
262
  input: string | LlmHistory | LlmInputMessage;
@@ -12,4 +12,5 @@ export * from "./naturalZodSchema.js";
12
12
  export * from "./random.js";
13
13
  export * from "./repairFormatKeys.js";
14
14
  export * from "./sse.js";
15
+ export * from "./tallyOperate.js";
15
16
  export * from "./tryParseNumber.js";
@@ -0,0 +1,14 @@
1
+ import { LlmUsageItem } from "../types/LlmProvider.interface.js";
2
+ interface TallyOperateOptions {
3
+ toolCallNames?: string[];
4
+ turns: number;
5
+ usage?: LlmUsageItem[];
6
+ }
7
+ /**
8
+ * Tally loop totals onto the root logger's report session so handlers
9
+ * (express, lambda) include llm activity in the report emitted at teardown.
10
+ * Silently no-ops outside an active session or when the logger predates
11
+ * tally support.
12
+ */
13
+ export declare function tallyOperate({ toolCallNames, turns, usage, }: TallyOperateOptions): void;
14
+ export {};
@@ -1,8 +1,8 @@
1
1
  export declare const MODEL: {
2
+ FABLE: string;
2
3
  OPUS: string;
3
4
  SONNET: string;
4
5
  HAIKU: string;
5
- FABLE: string;
6
6
  MYTHOS: string;
7
7
  GEMINI_FLASH: string;
8
8
  GEMINI_FLASH_LITE: string;
@@ -109,7 +109,7 @@ export declare const PROVIDER: {
109
109
  readonly BASE_URL: "https://api.x.ai/v1";
110
110
  readonly MODEL: {
111
111
  readonly DEFAULT: "grok-latest";
112
- readonly LARGE: "grok-4.3-latest";
112
+ readonly LARGE: "grok-latest";
113
113
  readonly SMALL: "grok-4-1-fast-reasoning";
114
114
  readonly TINY: "grok-4-1-fast-non-reasoning";
115
115
  };
@@ -138,8 +138,8 @@ export declare const DEFAULT: {
138
138
  };
139
139
  export declare const ALL: {
140
140
  readonly BASE: readonly ["claude-sonnet-4-6", "gemini-3.1-pro-preview", "gpt-5.4", "grok-latest"];
141
- readonly COMBINED: readonly ("claude-sonnet-4-6" | "claude-opus-4-8" | "claude-haiku-4-5" | "gemini-3.1-pro-preview" | "gemini-3.5-flash" | "gemini-3.1-flash-lite" | "gpt-5.4" | "gpt-5.5" | "gpt-5.4-mini" | "gpt-5.4-nano" | "grok-latest" | "grok-4.3-latest" | "grok-4-1-fast-reasoning" | "grok-4-1-fast-non-reasoning")[];
142
- readonly LARGE: readonly ["claude-opus-4-8", "gemini-3.1-pro-preview", "gpt-5.5", "grok-4.3-latest"];
141
+ readonly COMBINED: readonly ("claude-sonnet-4-6" | "claude-opus-4-8" | "claude-haiku-4-5" | "gemini-3.1-pro-preview" | "gemini-3.5-flash" | "gemini-3.1-flash-lite" | "gpt-5.4" | "gpt-5.5" | "gpt-5.4-mini" | "gpt-5.4-nano" | "grok-latest" | "grok-4-1-fast-reasoning" | "grok-4-1-fast-non-reasoning")[];
142
+ readonly LARGE: readonly ["claude-opus-4-8", "gemini-3.1-pro-preview", "gpt-5.5", "grok-latest"];
143
143
  readonly SMALL: readonly ["claude-sonnet-4-6", "gemini-3.5-flash", "gpt-5.4-mini", "grok-4-1-fast-reasoning"];
144
144
  readonly TINY: readonly ["claude-haiku-4-5", "gemini-3.1-flash-lite", "gpt-5.4-nano", "grok-4-1-fast-non-reasoning"];
145
145
  };
@@ -3,10 +3,10 @@ import { JsonObject, AnyValue, NaturalMap, NaturalSchema, JsonReturn } from '@ja
3
3
  import { z } from 'zod/v4';
4
4
 
5
5
  declare const MODEL: {
6
+ FABLE: string;
6
7
  OPUS: string;
7
8
  SONNET: string;
8
9
  HAIKU: string;
9
- FABLE: string;
10
10
  MYTHOS: string;
11
11
  GEMINI_FLASH: string;
12
12
  GEMINI_FLASH_LITE: string;
@@ -113,7 +113,7 @@ declare const PROVIDER: {
113
113
  readonly BASE_URL: "https://api.x.ai/v1";
114
114
  readonly MODEL: {
115
115
  readonly DEFAULT: "grok-latest";
116
- readonly LARGE: "grok-4.3-latest";
116
+ readonly LARGE: "grok-latest";
117
117
  readonly SMALL: "grok-4-1-fast-reasoning";
118
118
  readonly TINY: "grok-4-1-fast-non-reasoning";
119
119
  };
@@ -142,8 +142,8 @@ declare const DEFAULT: {
142
142
  };
143
143
  declare const ALL: {
144
144
  readonly BASE: readonly ["claude-sonnet-4-6", "gemini-3.1-pro-preview", "gpt-5.4", "grok-latest"];
145
- readonly COMBINED: readonly ("claude-opus-4-8" | "claude-sonnet-4-6" | "claude-haiku-4-5" | "gemini-3.5-flash" | "gemini-3.1-flash-lite" | "gemini-3.1-pro-preview" | "gpt-5.5" | "gpt-5.4-mini" | "gpt-5.4-nano" | "grok-latest" | "gpt-5.4" | "grok-4.3-latest" | "grok-4-1-fast-reasoning" | "grok-4-1-fast-non-reasoning")[];
146
- readonly LARGE: readonly ["claude-opus-4-8", "gemini-3.1-pro-preview", "gpt-5.5", "grok-4.3-latest"];
145
+ readonly COMBINED: readonly ("claude-opus-4-8" | "claude-haiku-4-5" | "gemini-3.5-flash" | "gemini-3.1-flash-lite" | "gemini-3.1-pro-preview" | "gpt-5.5" | "gpt-5.4-mini" | "gpt-5.4-nano" | "grok-latest" | "claude-sonnet-4-6" | "gpt-5.4" | "grok-4-1-fast-reasoning" | "grok-4-1-fast-non-reasoning")[];
146
+ readonly LARGE: readonly ["claude-opus-4-8", "gemini-3.1-pro-preview", "gpt-5.5", "grok-latest"];
147
147
  readonly SMALL: readonly ["claude-sonnet-4-6", "gemini-3.5-flash", "gpt-5.4-mini", "grok-4-1-fast-reasoning"];
148
148
  readonly TINY: readonly ["claude-haiku-4-5", "gemini-3.1-flash-lite", "gpt-5.4-nano", "grok-4-1-fast-non-reasoning"];
149
149
  };
@@ -227,9 +227,21 @@ declare class Toolkit {
227
227
  private readonly log;
228
228
  constructor(tools: LlmTool[], options?: ToolkitOptions);
229
229
  get tools(): Omit<LlmTool, "call">[];
230
- call({ name, arguments: args }: {
230
+ private parseArgs;
231
+ /**
232
+ * Resolve a tool's `message` (static string or function of args) without
233
+ * calling the tool. Returns undefined when the tool is missing or defines
234
+ * no message. Never throws; resolution errors log at warn.
235
+ */
236
+ resolveMessage({ name, arguments: args, }: {
237
+ name: string;
238
+ arguments: string;
239
+ }): Promise<string | undefined>;
240
+ call({ name, arguments: args, message: resolvedMessage, }: {
231
241
  name: string;
232
242
  arguments: string;
243
+ /** Pre-resolved tool message; skips re-resolving `tool.message` for logging */
244
+ message?: string;
233
245
  }): Promise<_jaypie_types.AnyValue>;
234
246
  extend(tools: LlmTool[], options?: {
235
247
  warn?: boolean;
@@ -415,6 +427,8 @@ declare enum LlmProgressEventType {
415
427
  interface LlmProgressToolCall {
416
428
  /** JSON string of arguments (tool_call events only) */
417
429
  arguments?: string;
430
+ /** Resolved `LlmTool.message`, when the tool defines one (tool_call events only) */
431
+ message?: string;
418
432
  /** Tool name */
419
433
  name: string;
420
434
  }
@@ -461,19 +475,23 @@ interface LlmOperateOptions {
461
475
  content: string | JsonObject;
462
476
  usage: LlmUsage;
463
477
  }) => unknown | Promise<unknown>;
464
- afterEachTool?: ({ result, toolName, args, }: {
478
+ afterEachTool?: ({ result, toolName, args, message, }: {
465
479
  result: unknown;
466
480
  toolName: string;
467
481
  args: string;
482
+ /** Resolved `LlmTool.message`, when the tool defines one */
483
+ message?: string;
468
484
  }) => unknown | Promise<unknown>;
469
485
  beforeEachModelRequest?: ({ input, options, providerRequest, }: {
470
486
  input: string | LlmHistory | LlmInputMessage;
471
487
  options?: LlmOperateOptions;
472
488
  providerRequest: any;
473
489
  }) => unknown | Promise<unknown>;
474
- beforeEachTool?: ({ toolName, args, }: {
490
+ beforeEachTool?: ({ toolName, args, message, }: {
475
491
  toolName: string;
476
492
  args: string;
493
+ /** Resolved `LlmTool.message`, when the tool defines one */
494
+ message?: string;
477
495
  }) => unknown | Promise<unknown>;
478
496
  onRetryableModelError?: ({ input, options, providerRequest, error, }: {
479
497
  input: string | LlmHistory | LlmInputMessage;
@@ -481,10 +499,12 @@ interface LlmOperateOptions {
481
499
  providerRequest: any;
482
500
  error: any;
483
501
  }) => unknown | Promise<unknown>;
484
- onToolError?: ({ error, toolName, args, }: {
502
+ onToolError?: ({ error, toolName, args, message, }: {
485
503
  error: Error;
486
504
  toolName: string;
487
505
  args: string;
506
+ /** Resolved `LlmTool.message`, when the tool defines one */
507
+ message?: string;
488
508
  }) => unknown | Promise<unknown>;
489
509
  onUnrecoverableModelError?: ({ input, options, providerRequest, error, }: {
490
510
  input: string | LlmHistory | LlmInputMessage;
package/dist/esm/index.js CHANGED
@@ -36,17 +36,17 @@ const FIRST_CLASS_PROVIDER = {
36
36
  // https://docs.x.ai/developers/models
37
37
  XAI: {
38
38
  DEFAULT: "grok-latest",
39
- LARGE: "grok-4.3-latest",
39
+ LARGE: "grok-latest",
40
40
  SMALL: "grok-4-1-fast-reasoning",
41
41
  TINY: "grok-4-1-fast-non-reasoning",
42
42
  },
43
43
  };
44
44
  const MODEL = {
45
45
  // Anthropic
46
+ FABLE: "claude-fable-5",
46
47
  OPUS: "claude-opus-4-8",
47
- SONNET: "claude-sonnet-4-6",
48
+ SONNET: "claude-sonnet-5",
48
49
  HAIKU: "claude-haiku-4-5",
49
- FABLE: "claude-fable-5",
50
50
  MYTHOS: "claude-mythos-5",
51
51
  // Google
52
52
  GEMINI_FLASH: "gemini-3.5-flash",
@@ -1294,6 +1294,43 @@ async function* parseSseStream(body, { doneSentinel = DEFAULT_DONE_SENTINEL } =
1294
1294
  }
1295
1295
  }
1296
1296
 
1297
+ const UNKNOWN = "unknown";
1298
+ /**
1299
+ * Tally loop totals onto the root logger's report session so handlers
1300
+ * (express, lambda) include llm activity in the report emitted at teardown.
1301
+ * Silently no-ops outside an active session or when the logger predates
1302
+ * tally support.
1303
+ */
1304
+ function tallyOperate({ toolCallNames = [], turns, usage = [], }) {
1305
+ if (typeof log$2.tally !== "function")
1306
+ return;
1307
+ const llm = {
1308
+ operates: 1,
1309
+ toolCalls: toolCallNames.length,
1310
+ turns,
1311
+ };
1312
+ if (toolCallNames.length > 0) {
1313
+ const tools = {};
1314
+ for (const name of toolCallNames) {
1315
+ tools[name] = (tools[name] ?? 0) + 1;
1316
+ }
1317
+ llm.tools = tools;
1318
+ }
1319
+ if (usage.length > 0) {
1320
+ const usageByModel = {};
1321
+ for (const item of usage) {
1322
+ const key = [item.provider, item.model].filter(Boolean).join(":") || UNKNOWN;
1323
+ usageByModel[key] ?? (usageByModel[key] = { input: 0, output: 0, reasoning: 0, total: 0 });
1324
+ usageByModel[key].input += item.input;
1325
+ usageByModel[key].output += item.output;
1326
+ usageByModel[key].reasoning += item.reasoning;
1327
+ usageByModel[key].total += item.total;
1328
+ }
1329
+ llm.usage = usageByModel;
1330
+ }
1331
+ log$2.tally({ llm });
1332
+ }
1333
+
1297
1334
  /**
1298
1335
  * Helper function to safely call a function that might throw
1299
1336
  * @param fn Function to call safely
@@ -5417,11 +5454,7 @@ class Toolkit {
5417
5454
  return toolCopy;
5418
5455
  });
5419
5456
  }
5420
- async call({ name, arguments: args }) {
5421
- const tool = this._tools.find((t) => t.name === name);
5422
- if (!tool) {
5423
- throw new Error(`Tool '${name}' not found`);
5424
- }
5457
+ parseArgs(args) {
5425
5458
  let parsedArgs;
5426
5459
  try {
5427
5460
  parsedArgs = JSON.parse(args);
@@ -5432,35 +5465,53 @@ class Toolkit {
5432
5465
  catch {
5433
5466
  parsedArgs = args;
5434
5467
  }
5468
+ return parsedArgs;
5469
+ }
5470
+ /**
5471
+ * Resolve a tool's `message` (static string or function of args) without
5472
+ * calling the tool. Returns undefined when the tool is missing or defines
5473
+ * no message. Never throws; resolution errors log at warn.
5474
+ */
5475
+ async resolveMessage({ name, arguments: args, }) {
5476
+ const tool = this._tools.find((t) => t.name === name);
5477
+ if (!tool || !tool.message) {
5478
+ return undefined;
5479
+ }
5480
+ try {
5481
+ if (typeof tool.message === "string") {
5482
+ return tool.message;
5483
+ }
5484
+ const parsedArgs = this.parseArgs(args);
5485
+ if (typeof tool.message === "function") {
5486
+ return await resolveValue(tool.message(parsedArgs, { name }));
5487
+ }
5488
+ log.warn("[Toolkit] Tool provided unknown message type");
5489
+ return String(tool.message);
5490
+ }
5491
+ catch (error) {
5492
+ log.warn("[Toolkit] Caught error resolving tool message");
5493
+ log.var({ error });
5494
+ return undefined;
5495
+ }
5496
+ }
5497
+ async call({ name, arguments: args, message: resolvedMessage, }) {
5498
+ const tool = this._tools.find((t) => t.name === name);
5499
+ if (!tool) {
5500
+ throw new Error(`Tool '${name}' not found`);
5501
+ }
5502
+ const parsedArgs = this.parseArgs(args);
5435
5503
  if (this.log !== false) {
5436
5504
  try {
5437
5505
  const context = {
5438
5506
  name,
5439
5507
  args: parsedArgs,
5440
5508
  };
5441
- let message;
5442
5509
  if (this.explain) {
5443
5510
  context.explanation = parsedArgs.__Explanation;
5444
5511
  }
5445
- if (tool.message) {
5446
- if (typeof tool.message === "string") {
5447
- log.trace("[Toolkit] Tool provided string message");
5448
- message = tool.message;
5449
- }
5450
- else if (typeof tool.message === "function") {
5451
- log.trace("[Toolkit] Tool provided function message");
5452
- log.trace("[Toolkit] Resolving message result");
5453
- message = await resolveValue(tool.message(parsedArgs, { name }));
5454
- }
5455
- else {
5456
- log.warn("[Toolkit] Tool provided unknown message type");
5457
- message = String(tool.message);
5458
- }
5459
- }
5460
- else {
5461
- log.trace("[Toolkit] Log tool call with default message");
5462
- message = `${tool.name}:${JSON.stringify(parsedArgs)}`;
5463
- }
5512
+ const message = resolvedMessage ??
5513
+ (await this.resolveMessage({ arguments: args, name })) ??
5514
+ `${tool.name}:${JSON.stringify(parsedArgs)}`;
5464
5515
  if (typeof this.log === "function") {
5465
5516
  log.trace("[Toolkit] Log tool call with custom logger");
5466
5517
  await resolveValue(this.log(message, context));
@@ -6638,6 +6689,11 @@ class OperateLoop {
6638
6689
  metrics: usageToLlmObsMetrics(response.usage),
6639
6690
  outputData: response.content,
6640
6691
  });
6692
+ tallyOperate({
6693
+ toolCallNames: state.toolCallNames,
6694
+ turns: state.currentTurn,
6695
+ usage: response.usage,
6696
+ });
6641
6697
  await emitProgress({
6642
6698
  event: {
6643
6699
  content: response.content,
@@ -6707,6 +6763,7 @@ class OperateLoop {
6707
6763
  formattedTools,
6708
6764
  maxTurns,
6709
6765
  responseBuilder,
6766
+ toolCallNames: [],
6710
6767
  toolkit,
6711
6768
  };
6712
6769
  }
@@ -6875,10 +6932,20 @@ class OperateLoop {
6875
6932
  this.appendResponseItemsToRequest(currentProviderRequest, responseItems);
6876
6933
  // Process each tool call
6877
6934
  for (const toolCall of toolCalls) {
6935
+ state.toolCallNames.push(toolCall.name);
6936
+ // Resolved once per call; never throws (undefined when tool has no message)
6937
+ const toolMessage = await state.toolkit.resolveMessage({
6938
+ arguments: toolCall.arguments,
6939
+ name: toolCall.name,
6940
+ });
6878
6941
  try {
6879
6942
  await emitProgress({
6880
6943
  event: {
6881
- tool: { arguments: toolCall.arguments, name: toolCall.name },
6944
+ tool: {
6945
+ arguments: toolCall.arguments,
6946
+ message: toolMessage,
6947
+ name: toolCall.name,
6948
+ },
6882
6949
  turn: state.currentTurn,
6883
6950
  type: LlmProgressEventType.ToolCall,
6884
6951
  },
@@ -6887,6 +6954,7 @@ class OperateLoop {
6887
6954
  // Execute beforeEachTool hook
6888
6955
  await this.hookRunnerInstance.runBeforeTool(context.hooks, {
6889
6956
  args: toolCall.arguments,
6957
+ message: toolMessage,
6890
6958
  toolName: toolCall.name,
6891
6959
  });
6892
6960
  // Call the tool inside a child tool span (no-op when disabled)
@@ -6894,6 +6962,7 @@ class OperateLoop {
6894
6962
  const result = await withLlmObsSpan({ kind: "tool", name: toolCall.name }, async () => {
6895
6963
  const result = await state.toolkit.call({
6896
6964
  arguments: toolCall.arguments,
6965
+ message: toolMessage,
6897
6966
  name: toolCall.name,
6898
6967
  });
6899
6968
  annotateLlmObs({
@@ -6914,6 +6983,7 @@ class OperateLoop {
6914
6983
  // Execute afterEachTool hook
6915
6984
  await this.hookRunnerInstance.runAfterTool(context.hooks, {
6916
6985
  args: toolCall.arguments,
6986
+ message: toolMessage,
6917
6987
  result,
6918
6988
  toolName: toolCall.name,
6919
6989
  });
@@ -6947,6 +7017,7 @@ class OperateLoop {
6947
7017
  await this.hookRunnerInstance.runOnToolError(context.hooks, {
6948
7018
  args: toolCall.arguments,
6949
7019
  error: error,
7020
+ message: toolMessage,
6950
7021
  toolName: toolCall.name,
6951
7022
  });
6952
7023
  // Set error on response
@@ -7235,6 +7306,11 @@ class StreamLoop {
7235
7306
  }
7236
7307
  }
7237
7308
  // Emit final done chunk with accumulated usage
7309
+ tallyOperate({
7310
+ toolCallNames: state.toolCallNames,
7311
+ turns: state.currentTurn,
7312
+ usage: state.usageItems,
7313
+ });
7238
7314
  yield {
7239
7315
  type: LlmStreamChunkType.Done,
7240
7316
  usage: state.usageItems,
@@ -7275,6 +7351,7 @@ class StreamLoop {
7275
7351
  formattedFormat,
7276
7352
  formattedTools,
7277
7353
  maxTurns,
7354
+ toolCallNames: [],
7278
7355
  toolkit,
7279
7356
  usageItems: [],
7280
7357
  };
@@ -7457,10 +7534,17 @@ class StreamLoop {
7457
7534
  async *processToolCalls(toolCalls, state, context) {
7458
7535
  const log = getLogger$6();
7459
7536
  for (const toolCall of toolCalls) {
7537
+ state.toolCallNames.push(toolCall.name);
7538
+ // Resolved once per call; never throws (undefined when tool has no message)
7539
+ const toolMessage = await state.toolkit.resolveMessage({
7540
+ arguments: toolCall.arguments,
7541
+ name: toolCall.name,
7542
+ });
7460
7543
  try {
7461
7544
  // Execute beforeEachTool hook
7462
7545
  await this.hookRunnerInstance.runBeforeTool(context.hooks, {
7463
7546
  args: toolCall.arguments,
7547
+ message: toolMessage,
7464
7548
  toolName: toolCall.name,
7465
7549
  });
7466
7550
  // Call the tool inside a child tool span (no-op when disabled)
@@ -7468,6 +7552,7 @@ class StreamLoop {
7468
7552
  const result = await withLlmObsSpan({ kind: "tool", name: toolCall.name }, async () => {
7469
7553
  const result = await state.toolkit.call({
7470
7554
  arguments: toolCall.arguments,
7555
+ message: toolMessage,
7471
7556
  name: toolCall.name,
7472
7557
  });
7473
7558
  annotateLlmObs({
@@ -7480,6 +7565,7 @@ class StreamLoop {
7480
7565
  // Execute afterEachTool hook
7481
7566
  await this.hookRunnerInstance.runAfterTool(context.hooks, {
7482
7567
  args: toolCall.arguments,
7568
+ message: toolMessage,
7483
7569
  result,
7484
7570
  toolName: toolCall.name,
7485
7571
  });
@@ -7507,6 +7593,7 @@ class StreamLoop {
7507
7593
  await this.hookRunnerInstance.runOnToolError(context.hooks, {
7508
7594
  args: toolCall.arguments,
7509
7595
  error: error,
7596
+ message: toolMessage,
7510
7597
  toolName: toolCall.name,
7511
7598
  });
7512
7599
  // Yield error chunk