@jaypie/llm 1.1.29 → 1.1.30

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 (67) hide show
  1. package/dist/cjs/constants.d.ts +38 -1
  2. package/dist/cjs/index.cjs +2975 -986
  3. package/dist/cjs/index.cjs.map +1 -1
  4. package/dist/cjs/index.d.ts +2 -0
  5. package/dist/cjs/operate/OperateLoop.d.ts +61 -0
  6. package/dist/cjs/operate/adapters/AnthropicAdapter.d.ts +32 -0
  7. package/dist/cjs/operate/adapters/GeminiAdapter.d.ts +37 -0
  8. package/dist/cjs/operate/adapters/OpenAiAdapter.d.ts +30 -0
  9. package/dist/cjs/operate/adapters/OpenRouterAdapter.d.ts +96 -0
  10. package/dist/cjs/operate/adapters/ProviderAdapter.interface.d.ts +177 -0
  11. package/dist/cjs/operate/adapters/index.d.ts +6 -0
  12. package/dist/cjs/operate/hooks/HookRunner.d.ts +78 -0
  13. package/dist/cjs/operate/hooks/index.d.ts +2 -0
  14. package/dist/cjs/operate/index.d.ts +14 -0
  15. package/dist/cjs/operate/input/InputProcessor.d.ts +40 -0
  16. package/dist/cjs/operate/input/index.d.ts +2 -0
  17. package/dist/cjs/operate/response/ResponseBuilder.d.ts +89 -0
  18. package/dist/cjs/operate/response/index.d.ts +2 -0
  19. package/dist/cjs/operate/retry/RetryExecutor.d.ts +39 -0
  20. package/dist/cjs/operate/retry/RetryPolicy.d.ts +35 -0
  21. package/dist/cjs/operate/retry/index.d.ts +4 -0
  22. package/dist/cjs/operate/types.d.ts +136 -0
  23. package/dist/cjs/providers/anthropic/AnthropicProvider.class.d.ts +2 -0
  24. package/dist/cjs/providers/gemini/GeminiProvider.class.d.ts +17 -0
  25. package/dist/cjs/providers/gemini/index.d.ts +3 -0
  26. package/dist/cjs/providers/gemini/types.d.ts +185 -0
  27. package/dist/cjs/providers/gemini/utils.d.ts +51 -0
  28. package/dist/cjs/providers/openai/OpenAiProvider.class.d.ts +2 -0
  29. package/dist/cjs/providers/openrouter/OpenRouterProvider.class.d.ts +17 -0
  30. package/dist/cjs/providers/openrouter/index.d.ts +2 -0
  31. package/dist/cjs/providers/openrouter/utils.d.ts +49 -0
  32. package/dist/esm/constants.d.ts +38 -1
  33. package/dist/esm/index.d.ts +2 -0
  34. package/dist/esm/index.js +2976 -989
  35. package/dist/esm/index.js.map +1 -1
  36. package/dist/esm/operate/OperateLoop.d.ts +61 -0
  37. package/dist/esm/operate/adapters/AnthropicAdapter.d.ts +32 -0
  38. package/dist/esm/operate/adapters/GeminiAdapter.d.ts +37 -0
  39. package/dist/esm/operate/adapters/OpenAiAdapter.d.ts +30 -0
  40. package/dist/esm/operate/adapters/OpenRouterAdapter.d.ts +96 -0
  41. package/dist/esm/operate/adapters/ProviderAdapter.interface.d.ts +177 -0
  42. package/dist/esm/operate/adapters/index.d.ts +6 -0
  43. package/dist/esm/operate/hooks/HookRunner.d.ts +78 -0
  44. package/dist/esm/operate/hooks/index.d.ts +2 -0
  45. package/dist/esm/operate/index.d.ts +14 -0
  46. package/dist/esm/operate/input/InputProcessor.d.ts +40 -0
  47. package/dist/esm/operate/input/index.d.ts +2 -0
  48. package/dist/esm/operate/response/ResponseBuilder.d.ts +89 -0
  49. package/dist/esm/operate/response/index.d.ts +2 -0
  50. package/dist/esm/operate/retry/RetryExecutor.d.ts +39 -0
  51. package/dist/esm/operate/retry/RetryPolicy.d.ts +35 -0
  52. package/dist/esm/operate/retry/index.d.ts +4 -0
  53. package/dist/esm/operate/types.d.ts +136 -0
  54. package/dist/esm/providers/anthropic/AnthropicProvider.class.d.ts +2 -0
  55. package/dist/esm/providers/gemini/GeminiProvider.class.d.ts +17 -0
  56. package/dist/esm/providers/gemini/index.d.ts +3 -0
  57. package/dist/esm/providers/gemini/types.d.ts +185 -0
  58. package/dist/esm/providers/gemini/utils.d.ts +51 -0
  59. package/dist/esm/providers/openai/OpenAiProvider.class.d.ts +2 -0
  60. package/dist/esm/providers/openrouter/OpenRouterProvider.class.d.ts +17 -0
  61. package/dist/esm/providers/openrouter/index.d.ts +2 -0
  62. package/dist/esm/providers/openrouter/utils.d.ts +49 -0
  63. package/package.json +7 -5
  64. package/dist/cjs/providers/anthropic/operate.d.ts +0 -16
  65. package/dist/cjs/providers/openai/operate.d.ts +0 -26
  66. package/dist/esm/providers/anthropic/operate.d.ts +0 -16
  67. package/dist/esm/providers/openai/operate.d.ts +0 -26
@@ -4,3 +4,5 @@ export type { LlmHistory, LlmInputContent, LlmInputContentFile, LlmInputContentI
4
4
  export { LlmMessageRole, LlmMessageType, } from "./types/LlmProvider.interface.js";
5
5
  export type { LlmTool } from "./types/LlmTool.interface.js";
6
6
  export { JaypieToolkit, toolkit, Toolkit, tools } from "./tools/index.js";
7
+ export { GeminiProvider } from "./providers/gemini/index.js";
8
+ export { OpenRouterProvider } from "./providers/openrouter/index.js";
@@ -0,0 +1,61 @@
1
+ import { LlmHistory, LlmInputMessage, LlmOperateOptions, LlmOperateResponse } from "../types/LlmProvider.interface.js";
2
+ import { ProviderAdapter } from "./adapters/ProviderAdapter.interface.js";
3
+ import { HookRunner } from "./hooks/index.js";
4
+ import { InputProcessor } from "./input/index.js";
5
+ import { RetryPolicy } from "./retry/index.js";
6
+ export interface OperateLoopConfig {
7
+ adapter: ProviderAdapter;
8
+ client: unknown;
9
+ hookRunner?: HookRunner;
10
+ inputProcessor?: InputProcessor;
11
+ maxRetries?: number;
12
+ retryPolicy?: RetryPolicy;
13
+ }
14
+ /**
15
+ * OperateLoop implements the core multi-turn conversation loop.
16
+ * It orchestrates provider adapters, retry logic, hook execution, and tool calling.
17
+ *
18
+ * This class uses Template Method + Strategy patterns:
19
+ * - Template Method: The execute() method defines the algorithm skeleton
20
+ * - Strategy: Provider adapters handle provider-specific operations
21
+ */
22
+ export declare class OperateLoop {
23
+ private readonly adapter;
24
+ private readonly client;
25
+ private readonly hookRunnerInstance;
26
+ private readonly inputProcessorInstance;
27
+ private readonly maxRetries;
28
+ private readonly retryPolicy;
29
+ constructor(config: OperateLoopConfig);
30
+ /**
31
+ * Execute the operate loop for multi-turn conversations with tool calling.
32
+ */
33
+ execute(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): Promise<LlmOperateResponse>;
34
+ private initializeState;
35
+ private createContext;
36
+ private buildInitialRequest;
37
+ private executeOneTurn;
38
+ /**
39
+ * Sync the current input state from the updated provider request.
40
+ * This is necessary because appendToolResult modifies the provider-specific request,
41
+ * and we need to keep our state in sync.
42
+ */
43
+ private syncInputFromRequest;
44
+ /**
45
+ * Convert Gemini contents format to internal history format.
46
+ */
47
+ private convertGeminiContentsToHistory;
48
+ /**
49
+ * Append response items to the provider request.
50
+ * This adds all output items from a response (including reasoning, function_calls, etc.)
51
+ * to the request's input/messages array.
52
+ *
53
+ * This is critical for OpenAI which requires reasoning items to be present
54
+ * when function_call items reference them.
55
+ */
56
+ private appendResponseItemsToRequest;
57
+ }
58
+ /**
59
+ * Create an OperateLoop instance with the specified configuration.
60
+ */
61
+ export declare function createOperateLoop(config: OperateLoopConfig): OperateLoop;
@@ -0,0 +1,32 @@
1
+ import { Anthropic } from "@anthropic-ai/sdk";
2
+ import { JsonObject, NaturalSchema } from "@jaypie/types";
3
+ import { z } from "zod/v4";
4
+ import { Toolkit } from "../../tools/Toolkit.class.js";
5
+ import { LlmHistory, LlmOperateOptions, LlmUsageItem } from "../../types/LlmProvider.interface.js";
6
+ import { ClassifiedError, OperateRequest, ParsedResponse, ProviderToolDefinition, StandardToolCall, StandardToolResult } from "../types.js";
7
+ import { BaseProviderAdapter } from "./ProviderAdapter.interface.js";
8
+ /**
9
+ * AnthropicAdapter implements the ProviderAdapter interface for Anthropic's API.
10
+ * It handles request building, response parsing, and error classification
11
+ * specific to Anthropic's Messages API.
12
+ */
13
+ export declare class AnthropicAdapter extends BaseProviderAdapter {
14
+ readonly name: "anthropic";
15
+ readonly defaultModel: "claude-opus-4-1";
16
+ buildRequest(request: OperateRequest): Anthropic.MessageCreateParams;
17
+ formatTools(toolkit: Toolkit, outputSchema?: JsonObject): ProviderToolDefinition[];
18
+ formatOutputSchema(schema: JsonObject | NaturalSchema | z.ZodType): JsonObject;
19
+ executeRequest(client: unknown, request: unknown): Promise<Anthropic.Message>;
20
+ parseResponse(response: unknown, _options?: LlmOperateOptions): ParsedResponse;
21
+ extractToolCalls(response: unknown): StandardToolCall[];
22
+ extractUsage(response: unknown, model: string): LlmUsageItem;
23
+ formatToolResult(toolCall: StandardToolCall, result: StandardToolResult): Anthropic.ToolResultBlockParam;
24
+ appendToolResult(request: unknown, toolCall: StandardToolCall, result: StandardToolResult): Anthropic.MessageCreateParams;
25
+ responseToHistoryItems(response: unknown): LlmHistory;
26
+ classifyError(error: unknown): ClassifiedError;
27
+ isComplete(response: unknown): boolean;
28
+ hasStructuredOutput(response: unknown): boolean;
29
+ extractStructuredOutput(response: unknown): JsonObject | undefined;
30
+ private extractContent;
31
+ }
32
+ export declare const anthropicAdapter: AnthropicAdapter;
@@ -0,0 +1,37 @@
1
+ import { JsonObject, NaturalSchema } from "@jaypie/types";
2
+ import { z } from "zod/v4";
3
+ import { Toolkit } from "../../tools/Toolkit.class.js";
4
+ import { LlmHistory, LlmOperateOptions, LlmUsageItem } from "../../types/LlmProvider.interface.js";
5
+ import { ClassifiedError, OperateRequest, ParsedResponse, ProviderToolDefinition, StandardToolCall, StandardToolResult } from "../types.js";
6
+ import { BaseProviderAdapter } from "./ProviderAdapter.interface.js";
7
+ import { GeminiPart, GeminiRawResponse, GeminiRequest } from "../../providers/gemini/types.js";
8
+ /**
9
+ * GeminiAdapter implements the ProviderAdapter interface for Google's Gemini API.
10
+ * It handles request building, response parsing, and error classification
11
+ * specific to Gemini's generateContent API.
12
+ */
13
+ export declare class GeminiAdapter extends BaseProviderAdapter {
14
+ readonly name: "gemini";
15
+ readonly defaultModel: "gemini-2.5-flash";
16
+ buildRequest(request: OperateRequest): GeminiRequest;
17
+ formatTools(toolkit: Toolkit, outputSchema?: JsonObject): ProviderToolDefinition[];
18
+ formatOutputSchema(schema: JsonObject | NaturalSchema | z.ZodType): JsonObject;
19
+ executeRequest(client: unknown, request: unknown): Promise<GeminiRawResponse>;
20
+ parseResponse(response: unknown, options?: LlmOperateOptions): ParsedResponse;
21
+ extractToolCalls(response: unknown): StandardToolCall[];
22
+ extractUsage(response: unknown, model: string): LlmUsageItem;
23
+ formatToolResult(toolCall: StandardToolCall, result: StandardToolResult): GeminiPart;
24
+ appendToolResult(request: unknown, toolCall: StandardToolCall, result: StandardToolResult): GeminiRequest;
25
+ responseToHistoryItems(response: unknown): LlmHistory;
26
+ classifyError(error: unknown): ClassifiedError;
27
+ isComplete(response: unknown): boolean;
28
+ hasStructuredOutput(response: unknown): boolean;
29
+ extractStructuredOutput(response: unknown): JsonObject | undefined;
30
+ private convertMessagesToContents;
31
+ private mapRole;
32
+ private hasToolCalls;
33
+ private getFinishReason;
34
+ private extractContent;
35
+ private generateCallId;
36
+ }
37
+ export declare const geminiAdapter: GeminiAdapter;
@@ -0,0 +1,30 @@
1
+ import { JsonObject, NaturalSchema } from "@jaypie/types";
2
+ import { z } from "zod/v4";
3
+ import { Toolkit } from "../../tools/Toolkit.class.js";
4
+ import { LlmHistory, LlmOperateOptions, LlmToolResult, LlmUsageItem } from "../../types/LlmProvider.interface.js";
5
+ import { ClassifiedError, OperateRequest, ParsedResponse, ProviderToolDefinition, StandardToolCall, StandardToolResult } from "../types.js";
6
+ import { BaseProviderAdapter } from "./ProviderAdapter.interface.js";
7
+ /**
8
+ * OpenAiAdapter implements the ProviderAdapter interface for OpenAI's API.
9
+ * It handles request building, response parsing, and error classification
10
+ * specific to OpenAI's Responses API.
11
+ */
12
+ export declare class OpenAiAdapter extends BaseProviderAdapter {
13
+ readonly name: "openai";
14
+ readonly defaultModel: "gpt-5";
15
+ buildRequest(request: OperateRequest): unknown;
16
+ formatTools(toolkit: Toolkit, _outputSchema?: JsonObject): ProviderToolDefinition[];
17
+ formatOutputSchema(schema: JsonObject | NaturalSchema | z.ZodType): JsonObject;
18
+ executeRequest(client: unknown, request: unknown): Promise<unknown>;
19
+ parseResponse(response: unknown, options?: LlmOperateOptions): ParsedResponse;
20
+ extractToolCalls(response: unknown): StandardToolCall[];
21
+ extractUsage(response: unknown, model: string): LlmUsageItem;
22
+ formatToolResult(toolCall: StandardToolCall, result: StandardToolResult): LlmToolResult;
23
+ appendToolResult(request: unknown, toolCall: StandardToolCall, result: StandardToolResult): unknown;
24
+ responseToHistoryItems(response: unknown): LlmHistory;
25
+ classifyError(error: unknown): ClassifiedError;
26
+ isComplete(response: unknown): boolean;
27
+ private hasToolCalls;
28
+ private extractContent;
29
+ }
30
+ export declare const openAiAdapter: OpenAiAdapter;
@@ -0,0 +1,96 @@
1
+ import { JsonObject, NaturalSchema } from "@jaypie/types";
2
+ import { z } from "zod/v4";
3
+ import { Toolkit } from "../../tools/Toolkit.class.js";
4
+ import { LlmHistory, LlmOperateOptions, LlmUsageItem } from "../../types/LlmProvider.interface.js";
5
+ import { ClassifiedError, OperateRequest, ParsedResponse, ProviderToolDefinition, StandardToolCall, StandardToolResult } from "../types.js";
6
+ import { BaseProviderAdapter } from "./ProviderAdapter.interface.js";
7
+ interface OpenRouterMessage {
8
+ role: "system" | "user" | "assistant" | "tool";
9
+ content?: string | null;
10
+ toolCalls?: OpenRouterToolCall[];
11
+ toolCallId?: string;
12
+ }
13
+ interface OpenRouterToolCall {
14
+ id: string;
15
+ type: "function";
16
+ function: {
17
+ name: string;
18
+ arguments: string;
19
+ };
20
+ }
21
+ interface OpenRouterResponseMessage {
22
+ role: "assistant";
23
+ content?: string | null;
24
+ toolCalls?: OpenRouterToolCall[];
25
+ refusal?: string | null;
26
+ reasoning?: string | null;
27
+ }
28
+ interface OpenRouterChoice {
29
+ index: number;
30
+ message: OpenRouterResponseMessage;
31
+ finishReason: string | null;
32
+ finish_reason?: string | null;
33
+ }
34
+ interface OpenRouterUsage {
35
+ promptTokens: number;
36
+ completionTokens: number;
37
+ totalTokens: number;
38
+ prompt_tokens?: number;
39
+ completion_tokens?: number;
40
+ total_tokens?: number;
41
+ }
42
+ interface OpenRouterResponse {
43
+ id: string;
44
+ object: string;
45
+ created: number;
46
+ model: string;
47
+ choices: OpenRouterChoice[];
48
+ usage?: OpenRouterUsage;
49
+ }
50
+ interface OpenRouterTool {
51
+ type: "function";
52
+ function: {
53
+ name: string;
54
+ description: string;
55
+ parameters: JsonObject;
56
+ };
57
+ }
58
+ interface OpenRouterRequest {
59
+ model: string;
60
+ messages: OpenRouterMessage[];
61
+ tools?: OpenRouterTool[];
62
+ tool_choice?: "auto" | "none" | "required";
63
+ response_format?: {
64
+ type: "json_object" | "text";
65
+ };
66
+ user?: string;
67
+ }
68
+ /**
69
+ * OpenRouterAdapter implements the ProviderAdapter interface for OpenRouter's API.
70
+ * OpenRouter provides a unified API to access hundreds of AI models through OpenAI-compatible endpoints.
71
+ * It handles request building, response parsing, and error classification
72
+ * specific to OpenRouter's Chat Completions API.
73
+ */
74
+ export declare class OpenRouterAdapter extends BaseProviderAdapter {
75
+ readonly name: "openrouter";
76
+ readonly defaultModel: "openai/gpt-4o";
77
+ buildRequest(request: OperateRequest): OpenRouterRequest;
78
+ formatTools(toolkit: Toolkit, outputSchema?: JsonObject): ProviderToolDefinition[];
79
+ formatOutputSchema(schema: JsonObject | NaturalSchema | z.ZodType): JsonObject;
80
+ executeRequest(client: unknown, request: unknown): Promise<OpenRouterResponse>;
81
+ parseResponse(response: unknown, _options?: LlmOperateOptions): ParsedResponse;
82
+ extractToolCalls(response: unknown): StandardToolCall[];
83
+ extractUsage(response: unknown, model: string): LlmUsageItem;
84
+ formatToolResult(toolCall: StandardToolCall, result: StandardToolResult): OpenRouterMessage;
85
+ appendToolResult(request: unknown, toolCall: StandardToolCall, result: StandardToolResult): OpenRouterRequest;
86
+ responseToHistoryItems(response: unknown): LlmHistory;
87
+ classifyError(error: unknown): ClassifiedError;
88
+ isComplete(response: unknown): boolean;
89
+ hasStructuredOutput(response: unknown): boolean;
90
+ extractStructuredOutput(response: unknown): JsonObject | undefined;
91
+ private hasToolCalls;
92
+ private extractContent;
93
+ private convertMessagesToOpenRouter;
94
+ }
95
+ export declare const openRouterAdapter: OpenRouterAdapter;
96
+ export {};
@@ -0,0 +1,177 @@
1
+ import { JsonObject, NaturalSchema } from "@jaypie/types";
2
+ import { z } from "zod/v4";
3
+ import { LlmHistory, LlmOperateOptions, LlmUsageItem } from "../../types/LlmProvider.interface.js";
4
+ import { Toolkit } from "../../tools/Toolkit.class.js";
5
+ import { ClassifiedError, OperateRequest, ParsedResponse, ProviderToolDefinition, StandardToolCall, StandardToolResult } from "../types.js";
6
+ /**
7
+ * ProviderAdapter defines the contract that each LLM provider must implement
8
+ * to work with the shared operate loop.
9
+ *
10
+ * The adapter pattern allows the core operate loop to be provider-agnostic
11
+ * while each provider handles its specific API format and quirks.
12
+ */
13
+ export interface ProviderAdapter {
14
+ /**
15
+ * Unique identifier for this provider (e.g., "openai", "anthropic")
16
+ */
17
+ readonly name: string;
18
+ /**
19
+ * Default model for this provider
20
+ */
21
+ readonly defaultModel: string;
22
+ /**
23
+ * Build a provider-specific request from the standardized format
24
+ *
25
+ * @param request - Standardized request options
26
+ * @returns Provider-specific request object ready for the API
27
+ */
28
+ buildRequest(request: OperateRequest): unknown;
29
+ /**
30
+ * Convert a Toolkit to provider-specific tool definitions
31
+ *
32
+ * @param toolkit - The toolkit containing tool definitions
33
+ * @param outputSchema - Optional JSON schema for structured output
34
+ * @returns Array of provider-specific tool definitions
35
+ */
36
+ formatTools(toolkit: Toolkit, outputSchema?: JsonObject): ProviderToolDefinition[];
37
+ /**
38
+ * Format a structured output schema for the provider
39
+ *
40
+ * @param schema - JSON schema, NaturalSchema, or Zod schema for the expected output
41
+ * @returns Provider-specific format configuration
42
+ */
43
+ formatOutputSchema(schema: JsonObject | NaturalSchema | z.ZodType): JsonObject;
44
+ /**
45
+ * Execute an API request to the provider
46
+ *
47
+ * @param client - The provider's SDK client instance
48
+ * @param request - Provider-specific request object (from buildRequest)
49
+ * @returns Raw provider response
50
+ */
51
+ executeRequest(client: unknown, request: unknown): Promise<unknown>;
52
+ /**
53
+ * Parse a provider response into standardized format
54
+ *
55
+ * @param response - Raw provider response
56
+ * @param options - Original operate options (for context)
57
+ * @returns Parsed response with content, tool calls, usage, etc.
58
+ */
59
+ parseResponse(response: unknown, options?: LlmOperateOptions): ParsedResponse;
60
+ /**
61
+ * Extract tool calls from a provider response
62
+ *
63
+ * @param response - Raw provider response
64
+ * @returns Array of standardized tool calls
65
+ */
66
+ extractToolCalls(response: unknown): StandardToolCall[];
67
+ /**
68
+ * Extract usage information from a provider response
69
+ *
70
+ * @param response - Raw provider response
71
+ * @param model - The model used (for tracking)
72
+ * @returns Usage item with token counts
73
+ */
74
+ extractUsage(response: unknown, model: string): LlmUsageItem;
75
+ /**
76
+ * Format a tool result to append to the conversation
77
+ *
78
+ * @param toolCall - The original tool call
79
+ * @param result - The standardized tool result
80
+ * @returns Provider-specific message/item to add to history
81
+ */
82
+ formatToolResult(toolCall: StandardToolCall, result: StandardToolResult): unknown;
83
+ /**
84
+ * Append tool call and result to the request for the next turn
85
+ *
86
+ * @param request - Current provider request
87
+ * @param toolCall - The tool call that was made
88
+ * @param result - The result of the tool call
89
+ * @returns Updated request with tool result appended
90
+ */
91
+ appendToolResult(request: unknown, toolCall: StandardToolCall, result: StandardToolResult): unknown;
92
+ /**
93
+ * Convert provider response items to LlmHistory format for storage
94
+ *
95
+ * @param response - Raw provider response
96
+ * @returns History items to append
97
+ */
98
+ responseToHistoryItems(response: unknown): LlmHistory;
99
+ /**
100
+ * Classify an error for retry logic
101
+ *
102
+ * @param error - The error that occurred
103
+ * @returns Classified error with retry recommendation
104
+ */
105
+ classifyError(error: unknown): ClassifiedError;
106
+ /**
107
+ * Check if an error is retryable
108
+ *
109
+ * @param error - The error to check
110
+ * @returns True if the error can be retried
111
+ */
112
+ isRetryableError(error: unknown): boolean;
113
+ /**
114
+ * Check if an error is due to rate limiting
115
+ *
116
+ * @param error - The error to check
117
+ * @returns True if this is a rate limit error
118
+ */
119
+ isRateLimitError(error: unknown): boolean;
120
+ /**
121
+ * Check if a response indicates the model wants to stop (vs tool use)
122
+ *
123
+ * @param response - Raw provider response
124
+ * @returns True if the model has finished responding
125
+ */
126
+ isComplete(response: unknown): boolean;
127
+ /**
128
+ * Check if a response contains a structured output result
129
+ *
130
+ * @param response - Raw provider response
131
+ * @returns True if structured output was returned
132
+ */
133
+ hasStructuredOutput(response: unknown): boolean;
134
+ /**
135
+ * Extract structured output from a response
136
+ *
137
+ * @param response - Raw provider response
138
+ * @returns Parsed JSON object
139
+ */
140
+ extractStructuredOutput(response: unknown): JsonObject | undefined;
141
+ }
142
+ /**
143
+ * BaseProviderAdapter provides default implementations for common adapter methods.
144
+ * Providers can extend this class to reduce boilerplate.
145
+ */
146
+ export declare abstract class BaseProviderAdapter implements ProviderAdapter {
147
+ abstract readonly name: string;
148
+ abstract readonly defaultModel: string;
149
+ abstract buildRequest(request: OperateRequest): unknown;
150
+ abstract formatTools(toolkit: Toolkit, outputSchema?: JsonObject): ProviderToolDefinition[];
151
+ abstract formatOutputSchema(schema: JsonObject | NaturalSchema | z.ZodType): JsonObject;
152
+ abstract executeRequest(client: unknown, request: unknown): Promise<unknown>;
153
+ abstract parseResponse(response: unknown, options?: LlmOperateOptions): ParsedResponse;
154
+ abstract extractToolCalls(response: unknown): StandardToolCall[];
155
+ abstract extractUsage(response: unknown, model: string): LlmUsageItem;
156
+ abstract formatToolResult(toolCall: StandardToolCall, result: StandardToolResult): unknown;
157
+ abstract appendToolResult(request: unknown, toolCall: StandardToolCall, result: StandardToolResult): unknown;
158
+ abstract responseToHistoryItems(response: unknown): LlmHistory;
159
+ abstract classifyError(error: unknown): ClassifiedError;
160
+ abstract isComplete(response: unknown): boolean;
161
+ /**
162
+ * Default implementation checks if error is retryable via classifyError
163
+ */
164
+ isRetryableError(error: unknown): boolean;
165
+ /**
166
+ * Default implementation checks error category via classifyError
167
+ */
168
+ isRateLimitError(error: unknown): boolean;
169
+ /**
170
+ * Default implementation returns false - override for providers with native structured output
171
+ */
172
+ hasStructuredOutput(_response: unknown): boolean;
173
+ /**
174
+ * Default implementation returns undefined - override for providers with native structured output
175
+ */
176
+ extractStructuredOutput(_response: unknown): JsonObject | undefined;
177
+ }
@@ -0,0 +1,6 @@
1
+ export { BaseProviderAdapter } from "./ProviderAdapter.interface.js";
2
+ export type { ProviderAdapter } from "./ProviderAdapter.interface.js";
3
+ export { AnthropicAdapter, anthropicAdapter } from "./AnthropicAdapter.js";
4
+ export { GeminiAdapter, geminiAdapter } from "./GeminiAdapter.js";
5
+ export { OpenAiAdapter, openAiAdapter } from "./OpenAiAdapter.js";
6
+ export { OpenRouterAdapter, openRouterAdapter } from "./OpenRouterAdapter.js";
@@ -0,0 +1,78 @@
1
+ import { JsonObject } from "@jaypie/types";
2
+ import { LlmHistory, LlmInputMessage, LlmOperateOptions, LlmUsage } from "../../types/LlmProvider.interface.js";
3
+ export interface BeforeModelRequestContext {
4
+ input: string | LlmHistory | LlmInputMessage;
5
+ options?: LlmOperateOptions;
6
+ providerRequest: unknown;
7
+ }
8
+ export interface AfterModelResponseContext {
9
+ content: string | JsonObject;
10
+ input: string | LlmHistory | LlmInputMessage;
11
+ options?: LlmOperateOptions;
12
+ providerRequest: unknown;
13
+ providerResponse: unknown;
14
+ usage: LlmUsage;
15
+ }
16
+ export interface BeforeToolContext {
17
+ args: string;
18
+ toolName: string;
19
+ }
20
+ export interface AfterToolContext {
21
+ args: string;
22
+ result: unknown;
23
+ toolName: string;
24
+ }
25
+ export interface ToolErrorContext {
26
+ args: string;
27
+ error: Error;
28
+ toolName: string;
29
+ }
30
+ export interface RetryableErrorContext {
31
+ error: unknown;
32
+ input: string | LlmHistory | LlmInputMessage;
33
+ options?: LlmOperateOptions;
34
+ providerRequest: unknown;
35
+ }
36
+ export interface UnrecoverableErrorContext {
37
+ error: unknown;
38
+ input: string | LlmHistory | LlmInputMessage;
39
+ options?: LlmOperateOptions;
40
+ providerRequest: unknown;
41
+ }
42
+ export type LlmHooks = LlmOperateOptions["hooks"];
43
+ /**
44
+ * HookRunner provides a centralized, consistent way to execute lifecycle hooks
45
+ * during the LLM operate loop. It handles async resolution and provides error
46
+ * isolation for hook execution.
47
+ */
48
+ export declare class HookRunner {
49
+ /**
50
+ * Execute the beforeEachModelRequest hook if defined
51
+ */
52
+ runBeforeModelRequest(hooks: LlmHooks, context: BeforeModelRequestContext): Promise<void>;
53
+ /**
54
+ * Execute the afterEachModelResponse hook if defined
55
+ */
56
+ runAfterModelResponse(hooks: LlmHooks, context: AfterModelResponseContext): Promise<void>;
57
+ /**
58
+ * Execute the beforeEachTool hook if defined
59
+ */
60
+ runBeforeTool(hooks: LlmHooks, context: BeforeToolContext): Promise<void>;
61
+ /**
62
+ * Execute the afterEachTool hook if defined
63
+ */
64
+ runAfterTool(hooks: LlmHooks, context: AfterToolContext): Promise<void>;
65
+ /**
66
+ * Execute the onToolError hook if defined
67
+ */
68
+ runOnToolError(hooks: LlmHooks, context: ToolErrorContext): Promise<void>;
69
+ /**
70
+ * Execute the onRetryableModelError hook if defined
71
+ */
72
+ runOnRetryableError(hooks: LlmHooks, context: RetryableErrorContext): Promise<void>;
73
+ /**
74
+ * Execute the onUnrecoverableModelError hook if defined
75
+ */
76
+ runOnUnrecoverableError(hooks: LlmHooks, context: UnrecoverableErrorContext): Promise<void>;
77
+ }
78
+ export declare const hookRunner: HookRunner;
@@ -0,0 +1,2 @@
1
+ export { HookRunner, hookRunner } from "./HookRunner.js";
2
+ export type { AfterModelResponseContext, AfterToolContext, BeforeModelRequestContext, BeforeToolContext, LlmHooks, RetryableErrorContext, ToolErrorContext, UnrecoverableErrorContext, } from "./HookRunner.js";
@@ -0,0 +1,14 @@
1
+ export { AnthropicAdapter, anthropicAdapter, BaseProviderAdapter, GeminiAdapter, geminiAdapter, OpenAiAdapter, openAiAdapter, OpenRouterAdapter, openRouterAdapter, } from "./adapters/index.js";
2
+ export type { ProviderAdapter } from "./adapters/index.js";
3
+ export { createOperateLoop, OperateLoop } from "./OperateLoop.js";
4
+ export type { OperateLoopConfig } from "./OperateLoop.js";
5
+ export { HookRunner, hookRunner } from "./hooks/index.js";
6
+ export type { AfterModelResponseContext, AfterToolContext, BeforeModelRequestContext, BeforeToolContext, LlmHooks, RetryableErrorContext, ToolErrorContext, UnrecoverableErrorContext, } from "./hooks/index.js";
7
+ export { InputProcessor, inputProcessor } from "./input/index.js";
8
+ export type { ProcessedInput } from "./input/index.js";
9
+ export { createResponseBuilder, ResponseBuilder } from "./response/index.js";
10
+ export type { LlmError, ResponseBuilderConfig } from "./response/index.js";
11
+ export { DEFAULT_BACKOFF_FACTOR, DEFAULT_INITIAL_DELAY_MS, DEFAULT_MAX_DELAY_MS, DEFAULT_MAX_RETRIES, defaultRetryPolicy, MAX_RETRIES_ABSOLUTE_LIMIT, RetryExecutor, RetryPolicy, } from "./retry/index.js";
12
+ export type { ErrorClassifier, ExecuteOptions, RetryContext, RetryExecutorConfig, RetryPolicyConfig, } from "./retry/index.js";
13
+ export { ErrorCategory, LlmMessageType } from "./types.js";
14
+ export type { ClassifiedError, OperateContext, OperateLoopState, OperateRequest, ParsedResponse, ProviderToolDefinition, StandardToolCall, StandardToolResult, } from "./types.js";
@@ -0,0 +1,40 @@
1
+ import { LlmHistory, LlmInputMessage, LlmOperateOptions } from "../../types/LlmProvider.interface.js";
2
+ export interface ProcessedInput {
3
+ /** The processed history with all messages formatted */
4
+ history: LlmHistory;
5
+ /** Processed instructions with placeholders applied */
6
+ instructions?: string;
7
+ /** Processed system prompt with placeholders applied */
8
+ system?: string;
9
+ }
10
+ /**
11
+ * InputProcessor handles input normalization, placeholder substitution,
12
+ * and history merging for the operate loop.
13
+ */
14
+ export declare class InputProcessor {
15
+ /**
16
+ * Process input with placeholders, history merging, and system message handling
17
+ *
18
+ * @param input - The raw input (string, message, or history)
19
+ * @param options - The operate options containing data, history, system, etc.
20
+ * @returns Processed input with all transformations applied
21
+ */
22
+ process(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): ProcessedInput;
23
+ /**
24
+ * Format input and apply placeholders if data is provided
25
+ */
26
+ private formatInputWithPlaceholders;
27
+ /**
28
+ * Process instructions with placeholder substitution
29
+ */
30
+ private processInstructions;
31
+ /**
32
+ * Process system prompt with placeholder substitution
33
+ */
34
+ private processSystem;
35
+ /**
36
+ * Prepend system message to history, handling duplicates
37
+ */
38
+ private prependSystemMessage;
39
+ }
40
+ export declare const inputProcessor: InputProcessor;
@@ -0,0 +1,2 @@
1
+ export { InputProcessor, inputProcessor } from "./InputProcessor.js";
2
+ export type { ProcessedInput } from "./InputProcessor.js";