@jaypie/llm 1.2.0-rc.1 → 1.2.0-rc.3

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 (37) hide show
  1. package/dist/cjs/Llm.d.ts +7 -0
  2. package/dist/cjs/index.cjs +811 -3
  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 +0 -2
  6. package/dist/cjs/operate/StreamLoop.d.ts +41 -0
  7. package/dist/cjs/operate/adapters/AnthropicAdapter.d.ts +2 -0
  8. package/dist/cjs/operate/adapters/GeminiAdapter.d.ts +2 -0
  9. package/dist/cjs/operate/adapters/OpenAiAdapter.d.ts +2 -0
  10. package/dist/cjs/operate/adapters/OpenRouterAdapter.d.ts +2 -0
  11. package/dist/cjs/operate/adapters/ProviderAdapter.interface.d.ts +9 -0
  12. package/dist/cjs/operate/index.d.ts +2 -0
  13. package/dist/cjs/providers/anthropic/AnthropicProvider.class.d.ts +4 -0
  14. package/dist/cjs/providers/gemini/GeminiProvider.class.d.ts +4 -0
  15. package/dist/cjs/providers/openai/OpenAiProvider.class.d.ts +4 -0
  16. package/dist/cjs/providers/openrouter/OpenRouterProvider.class.d.ts +4 -0
  17. package/dist/cjs/types/LlmProvider.interface.d.ts +2 -0
  18. package/dist/cjs/types/LlmStreamChunk.interface.d.ts +41 -0
  19. package/dist/esm/Llm.d.ts +7 -0
  20. package/dist/esm/index.d.ts +2 -0
  21. package/dist/esm/index.js +812 -4
  22. package/dist/esm/index.js.map +1 -1
  23. package/dist/esm/operate/OperateLoop.d.ts +0 -2
  24. package/dist/esm/operate/StreamLoop.d.ts +41 -0
  25. package/dist/esm/operate/adapters/AnthropicAdapter.d.ts +2 -0
  26. package/dist/esm/operate/adapters/GeminiAdapter.d.ts +2 -0
  27. package/dist/esm/operate/adapters/OpenAiAdapter.d.ts +2 -0
  28. package/dist/esm/operate/adapters/OpenRouterAdapter.d.ts +2 -0
  29. package/dist/esm/operate/adapters/ProviderAdapter.interface.d.ts +9 -0
  30. package/dist/esm/operate/index.d.ts +2 -0
  31. package/dist/esm/providers/anthropic/AnthropicProvider.class.d.ts +4 -0
  32. package/dist/esm/providers/gemini/GeminiProvider.class.d.ts +4 -0
  33. package/dist/esm/providers/openai/OpenAiProvider.class.d.ts +4 -0
  34. package/dist/esm/providers/openrouter/OpenRouterProvider.class.d.ts +4 -0
  35. package/dist/esm/types/LlmProvider.interface.d.ts +2 -0
  36. package/dist/esm/types/LlmStreamChunk.interface.d.ts +41 -0
  37. package/package.json +6 -4
@@ -8,7 +8,6 @@ export interface OperateLoopConfig {
8
8
  client: unknown;
9
9
  hookRunner?: HookRunner;
10
10
  inputProcessor?: InputProcessor;
11
- maxRetries?: number;
12
11
  retryPolicy?: RetryPolicy;
13
12
  }
14
13
  /**
@@ -24,7 +23,6 @@ export declare class OperateLoop {
24
23
  private readonly client;
25
24
  private readonly hookRunnerInstance;
26
25
  private readonly inputProcessorInstance;
27
- private readonly maxRetries;
28
26
  private readonly retryPolicy;
29
27
  constructor(config: OperateLoopConfig);
30
28
  /**
@@ -0,0 +1,41 @@
1
+ import { LlmHistory, LlmInputMessage, LlmOperateOptions } from "../types/LlmProvider.interface.js";
2
+ import { LlmStreamChunk } from "../types/LlmStreamChunk.interface.js";
3
+ import { ProviderAdapter } from "./adapters/ProviderAdapter.interface.js";
4
+ import { HookRunner } from "./hooks/index.js";
5
+ import { InputProcessor } from "./input/index.js";
6
+ export interface StreamLoopConfig {
7
+ adapter: ProviderAdapter;
8
+ client: unknown;
9
+ hookRunner?: HookRunner;
10
+ inputProcessor?: InputProcessor;
11
+ }
12
+ /**
13
+ * StreamLoop implements streaming multi-turn conversation loop.
14
+ * It orchestrates provider adapters and tool calling while yielding
15
+ * stream chunks as they become available.
16
+ */
17
+ export declare class StreamLoop {
18
+ private readonly adapter;
19
+ private readonly client;
20
+ private readonly hookRunnerInstance;
21
+ private readonly inputProcessorInstance;
22
+ constructor(config: StreamLoopConfig);
23
+ /**
24
+ * Execute the streaming loop for multi-turn conversations with tool calling.
25
+ * Yields stream chunks as they become available.
26
+ */
27
+ execute(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): AsyncIterable<LlmStreamChunk>;
28
+ private initializeState;
29
+ private createContext;
30
+ private buildInitialRequest;
31
+ private executeOneStreamingTurn;
32
+ private processToolCalls;
33
+ /**
34
+ * Convert Gemini contents format to internal history format.
35
+ */
36
+ private convertGeminiContentsToHistory;
37
+ }
38
+ /**
39
+ * Create a StreamLoop instance with the specified configuration.
40
+ */
41
+ export declare function createStreamLoop(config: StreamLoopConfig): StreamLoop;
@@ -3,6 +3,7 @@ import { JsonObject, NaturalSchema } from "@jaypie/types";
3
3
  import { z } from "zod/v4";
4
4
  import { Toolkit } from "../../tools/Toolkit.class.js";
5
5
  import { LlmHistory, LlmOperateOptions, LlmUsageItem } from "../../types/LlmProvider.interface.js";
6
+ import { LlmStreamChunk } from "../../types/LlmStreamChunk.interface.js";
6
7
  import { ClassifiedError, OperateRequest, ParsedResponse, ProviderToolDefinition, StandardToolCall, StandardToolResult } from "../types.js";
7
8
  import { BaseProviderAdapter } from "./ProviderAdapter.interface.js";
8
9
  /**
@@ -17,6 +18,7 @@ export declare class AnthropicAdapter extends BaseProviderAdapter {
17
18
  formatTools(toolkit: Toolkit, outputSchema?: JsonObject): ProviderToolDefinition[];
18
19
  formatOutputSchema(schema: JsonObject | NaturalSchema | z.ZodType): JsonObject;
19
20
  executeRequest(client: unknown, request: unknown): Promise<Anthropic.Message>;
21
+ executeStreamRequest(client: unknown, request: unknown): AsyncIterable<LlmStreamChunk>;
20
22
  parseResponse(response: unknown, _options?: LlmOperateOptions): ParsedResponse;
21
23
  extractToolCalls(response: unknown): StandardToolCall[];
22
24
  extractUsage(response: unknown, model: string): LlmUsageItem;
@@ -2,6 +2,7 @@ import { JsonObject, NaturalSchema } from "@jaypie/types";
2
2
  import { z } from "zod/v4";
3
3
  import { Toolkit } from "../../tools/Toolkit.class.js";
4
4
  import { LlmHistory, LlmOperateOptions, LlmUsageItem } from "../../types/LlmProvider.interface.js";
5
+ import { LlmStreamChunk } from "../../types/LlmStreamChunk.interface.js";
5
6
  import { ClassifiedError, OperateRequest, ParsedResponse, ProviderToolDefinition, StandardToolCall, StandardToolResult } from "../types.js";
6
7
  import { BaseProviderAdapter } from "./ProviderAdapter.interface.js";
7
8
  import { GeminiPart, GeminiRawResponse, GeminiRequest } from "../../providers/gemini/types.js";
@@ -17,6 +18,7 @@ export declare class GeminiAdapter extends BaseProviderAdapter {
17
18
  formatTools(toolkit: Toolkit, outputSchema?: JsonObject): ProviderToolDefinition[];
18
19
  formatOutputSchema(schema: JsonObject | NaturalSchema | z.ZodType): JsonObject;
19
20
  executeRequest(client: unknown, request: unknown): Promise<GeminiRawResponse>;
21
+ executeStreamRequest(client: unknown, request: unknown): AsyncIterable<LlmStreamChunk>;
20
22
  parseResponse(response: unknown, options?: LlmOperateOptions): ParsedResponse;
21
23
  extractToolCalls(response: unknown): StandardToolCall[];
22
24
  extractUsage(response: unknown, model: string): LlmUsageItem;
@@ -2,6 +2,7 @@ import { JsonObject, NaturalSchema } from "@jaypie/types";
2
2
  import { z } from "zod/v4";
3
3
  import { Toolkit } from "../../tools/Toolkit.class.js";
4
4
  import { LlmHistory, LlmOperateOptions, LlmToolResult, LlmUsageItem } from "../../types/LlmProvider.interface.js";
5
+ import { LlmStreamChunk } from "../../types/LlmStreamChunk.interface.js";
5
6
  import { ClassifiedError, OperateRequest, ParsedResponse, ProviderToolDefinition, StandardToolCall, StandardToolResult } from "../types.js";
6
7
  import { BaseProviderAdapter } from "./ProviderAdapter.interface.js";
7
8
  /**
@@ -16,6 +17,7 @@ export declare class OpenAiAdapter extends BaseProviderAdapter {
16
17
  formatTools(toolkit: Toolkit, _outputSchema?: JsonObject): ProviderToolDefinition[];
17
18
  formatOutputSchema(schema: JsonObject | NaturalSchema | z.ZodType): JsonObject;
18
19
  executeRequest(client: unknown, request: unknown): Promise<unknown>;
20
+ executeStreamRequest(client: unknown, request: unknown): AsyncIterable<LlmStreamChunk>;
19
21
  parseResponse(response: unknown, options?: LlmOperateOptions): ParsedResponse;
20
22
  extractToolCalls(response: unknown): StandardToolCall[];
21
23
  extractUsage(response: unknown, model: string): LlmUsageItem;
@@ -2,6 +2,7 @@ import { JsonObject, NaturalSchema } from "@jaypie/types";
2
2
  import { z } from "zod/v4";
3
3
  import { Toolkit } from "../../tools/Toolkit.class.js";
4
4
  import { LlmHistory, LlmOperateOptions, LlmUsageItem } from "../../types/LlmProvider.interface.js";
5
+ import { LlmStreamChunk } from "../../types/LlmStreamChunk.interface.js";
5
6
  import { ClassifiedError, OperateRequest, ParsedResponse, ProviderToolDefinition, StandardToolCall, StandardToolResult } from "../types.js";
6
7
  import { BaseProviderAdapter } from "./ProviderAdapter.interface.js";
7
8
  interface OpenRouterMessage {
@@ -78,6 +79,7 @@ export declare class OpenRouterAdapter extends BaseProviderAdapter {
78
79
  formatTools(toolkit: Toolkit, outputSchema?: JsonObject): ProviderToolDefinition[];
79
80
  formatOutputSchema(schema: JsonObject | NaturalSchema | z.ZodType): JsonObject;
80
81
  executeRequest(client: unknown, request: unknown): Promise<OpenRouterResponse>;
82
+ executeStreamRequest(client: unknown, request: unknown): AsyncIterable<LlmStreamChunk>;
81
83
  parseResponse(response: unknown, _options?: LlmOperateOptions): ParsedResponse;
82
84
  extractToolCalls(response: unknown): StandardToolCall[];
83
85
  extractUsage(response: unknown, model: string): LlmUsageItem;
@@ -1,6 +1,7 @@
1
1
  import { JsonObject, NaturalSchema } from "@jaypie/types";
2
2
  import { z } from "zod/v4";
3
3
  import { LlmHistory, LlmOperateOptions, LlmUsageItem } from "../../types/LlmProvider.interface.js";
4
+ import { LlmStreamChunk } from "../../types/LlmStreamChunk.interface.js";
4
5
  import { Toolkit } from "../../tools/Toolkit.class.js";
5
6
  import { ClassifiedError, OperateRequest, ParsedResponse, ProviderToolDefinition, StandardToolCall, StandardToolResult } from "../types.js";
6
7
  /**
@@ -49,6 +50,14 @@ export interface ProviderAdapter {
49
50
  * @returns Raw provider response
50
51
  */
51
52
  executeRequest(client: unknown, request: unknown): Promise<unknown>;
53
+ /**
54
+ * Execute a streaming API request to the provider
55
+ *
56
+ * @param client - The provider's SDK client instance
57
+ * @param request - Provider-specific request object (from buildRequest)
58
+ * @returns AsyncIterable of stream chunks
59
+ */
60
+ executeStreamRequest?(client: unknown, request: unknown): AsyncIterable<LlmStreamChunk>;
52
61
  /**
53
62
  * Parse a provider response into standardized format
54
63
  *
@@ -2,6 +2,8 @@ export { AnthropicAdapter, anthropicAdapter, BaseProviderAdapter, GeminiAdapter,
2
2
  export type { ProviderAdapter } from "./adapters/index.js";
3
3
  export { createOperateLoop, OperateLoop } from "./OperateLoop.js";
4
4
  export type { OperateLoopConfig } from "./OperateLoop.js";
5
+ export { createStreamLoop, StreamLoop } from "./StreamLoop.js";
6
+ export type { StreamLoopConfig } from "./StreamLoop.js";
5
7
  export { HookRunner, hookRunner } from "./hooks/index.js";
6
8
  export type { AfterModelResponseContext, AfterToolContext, BeforeModelRequestContext, BeforeToolContext, LlmHooks, RetryableErrorContext, ToolErrorContext, UnrecoverableErrorContext, } from "./hooks/index.js";
7
9
  export { InputProcessor, inputProcessor } from "./input/index.js";
@@ -1,9 +1,11 @@
1
1
  import { JsonObject } from "@jaypie/types";
2
2
  import { LlmHistory, LlmInputMessage, LlmMessageOptions, LlmOperateOptions, LlmOperateResponse, LlmProvider } from "../../types/LlmProvider.interface.js";
3
+ import { LlmStreamChunk } from "../../types/LlmStreamChunk.interface.js";
3
4
  export declare class AnthropicProvider implements LlmProvider {
4
5
  private model;
5
6
  private _client?;
6
7
  private _operateLoop?;
8
+ private _streamLoop?;
7
9
  private apiKey?;
8
10
  private log;
9
11
  private conversationHistory;
@@ -12,6 +14,8 @@ export declare class AnthropicProvider implements LlmProvider {
12
14
  });
13
15
  private getClient;
14
16
  private getOperateLoop;
17
+ private getStreamLoop;
15
18
  send(message: string, options?: LlmMessageOptions): Promise<string | JsonObject>;
16
19
  operate(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): Promise<LlmOperateResponse>;
20
+ stream(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): AsyncIterable<LlmStreamChunk>;
17
21
  }
@@ -1,9 +1,11 @@
1
1
  import { JsonObject } from "@jaypie/types";
2
2
  import { LlmHistory, LlmInputMessage, LlmMessageOptions, LlmOperateOptions, LlmOperateResponse, LlmProvider } from "../../types/LlmProvider.interface.js";
3
+ import { LlmStreamChunk } from "../../types/LlmStreamChunk.interface.js";
3
4
  export declare class GeminiProvider implements LlmProvider {
4
5
  private model;
5
6
  private _client?;
6
7
  private _operateLoop?;
8
+ private _streamLoop?;
7
9
  private apiKey?;
8
10
  private log;
9
11
  private conversationHistory;
@@ -12,6 +14,8 @@ export declare class GeminiProvider implements LlmProvider {
12
14
  });
13
15
  private getClient;
14
16
  private getOperateLoop;
17
+ private getStreamLoop;
15
18
  send(message: string, options?: LlmMessageOptions): Promise<string | JsonObject>;
16
19
  operate(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): Promise<LlmOperateResponse>;
20
+ stream(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): AsyncIterable<LlmStreamChunk>;
17
21
  }
@@ -1,9 +1,11 @@
1
1
  import { JsonObject } from "@jaypie/types";
2
2
  import { LlmHistory, LlmInputMessage, LlmMessageOptions, LlmOperateOptions, LlmOperateResponse, LlmProvider } from "../../types/LlmProvider.interface.js";
3
+ import { LlmStreamChunk } from "../../types/LlmStreamChunk.interface.js";
3
4
  export declare class OpenAiProvider implements LlmProvider {
4
5
  private model;
5
6
  private _client?;
6
7
  private _operateLoop?;
8
+ private _streamLoop?;
7
9
  private apiKey?;
8
10
  private log;
9
11
  private conversationHistory;
@@ -12,6 +14,8 @@ export declare class OpenAiProvider implements LlmProvider {
12
14
  });
13
15
  private getClient;
14
16
  private getOperateLoop;
17
+ private getStreamLoop;
15
18
  send(message: string, options?: LlmMessageOptions): Promise<string | JsonObject>;
16
19
  operate(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): Promise<LlmOperateResponse>;
20
+ stream(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): AsyncIterable<LlmStreamChunk>;
17
21
  }
@@ -1,9 +1,11 @@
1
1
  import { JsonObject } from "@jaypie/types";
2
2
  import { LlmHistory, LlmInputMessage, LlmMessageOptions, LlmOperateOptions, LlmOperateResponse, LlmProvider } from "../../types/LlmProvider.interface.js";
3
+ import { LlmStreamChunk } from "../../types/LlmStreamChunk.interface.js";
3
4
  export declare class OpenRouterProvider implements LlmProvider {
4
5
  private model;
5
6
  private _client?;
6
7
  private _operateLoop?;
8
+ private _streamLoop?;
7
9
  private apiKey?;
8
10
  private log;
9
11
  private conversationHistory;
@@ -12,6 +14,8 @@ export declare class OpenRouterProvider implements LlmProvider {
12
14
  });
13
15
  private getClient;
14
16
  private getOperateLoop;
17
+ private getStreamLoop;
15
18
  send(message: string, options?: LlmMessageOptions): Promise<string | JsonObject>;
16
19
  operate(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): Promise<LlmOperateResponse>;
20
+ stream(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): AsyncIterable<LlmStreamChunk>;
17
21
  }
@@ -1,6 +1,7 @@
1
1
  import { AnyValue, JsonObject, JsonReturn, NaturalMap, NaturalSchema } from "@jaypie/types";
2
2
  import { z } from "zod/v4";
3
3
  import { LlmTool } from "./LlmTool.interface.js";
4
+ import { LlmStreamChunk } from "./LlmStreamChunk.interface.js";
4
5
  import { Toolkit } from "../tools/Toolkit.class.js";
5
6
  export declare enum LlmMessageRole {
6
7
  Assistant = "assistant",
@@ -194,5 +195,6 @@ export interface LlmOperateResponse {
194
195
  export interface LlmProvider {
195
196
  operate?(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): Promise<LlmOperateResponse>;
196
197
  send(message: string, options?: LlmMessageOptions): Promise<string | JsonObject>;
198
+ stream?(input: string | LlmHistory | LlmInputMessage, options?: LlmOperateOptions): AsyncIterable<LlmStreamChunk>;
197
199
  }
198
200
  export {};
@@ -0,0 +1,41 @@
1
+ import { LlmUsage } from "./LlmProvider.interface.js";
2
+ export declare enum LlmStreamChunkType {
3
+ Done = "done",
4
+ Error = "error",
5
+ Text = "text",
6
+ ToolCall = "tool_call",
7
+ ToolResult = "tool_result"
8
+ }
9
+ export interface LlmStreamChunkText {
10
+ type: LlmStreamChunkType.Text;
11
+ content: string;
12
+ }
13
+ export interface LlmStreamChunkToolCall {
14
+ type: LlmStreamChunkType.ToolCall;
15
+ toolCall: {
16
+ id: string;
17
+ name: string;
18
+ arguments: string;
19
+ };
20
+ }
21
+ export interface LlmStreamChunkToolResult {
22
+ type: LlmStreamChunkType.ToolResult;
23
+ toolResult: {
24
+ id: string;
25
+ name: string;
26
+ result: unknown;
27
+ };
28
+ }
29
+ export interface LlmStreamChunkDone {
30
+ type: LlmStreamChunkType.Done;
31
+ usage: LlmUsage;
32
+ }
33
+ export interface LlmStreamChunkError {
34
+ type: LlmStreamChunkType.Error;
35
+ error: {
36
+ detail?: string;
37
+ status: number | string;
38
+ title: string;
39
+ };
40
+ }
41
+ export type LlmStreamChunk = LlmStreamChunkDone | LlmStreamChunkError | LlmStreamChunkText | LlmStreamChunkToolCall | LlmStreamChunkToolResult;
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@jaypie/llm",
3
- "version": "1.2.0-rc.1",
3
+ "version": "1.2.0-rc.3",
4
4
  "description": "Large language model utilities",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "https://github.com/finlaysonstudio/jaypie"
7
+ "url": "git+https://github.com/finlaysonstudio/jaypie.git"
8
8
  },
9
9
  "license": "MIT",
10
10
  "author": "Finlayson Studio",
@@ -32,8 +32,8 @@
32
32
  "typecheck": "tsc --noEmit"
33
33
  },
34
34
  "dependencies": {
35
- "@jaypie/aws": "1.2.0-rc.1",
36
- "@jaypie/errors": "1.2.0-rc.1",
35
+ "@jaypie/aws": "1.2.0-rc.2",
36
+ "@jaypie/errors": "1.2.0-rc.2",
37
37
  "openai": "^6.9.1",
38
38
  "openmeteo": "^1.2.0",
39
39
  "random": "^5.3.0",
@@ -49,6 +49,8 @@
49
49
  "peerDependencies": {
50
50
  "@anthropic-ai/sdk": "^0.71.0",
51
51
  "@google/genai": "^1.30.0",
52
+ "@jaypie/kit": "^1.2.0-rc.2",
53
+ "@jaypie/logger": "^1.2.0-rc.2",
52
54
  "@openrouter/sdk": "^0.1.27"
53
55
  },
54
56
  "peerDependenciesMeta": {