@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
@@ -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
  };
@@ -39,17 +39,17 @@ const FIRST_CLASS_PROVIDER = {
39
39
  // https://docs.x.ai/developers/models
40
40
  XAI: {
41
41
  DEFAULT: "grok-latest",
42
- LARGE: "grok-4.3-latest",
42
+ LARGE: "grok-latest",
43
43
  SMALL: "grok-4-1-fast-reasoning",
44
44
  TINY: "grok-4-1-fast-non-reasoning",
45
45
  },
46
46
  };
47
47
  const MODEL = {
48
48
  // Anthropic
49
+ FABLE: "claude-fable-5",
49
50
  OPUS: "claude-opus-4-8",
50
- SONNET: "claude-sonnet-4-6",
51
+ SONNET: "claude-sonnet-5",
51
52
  HAIKU: "claude-haiku-4-5",
52
- FABLE: "claude-fable-5",
53
53
  MYTHOS: "claude-mythos-5",
54
54
  // Google
55
55
  GEMINI_FLASH: "gemini-3.5-flash",
@@ -1297,6 +1297,43 @@ async function* parseSseStream(body, { doneSentinel = DEFAULT_DONE_SENTINEL } =
1297
1297
  }
1298
1298
  }
1299
1299
 
1300
+ const UNKNOWN = "unknown";
1301
+ /**
1302
+ * Tally loop totals onto the root logger's report session so handlers
1303
+ * (express, lambda) include llm activity in the report emitted at teardown.
1304
+ * Silently no-ops outside an active session or when the logger predates
1305
+ * tally support.
1306
+ */
1307
+ function tallyOperate({ toolCallNames = [], turns, usage = [], }) {
1308
+ if (typeof log$1.log.tally !== "function")
1309
+ return;
1310
+ const llm = {
1311
+ operates: 1,
1312
+ toolCalls: toolCallNames.length,
1313
+ turns,
1314
+ };
1315
+ if (toolCallNames.length > 0) {
1316
+ const tools = {};
1317
+ for (const name of toolCallNames) {
1318
+ tools[name] = (tools[name] ?? 0) + 1;
1319
+ }
1320
+ llm.tools = tools;
1321
+ }
1322
+ if (usage.length > 0) {
1323
+ const usageByModel = {};
1324
+ for (const item of usage) {
1325
+ const key = [item.provider, item.model].filter(Boolean).join(":") || UNKNOWN;
1326
+ usageByModel[key] ?? (usageByModel[key] = { input: 0, output: 0, reasoning: 0, total: 0 });
1327
+ usageByModel[key].input += item.input;
1328
+ usageByModel[key].output += item.output;
1329
+ usageByModel[key].reasoning += item.reasoning;
1330
+ usageByModel[key].total += item.total;
1331
+ }
1332
+ llm.usage = usageByModel;
1333
+ }
1334
+ log$1.log.tally({ llm });
1335
+ }
1336
+
1300
1337
  /**
1301
1338
  * Helper function to safely call a function that might throw
1302
1339
  * @param fn Function to call safely
@@ -5420,11 +5457,7 @@ class Toolkit {
5420
5457
  return toolCopy;
5421
5458
  });
5422
5459
  }
5423
- async call({ name, arguments: args }) {
5424
- const tool = this._tools.find((t) => t.name === name);
5425
- if (!tool) {
5426
- throw new Error(`Tool '${name}' not found`);
5427
- }
5460
+ parseArgs(args) {
5428
5461
  let parsedArgs;
5429
5462
  try {
5430
5463
  parsedArgs = JSON.parse(args);
@@ -5435,35 +5468,53 @@ class Toolkit {
5435
5468
  catch {
5436
5469
  parsedArgs = args;
5437
5470
  }
5471
+ return parsedArgs;
5472
+ }
5473
+ /**
5474
+ * Resolve a tool's `message` (static string or function of args) without
5475
+ * calling the tool. Returns undefined when the tool is missing or defines
5476
+ * no message. Never throws; resolution errors log at warn.
5477
+ */
5478
+ async resolveMessage({ name, arguments: args, }) {
5479
+ const tool = this._tools.find((t) => t.name === name);
5480
+ if (!tool || !tool.message) {
5481
+ return undefined;
5482
+ }
5483
+ try {
5484
+ if (typeof tool.message === "string") {
5485
+ return tool.message;
5486
+ }
5487
+ const parsedArgs = this.parseArgs(args);
5488
+ if (typeof tool.message === "function") {
5489
+ return await kit.resolveValue(tool.message(parsedArgs, { name }));
5490
+ }
5491
+ log.warn("[Toolkit] Tool provided unknown message type");
5492
+ return String(tool.message);
5493
+ }
5494
+ catch (error) {
5495
+ log.warn("[Toolkit] Caught error resolving tool message");
5496
+ log.var({ error });
5497
+ return undefined;
5498
+ }
5499
+ }
5500
+ async call({ name, arguments: args, message: resolvedMessage, }) {
5501
+ const tool = this._tools.find((t) => t.name === name);
5502
+ if (!tool) {
5503
+ throw new Error(`Tool '${name}' not found`);
5504
+ }
5505
+ const parsedArgs = this.parseArgs(args);
5438
5506
  if (this.log !== false) {
5439
5507
  try {
5440
5508
  const context = {
5441
5509
  name,
5442
5510
  args: parsedArgs,
5443
5511
  };
5444
- let message;
5445
5512
  if (this.explain) {
5446
5513
  context.explanation = parsedArgs.__Explanation;
5447
5514
  }
5448
- if (tool.message) {
5449
- if (typeof tool.message === "string") {
5450
- log.trace("[Toolkit] Tool provided string message");
5451
- message = tool.message;
5452
- }
5453
- else if (typeof tool.message === "function") {
5454
- log.trace("[Toolkit] Tool provided function message");
5455
- log.trace("[Toolkit] Resolving message result");
5456
- message = await kit.resolveValue(tool.message(parsedArgs, { name }));
5457
- }
5458
- else {
5459
- log.warn("[Toolkit] Tool provided unknown message type");
5460
- message = String(tool.message);
5461
- }
5462
- }
5463
- else {
5464
- log.trace("[Toolkit] Log tool call with default message");
5465
- message = `${tool.name}:${JSON.stringify(parsedArgs)}`;
5466
- }
5515
+ const message = resolvedMessage ??
5516
+ (await this.resolveMessage({ arguments: args, name })) ??
5517
+ `${tool.name}:${JSON.stringify(parsedArgs)}`;
5467
5518
  if (typeof this.log === "function") {
5468
5519
  log.trace("[Toolkit] Log tool call with custom logger");
5469
5520
  await kit.resolveValue(this.log(message, context));
@@ -6641,6 +6692,11 @@ class OperateLoop {
6641
6692
  metrics: usageToLlmObsMetrics(response.usage),
6642
6693
  outputData: response.content,
6643
6694
  });
6695
+ tallyOperate({
6696
+ toolCallNames: state.toolCallNames,
6697
+ turns: state.currentTurn,
6698
+ usage: response.usage,
6699
+ });
6644
6700
  await emitProgress({
6645
6701
  event: {
6646
6702
  content: response.content,
@@ -6710,6 +6766,7 @@ class OperateLoop {
6710
6766
  formattedTools,
6711
6767
  maxTurns,
6712
6768
  responseBuilder,
6769
+ toolCallNames: [],
6713
6770
  toolkit,
6714
6771
  };
6715
6772
  }
@@ -6878,10 +6935,20 @@ class OperateLoop {
6878
6935
  this.appendResponseItemsToRequest(currentProviderRequest, responseItems);
6879
6936
  // Process each tool call
6880
6937
  for (const toolCall of toolCalls) {
6938
+ state.toolCallNames.push(toolCall.name);
6939
+ // Resolved once per call; never throws (undefined when tool has no message)
6940
+ const toolMessage = await state.toolkit.resolveMessage({
6941
+ arguments: toolCall.arguments,
6942
+ name: toolCall.name,
6943
+ });
6881
6944
  try {
6882
6945
  await emitProgress({
6883
6946
  event: {
6884
- tool: { arguments: toolCall.arguments, name: toolCall.name },
6947
+ tool: {
6948
+ arguments: toolCall.arguments,
6949
+ message: toolMessage,
6950
+ name: toolCall.name,
6951
+ },
6885
6952
  turn: state.currentTurn,
6886
6953
  type: exports.LlmProgressEventType.ToolCall,
6887
6954
  },
@@ -6890,6 +6957,7 @@ class OperateLoop {
6890
6957
  // Execute beforeEachTool hook
6891
6958
  await this.hookRunnerInstance.runBeforeTool(context.hooks, {
6892
6959
  args: toolCall.arguments,
6960
+ message: toolMessage,
6893
6961
  toolName: toolCall.name,
6894
6962
  });
6895
6963
  // Call the tool inside a child tool span (no-op when disabled)
@@ -6897,6 +6965,7 @@ class OperateLoop {
6897
6965
  const result = await withLlmObsSpan({ kind: "tool", name: toolCall.name }, async () => {
6898
6966
  const result = await state.toolkit.call({
6899
6967
  arguments: toolCall.arguments,
6968
+ message: toolMessage,
6900
6969
  name: toolCall.name,
6901
6970
  });
6902
6971
  annotateLlmObs({
@@ -6917,6 +6986,7 @@ class OperateLoop {
6917
6986
  // Execute afterEachTool hook
6918
6987
  await this.hookRunnerInstance.runAfterTool(context.hooks, {
6919
6988
  args: toolCall.arguments,
6989
+ message: toolMessage,
6920
6990
  result,
6921
6991
  toolName: toolCall.name,
6922
6992
  });
@@ -6950,6 +7020,7 @@ class OperateLoop {
6950
7020
  await this.hookRunnerInstance.runOnToolError(context.hooks, {
6951
7021
  args: toolCall.arguments,
6952
7022
  error: error,
7023
+ message: toolMessage,
6953
7024
  toolName: toolCall.name,
6954
7025
  });
6955
7026
  // Set error on response
@@ -7238,6 +7309,11 @@ class StreamLoop {
7238
7309
  }
7239
7310
  }
7240
7311
  // Emit final done chunk with accumulated usage
7312
+ tallyOperate({
7313
+ toolCallNames: state.toolCallNames,
7314
+ turns: state.currentTurn,
7315
+ usage: state.usageItems,
7316
+ });
7241
7317
  yield {
7242
7318
  type: exports.LlmStreamChunkType.Done,
7243
7319
  usage: state.usageItems,
@@ -7278,6 +7354,7 @@ class StreamLoop {
7278
7354
  formattedFormat,
7279
7355
  formattedTools,
7280
7356
  maxTurns,
7357
+ toolCallNames: [],
7281
7358
  toolkit,
7282
7359
  usageItems: [],
7283
7360
  };
@@ -7460,10 +7537,17 @@ class StreamLoop {
7460
7537
  async *processToolCalls(toolCalls, state, context) {
7461
7538
  const log = getLogger$6();
7462
7539
  for (const toolCall of toolCalls) {
7540
+ state.toolCallNames.push(toolCall.name);
7541
+ // Resolved once per call; never throws (undefined when tool has no message)
7542
+ const toolMessage = await state.toolkit.resolveMessage({
7543
+ arguments: toolCall.arguments,
7544
+ name: toolCall.name,
7545
+ });
7463
7546
  try {
7464
7547
  // Execute beforeEachTool hook
7465
7548
  await this.hookRunnerInstance.runBeforeTool(context.hooks, {
7466
7549
  args: toolCall.arguments,
7550
+ message: toolMessage,
7467
7551
  toolName: toolCall.name,
7468
7552
  });
7469
7553
  // Call the tool inside a child tool span (no-op when disabled)
@@ -7471,6 +7555,7 @@ class StreamLoop {
7471
7555
  const result = await withLlmObsSpan({ kind: "tool", name: toolCall.name }, async () => {
7472
7556
  const result = await state.toolkit.call({
7473
7557
  arguments: toolCall.arguments,
7558
+ message: toolMessage,
7474
7559
  name: toolCall.name,
7475
7560
  });
7476
7561
  annotateLlmObs({
@@ -7483,6 +7568,7 @@ class StreamLoop {
7483
7568
  // Execute afterEachTool hook
7484
7569
  await this.hookRunnerInstance.runAfterTool(context.hooks, {
7485
7570
  args: toolCall.arguments,
7571
+ message: toolMessage,
7486
7572
  result,
7487
7573
  toolName: toolCall.name,
7488
7574
  });
@@ -7510,6 +7596,7 @@ class StreamLoop {
7510
7596
  await this.hookRunnerInstance.runOnToolError(context.hooks, {
7511
7597
  args: toolCall.arguments,
7512
7598
  error: error,
7599
+ message: toolMessage,
7513
7600
  toolName: toolCall.name,
7514
7601
  });
7515
7602
  // Yield error chunk