@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.
- package/dist/cjs/{src/constants.d.ts → constants.d.ts} +4 -4
- package/dist/cjs/index.cjs +116 -29
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +28 -8
- package/dist/{esm/src → cjs}/operate/hooks/HookRunner.d.ts +3 -0
- package/dist/cjs/{src/operate → operate}/types.d.ts +2 -0
- package/dist/{esm/src → cjs}/tools/Toolkit.class.d.ts +13 -1
- package/dist/{esm/src → cjs}/types/LlmProvider.interface.d.ts +11 -3
- package/dist/cjs/{src/util → util}/index.d.ts +1 -0
- package/dist/cjs/util/tallyOperate.d.ts +14 -0
- package/dist/esm/{src/constants.d.ts → constants.d.ts} +4 -4
- package/dist/esm/index.d.ts +28 -8
- package/dist/esm/index.js +116 -29
- package/dist/esm/index.js.map +1 -1
- package/dist/{cjs/src → esm}/operate/hooks/HookRunner.d.ts +3 -0
- package/dist/esm/{src/operate → operate}/types.d.ts +2 -0
- package/dist/{cjs/src → esm}/tools/Toolkit.class.d.ts +13 -1
- package/dist/{cjs/src → esm}/types/LlmProvider.interface.d.ts +11 -3
- package/dist/esm/{src/util → util}/index.d.ts +1 -0
- package/dist/esm/util/tallyOperate.d.ts +14 -0
- package/package.json +1 -1
- package/dist/esm/src/index.d.ts +0 -17
- /package/dist/cjs/{src/Llm.d.ts → Llm.d.ts} +0 -0
- /package/dist/cjs/{src/index.d.ts → index.d.ts} +0 -0
- /package/dist/cjs/{src/observability → observability}/llmobs.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/OperateLoop.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/StreamLoop.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/adapters/AnthropicAdapter.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/adapters/BedrockAdapter.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/adapters/GoogleAdapter.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/adapters/OpenAiAdapter.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/adapters/OpenRouterAdapter.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/adapters/XaiAdapter.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/adapters/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/hooks/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/input/InputProcessor.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/input/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/progress/emitProgress.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/progress/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/response/ResponseBuilder.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/response/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/retry/RetryExecutor.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/retry/RetryPolicy.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/retry/createStaleRejectionGuard.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/retry/index.d.ts +0 -0
- /package/dist/cjs/{src/operate → operate}/retry/isTransientNetworkError.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/anthropic/client.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/anthropic/index.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/anthropic/types.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/anthropic/utils.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/bedrock/BedrockProvider.class.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/bedrock/index.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/bedrock/utils.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/google/GoogleProvider.class.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/google/client.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/google/index.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/google/types.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/google/utils.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openai/OpenAiProvider.class.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openai/client.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openai/index.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openai/responseFormat.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openai/types.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openai/utils.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openrouter/client.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openrouter/index.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/openrouter/utils.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/xai/XaiProvider.class.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/xai/index.d.ts +0 -0
- /package/dist/cjs/{src/providers → providers}/xai/utils.d.ts +0 -0
- /package/dist/cjs/{src/tools → tools}/index.d.ts +0 -0
- /package/dist/cjs/{src/tools → tools}/random.d.ts +0 -0
- /package/dist/cjs/{src/tools → tools}/roll.d.ts +0 -0
- /package/dist/cjs/{src/tools → tools}/time.d.ts +0 -0
- /package/dist/cjs/{src/tools → tools}/weather.d.ts +0 -0
- /package/dist/cjs/{src/types → types}/LlmOperateInput.guards.d.ts +0 -0
- /package/dist/cjs/{src/types → types}/LlmStreamChunk.interface.d.ts +0 -0
- /package/dist/cjs/{src/types → types}/LlmTool.interface.d.ts +0 -0
- /package/dist/cjs/{src/upload → upload}/detectMimeType.d.ts +0 -0
- /package/dist/cjs/{src/upload → upload}/extractPdfPages.d.ts +0 -0
- /package/dist/cjs/{src/upload → upload}/index.d.ts +0 -0
- /package/dist/cjs/{src/upload → upload}/loadLocalFile.d.ts +0 -0
- /package/dist/cjs/{src/upload → upload}/loadS3File.d.ts +0 -0
- /package/dist/cjs/{src/upload → upload}/resolveOperateInput.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/determineModelProvider.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/extractReasoning.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/fillFormatArrays.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/formatOperateInput.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/formatOperateMessage.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/jsonSchema.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/jsonSchemaToOpenApi3.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/logger.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/maxOutputTokens.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/maxTurnsFromOptions.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/naturalZodSchema.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/random.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/repairFormatKeys.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/sse.d.ts +0 -0
- /package/dist/cjs/{src/util → util}/tryParseNumber.d.ts +0 -0
- /package/dist/esm/{src/Llm.d.ts → Llm.d.ts} +0 -0
- /package/dist/esm/{src/observability → observability}/llmobs.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/OperateLoop.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/StreamLoop.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/adapters/AnthropicAdapter.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/adapters/BedrockAdapter.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/adapters/GoogleAdapter.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/adapters/OpenAiAdapter.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/adapters/OpenRouterAdapter.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/adapters/ProviderAdapter.interface.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/adapters/XaiAdapter.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/adapters/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/hooks/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/input/InputProcessor.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/input/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/progress/emitProgress.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/progress/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/response/ResponseBuilder.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/response/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/retry/RetryExecutor.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/retry/RetryPolicy.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/retry/createStaleRejectionGuard.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/retry/index.d.ts +0 -0
- /package/dist/esm/{src/operate → operate}/retry/isTransientNetworkError.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/anthropic/AnthropicProvider.class.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/anthropic/client.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/anthropic/index.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/anthropic/types.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/anthropic/utils.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/bedrock/BedrockProvider.class.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/bedrock/index.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/bedrock/utils.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/google/GoogleProvider.class.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/google/client.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/google/index.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/google/types.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/google/utils.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openai/OpenAiProvider.class.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openai/client.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openai/index.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openai/responseFormat.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openai/types.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openai/utils.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openrouter/OpenRouterProvider.class.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openrouter/client.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openrouter/index.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/openrouter/utils.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/xai/XaiProvider.class.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/xai/index.d.ts +0 -0
- /package/dist/esm/{src/providers → providers}/xai/utils.d.ts +0 -0
- /package/dist/esm/{src/tools → tools}/index.d.ts +0 -0
- /package/dist/esm/{src/tools → tools}/random.d.ts +0 -0
- /package/dist/esm/{src/tools → tools}/roll.d.ts +0 -0
- /package/dist/esm/{src/tools → tools}/time.d.ts +0 -0
- /package/dist/esm/{src/tools → tools}/weather.d.ts +0 -0
- /package/dist/esm/{src/types → types}/LlmOperateInput.guards.d.ts +0 -0
- /package/dist/esm/{src/types → types}/LlmStreamChunk.interface.d.ts +0 -0
- /package/dist/esm/{src/types → types}/LlmTool.interface.d.ts +0 -0
- /package/dist/esm/{src/upload → upload}/detectMimeType.d.ts +0 -0
- /package/dist/esm/{src/upload → upload}/extractPdfPages.d.ts +0 -0
- /package/dist/esm/{src/upload → upload}/index.d.ts +0 -0
- /package/dist/esm/{src/upload → upload}/loadLocalFile.d.ts +0 -0
- /package/dist/esm/{src/upload → upload}/loadS3File.d.ts +0 -0
- /package/dist/esm/{src/upload → upload}/resolveOperateInput.d.ts +0 -0
- /package/dist/esm/{src/util → util}/determineModelProvider.d.ts +0 -0
- /package/dist/esm/{src/util → util}/extractReasoning.d.ts +0 -0
- /package/dist/esm/{src/util → util}/fillFormatArrays.d.ts +0 -0
- /package/dist/esm/{src/util → util}/formatOperateInput.d.ts +0 -0
- /package/dist/esm/{src/util → util}/formatOperateMessage.d.ts +0 -0
- /package/dist/esm/{src/util → util}/jsonSchema.d.ts +0 -0
- /package/dist/esm/{src/util → util}/jsonSchemaToOpenApi3.d.ts +0 -0
- /package/dist/esm/{src/util → util}/logger.d.ts +0 -0
- /package/dist/esm/{src/util → util}/maxOutputTokens.d.ts +0 -0
- /package/dist/esm/{src/util → util}/maxTurnsFromOptions.d.ts +0 -0
- /package/dist/esm/{src/util → util}/naturalZodSchema.d.ts +0 -0
- /package/dist/esm/{src/util → util}/random.d.ts +0 -0
- /package/dist/esm/{src/util → util}/repairFormatKeys.d.ts +0 -0
- /package/dist/esm/{src/util → util}/sse.d.ts +0 -0
- /package/dist/esm/{src/util → util}/tryParseNumber.d.ts +0 -0
package/dist/cjs/index.d.cts
CHANGED
|
@@ -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-
|
|
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-
|
|
146
|
-
readonly LARGE: readonly ["claude-opus-4-8", "gemini-3.1-pro-preview", "gpt-5.5", "grok-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
|
@@ -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-
|
|
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
|
|
142
|
-
readonly LARGE: readonly ["claude-opus-4-8", "gemini-3.1-pro-preview", "gpt-5.5", "grok-
|
|
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
|
};
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -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-
|
|
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-
|
|
146
|
-
readonly LARGE: readonly ["claude-opus-4-8", "gemini-3.1-pro-preview", "gpt-5.5", "grok-
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
5446
|
-
|
|
5447
|
-
|
|
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: {
|
|
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
|