@luketandjung/ariadne 2.0.0 → 2.1.1
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/AgentRunner.d.ts +164 -0
- package/dist/AgentRunner.d.ts.map +1 -0
- package/dist/AgentRunner.js +262 -0
- package/dist/AgentRunner.js.map +1 -0
- package/dist/AiError.d.ts +606 -0
- package/dist/AiError.d.ts.map +1 -0
- package/dist/AiError.js +601 -0
- package/dist/AiError.js.map +1 -0
- package/dist/Chat.d.ts +509 -0
- package/dist/Chat.d.ts.map +1 -0
- package/dist/Chat.js +426 -0
- package/dist/Chat.js.map +1 -0
- package/dist/EmbeddingModel.d.ts +153 -0
- package/dist/EmbeddingModel.d.ts.map +1 -0
- package/dist/EmbeddingModel.js +164 -0
- package/dist/EmbeddingModel.js.map +1 -0
- package/dist/IdGenerator.d.ts +272 -0
- package/dist/IdGenerator.d.ts.map +1 -0
- package/dist/IdGenerator.js +229 -0
- package/dist/IdGenerator.js.map +1 -0
- package/dist/LanguageModel.d.ts +531 -0
- package/dist/LanguageModel.d.ts.map +1 -0
- package/dist/LanguageModel.js +735 -0
- package/dist/LanguageModel.js.map +1 -0
- package/dist/McpRegistry.d.ts +164 -0
- package/dist/McpRegistry.d.ts.map +1 -0
- package/dist/McpRegistry.js +127 -0
- package/dist/McpRegistry.js.map +1 -0
- package/dist/McpSchema.d.ts +2832 -0
- package/dist/McpSchema.d.ts.map +1 -0
- package/dist/McpSchema.js +1678 -0
- package/dist/McpSchema.js.map +1 -0
- package/dist/McpServer.d.ts +368 -0
- package/dist/McpServer.d.ts.map +1 -0
- package/dist/McpServer.js +789 -0
- package/dist/McpServer.js.map +1 -0
- package/dist/Model.d.ts +124 -0
- package/dist/Model.d.ts.map +1 -0
- package/dist/Model.js +107 -0
- package/dist/Model.js.map +1 -0
- package/dist/Prompt.d.ts +1308 -0
- package/dist/Prompt.d.ts.map +1 -0
- package/dist/Prompt.js +837 -0
- package/dist/Prompt.js.map +1 -0
- package/dist/Response.d.ts +1869 -0
- package/dist/Response.d.ts.map +1 -0
- package/dist/Response.js +714 -0
- package/dist/Response.js.map +1 -0
- package/dist/Telemetry.d.ts +464 -0
- package/dist/Telemetry.d.ts.map +1 -0
- package/dist/Telemetry.js +170 -0
- package/dist/Telemetry.js.map +1 -0
- package/dist/Tokenizer.d.ts +154 -0
- package/dist/Tokenizer.d.ts.map +1 -0
- package/dist/Tokenizer.js +126 -0
- package/dist/Tokenizer.js.map +1 -0
- package/dist/Tool.d.ts +967 -0
- package/dist/Tool.d.ts.map +1 -0
- package/dist/Tool.js +615 -0
- package/dist/Tool.js.map +1 -0
- package/dist/Toolkit.d.ts +314 -0
- package/dist/Toolkit.d.ts.map +1 -0
- package/dist/Toolkit.js +277 -0
- package/dist/Toolkit.js.map +1 -0
- package/dist/index.d.ts +584 -10009
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +585 -3638
- package/dist/index.js.map +1 -0
- package/package.json +16 -16
- package/dist/index.cjs +0 -3672
- package/dist/index.d.cts +0 -10010
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `AgentRunner` module provides agentic loop capabilities for AI language
|
|
3
|
+
* models.
|
|
4
|
+
*
|
|
5
|
+
* This module enables multi-turn inference loops where the language model can
|
|
6
|
+
* iteratively call tools and receive results until it produces a final answer.
|
|
7
|
+
* It wraps the `LanguageModel` service to provide this functionality while
|
|
8
|
+
* maintaining full compatibility with the existing API surface.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { AgentRunner, LanguageModel, Toolkit, Tool } from "ariadne"
|
|
13
|
+
* import { Effect, Schema } from "effect"
|
|
14
|
+
*
|
|
15
|
+
* // Define tools
|
|
16
|
+
* const SearchTool = Tool.make("search", {
|
|
17
|
+
* description: "Search the web",
|
|
18
|
+
* parameters: { query: Schema.String },
|
|
19
|
+
* success: Schema.String,
|
|
20
|
+
* })
|
|
21
|
+
*
|
|
22
|
+
* const MyToolkit = Toolkit.make(SearchTool)
|
|
23
|
+
*
|
|
24
|
+
* // Use LanguageModel as usual
|
|
25
|
+
* const program = LanguageModel.generateText({
|
|
26
|
+
* prompt: "Research the latest AI developments",
|
|
27
|
+
* toolkit: MyToolkit,
|
|
28
|
+
* })
|
|
29
|
+
*
|
|
30
|
+
* // Add AgentRunner.ReAct to enable multi-turn loop
|
|
31
|
+
* program.pipe(
|
|
32
|
+
* Effect.provide(MyToolkitLive),
|
|
33
|
+
* Effect.provide(AgentRunner.ReAct),
|
|
34
|
+
* Effect.provide(AgentRunner.defaultConfig),
|
|
35
|
+
* Effect.provide(Gpt4oMini),
|
|
36
|
+
* Effect.provide(Dedalus),
|
|
37
|
+
* Effect.runPromise
|
|
38
|
+
* )
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @since 1.0.0
|
|
42
|
+
*/
|
|
43
|
+
import * as Context from "effect/Context";
|
|
44
|
+
import * as Effect from "effect/Effect";
|
|
45
|
+
import * as Layer from "effect/Layer";
|
|
46
|
+
import * as LanguageModel from "./LanguageModel.js";
|
|
47
|
+
declare const Config_base: Context.TagClass<Config, "ariadne/AgentRunner/Config", Config.Service>;
|
|
48
|
+
/**
|
|
49
|
+
* The `Config` service tag for AgentRunner configuration.
|
|
50
|
+
*
|
|
51
|
+
* This tag provides access to runner configuration like maximum turns
|
|
52
|
+
* throughout your application.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* import { AgentRunner } from "ariadne"
|
|
57
|
+
* import { Effect } from "effect"
|
|
58
|
+
*
|
|
59
|
+
* // Use default config
|
|
60
|
+
* program.pipe(
|
|
61
|
+
* Effect.provide(AgentRunner.defaultConfig)
|
|
62
|
+
* )
|
|
63
|
+
*
|
|
64
|
+
* // Or provide custom config
|
|
65
|
+
* program.pipe(
|
|
66
|
+
* Effect.provide(Layer.succeed(AgentRunner.Config, { maxTurns: 20 }))
|
|
67
|
+
* )
|
|
68
|
+
* ```
|
|
69
|
+
*
|
|
70
|
+
* @since 1.0.0
|
|
71
|
+
* @category Context
|
|
72
|
+
*/
|
|
73
|
+
export declare class Config extends Config_base {
|
|
74
|
+
/**
|
|
75
|
+
* Retrieves the config from context, or undefined if not present.
|
|
76
|
+
*
|
|
77
|
+
* @since 1.0.0
|
|
78
|
+
*/
|
|
79
|
+
static readonly getOrUndefined: Effect.Effect<Config.Service | undefined>;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* @since 1.0.0
|
|
83
|
+
*/
|
|
84
|
+
export declare namespace Config {
|
|
85
|
+
/**
|
|
86
|
+
* Configuration options for the AgentRunner.
|
|
87
|
+
*
|
|
88
|
+
* @since 1.0.0
|
|
89
|
+
* @category Models
|
|
90
|
+
*/
|
|
91
|
+
interface Service {
|
|
92
|
+
/**
|
|
93
|
+
* Maximum number of inference turns before stopping the loop.
|
|
94
|
+
* Each turn represents one call to the language model.
|
|
95
|
+
*
|
|
96
|
+
* @default 10
|
|
97
|
+
*/
|
|
98
|
+
readonly maxTurns?: number | undefined;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Default configuration layer for AgentRunner.
|
|
103
|
+
*
|
|
104
|
+
* Provides sensible defaults:
|
|
105
|
+
* - `maxTurns`: 10
|
|
106
|
+
*
|
|
107
|
+
* @since 1.0.0
|
|
108
|
+
* @category Layers
|
|
109
|
+
*/
|
|
110
|
+
export declare const defaultConfig: Layer.Layer<Config>;
|
|
111
|
+
/**
|
|
112
|
+
* ReAct (Reason + Act) loop layer that wraps LanguageModel.
|
|
113
|
+
*
|
|
114
|
+
* When provided, this layer intercepts LanguageModel calls and runs them
|
|
115
|
+
* in a loop until the model stops requesting tool calls. This enables
|
|
116
|
+
* multi-turn agentic behavior where the model can iteratively:
|
|
117
|
+
* 1. Analyze the current state
|
|
118
|
+
* 2. Decide to call tools (local or MCP server-side)
|
|
119
|
+
* 3. Receive tool results
|
|
120
|
+
* 4. Continue reasoning until producing a final answer
|
|
121
|
+
*
|
|
122
|
+
* The loop terminates when:
|
|
123
|
+
* - The model produces a response without tool calls (`finishReason === "stop"`)
|
|
124
|
+
* - The model hits a token limit (`finishReason === "length"`)
|
|
125
|
+
* - Content is filtered (`finishReason === "content-filter"`)
|
|
126
|
+
* - Maximum turns is reached (configured via `Config`)
|
|
127
|
+
*
|
|
128
|
+
* MCP tools are handled automatically - they execute server-side and their
|
|
129
|
+
* results are included in the response. The loop continues based on whether
|
|
130
|
+
* there are additional local tool calls to process.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```ts
|
|
134
|
+
* import { AgentRunner, LanguageModel } from "ariadne"
|
|
135
|
+
* import { Effect } from "effect"
|
|
136
|
+
*
|
|
137
|
+
* const program = LanguageModel.generateText({
|
|
138
|
+
* prompt: "Research and summarize AI trends",
|
|
139
|
+
* toolkit: MyToolkit,
|
|
140
|
+
* })
|
|
141
|
+
*
|
|
142
|
+
* // Single-step (without AgentRunner)
|
|
143
|
+
* program.pipe(
|
|
144
|
+
* Effect.provide(MyToolkitLive),
|
|
145
|
+
* Effect.provide(Gpt4oMini),
|
|
146
|
+
* Effect.provide(Dedalus),
|
|
147
|
+
* )
|
|
148
|
+
*
|
|
149
|
+
* // Multi-step loop (with AgentRunner)
|
|
150
|
+
* program.pipe(
|
|
151
|
+
* Effect.provide(MyToolkitLive),
|
|
152
|
+
* Effect.provide(AgentRunner.ReAct),
|
|
153
|
+
* Effect.provide(AgentRunner.defaultConfig),
|
|
154
|
+
* Effect.provide(Gpt4oMini),
|
|
155
|
+
* Effect.provide(Dedalus),
|
|
156
|
+
* )
|
|
157
|
+
* ```
|
|
158
|
+
*
|
|
159
|
+
* @since 1.0.0
|
|
160
|
+
* @category Layers
|
|
161
|
+
*/
|
|
162
|
+
export declare const ReAct: Layer.Layer<LanguageModel.LanguageModel, never, LanguageModel.LanguageModel | Config>;
|
|
163
|
+
export {};
|
|
164
|
+
//# sourceMappingURL=AgentRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentRunner.d.ts","sourceRoot":"","sources":["../src/AgentRunner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAItC,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAC;;AASpD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,MAAO,SAAQ,WAGzB;IACC;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC,CAGnE;CACT;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,UAAiB,OAAO;QACpB;;;;;WAKG;QACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAC1C;CACJ;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAE5C,CAAC;AAMH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAC3B,aAAa,CAAC,aAAa,EAC3B,KAAK,EACL,aAAa,CAAC,aAAa,GAAG,MAAM,CA0OvC,CAAC"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The `AgentRunner` module provides agentic loop capabilities for AI language
|
|
3
|
+
* models.
|
|
4
|
+
*
|
|
5
|
+
* This module enables multi-turn inference loops where the language model can
|
|
6
|
+
* iteratively call tools and receive results until it produces a final answer.
|
|
7
|
+
* It wraps the `LanguageModel` service to provide this functionality while
|
|
8
|
+
* maintaining full compatibility with the existing API surface.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* import { AgentRunner, LanguageModel, Toolkit, Tool } from "ariadne"
|
|
13
|
+
* import { Effect, Schema } from "effect"
|
|
14
|
+
*
|
|
15
|
+
* // Define tools
|
|
16
|
+
* const SearchTool = Tool.make("search", {
|
|
17
|
+
* description: "Search the web",
|
|
18
|
+
* parameters: { query: Schema.String },
|
|
19
|
+
* success: Schema.String,
|
|
20
|
+
* })
|
|
21
|
+
*
|
|
22
|
+
* const MyToolkit = Toolkit.make(SearchTool)
|
|
23
|
+
*
|
|
24
|
+
* // Use LanguageModel as usual
|
|
25
|
+
* const program = LanguageModel.generateText({
|
|
26
|
+
* prompt: "Research the latest AI developments",
|
|
27
|
+
* toolkit: MyToolkit,
|
|
28
|
+
* })
|
|
29
|
+
*
|
|
30
|
+
* // Add AgentRunner.ReAct to enable multi-turn loop
|
|
31
|
+
* program.pipe(
|
|
32
|
+
* Effect.provide(MyToolkitLive),
|
|
33
|
+
* Effect.provide(AgentRunner.ReAct),
|
|
34
|
+
* Effect.provide(AgentRunner.defaultConfig),
|
|
35
|
+
* Effect.provide(Gpt4oMini),
|
|
36
|
+
* Effect.provide(Dedalus),
|
|
37
|
+
* Effect.runPromise
|
|
38
|
+
* )
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @since 1.0.0
|
|
42
|
+
*/
|
|
43
|
+
import * as Context from "effect/Context";
|
|
44
|
+
import * as Effect from "effect/Effect";
|
|
45
|
+
import * as Layer from "effect/Layer";
|
|
46
|
+
import * as Ref from "effect/Ref";
|
|
47
|
+
import * as Stream from "effect/Stream";
|
|
48
|
+
import * as LanguageModel from "./LanguageModel.js";
|
|
49
|
+
import * as Prompt from "./Prompt.js";
|
|
50
|
+
// =============================================================================
|
|
51
|
+
// Configuration
|
|
52
|
+
// =============================================================================
|
|
53
|
+
/**
|
|
54
|
+
* The `Config` service tag for AgentRunner configuration.
|
|
55
|
+
*
|
|
56
|
+
* This tag provides access to runner configuration like maximum turns
|
|
57
|
+
* throughout your application.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* import { AgentRunner } from "ariadne"
|
|
62
|
+
* import { Effect } from "effect"
|
|
63
|
+
*
|
|
64
|
+
* // Use default config
|
|
65
|
+
* program.pipe(
|
|
66
|
+
* Effect.provide(AgentRunner.defaultConfig)
|
|
67
|
+
* )
|
|
68
|
+
*
|
|
69
|
+
* // Or provide custom config
|
|
70
|
+
* program.pipe(
|
|
71
|
+
* Effect.provide(Layer.succeed(AgentRunner.Config, { maxTurns: 20 }))
|
|
72
|
+
* )
|
|
73
|
+
* ```
|
|
74
|
+
*
|
|
75
|
+
* @since 1.0.0
|
|
76
|
+
* @category Context
|
|
77
|
+
*/
|
|
78
|
+
export class Config extends Context.Tag("ariadne/AgentRunner/Config")() {
|
|
79
|
+
/**
|
|
80
|
+
* Retrieves the config from context, or undefined if not present.
|
|
81
|
+
*
|
|
82
|
+
* @since 1.0.0
|
|
83
|
+
*/
|
|
84
|
+
static getOrUndefined = Effect.map(Effect.context(), (context) => context.unsafeMap.get(Config.key));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Default configuration layer for AgentRunner.
|
|
88
|
+
*
|
|
89
|
+
* Provides sensible defaults:
|
|
90
|
+
* - `maxTurns`: 10
|
|
91
|
+
*
|
|
92
|
+
* @since 1.0.0
|
|
93
|
+
* @category Layers
|
|
94
|
+
*/
|
|
95
|
+
export const defaultConfig = Layer.succeed(Config, {
|
|
96
|
+
maxTurns: 10,
|
|
97
|
+
});
|
|
98
|
+
// =============================================================================
|
|
99
|
+
// ReAct Loop Implementation
|
|
100
|
+
// =============================================================================
|
|
101
|
+
/**
|
|
102
|
+
* ReAct (Reason + Act) loop layer that wraps LanguageModel.
|
|
103
|
+
*
|
|
104
|
+
* When provided, this layer intercepts LanguageModel calls and runs them
|
|
105
|
+
* in a loop until the model stops requesting tool calls. This enables
|
|
106
|
+
* multi-turn agentic behavior where the model can iteratively:
|
|
107
|
+
* 1. Analyze the current state
|
|
108
|
+
* 2. Decide to call tools (local or MCP server-side)
|
|
109
|
+
* 3. Receive tool results
|
|
110
|
+
* 4. Continue reasoning until producing a final answer
|
|
111
|
+
*
|
|
112
|
+
* The loop terminates when:
|
|
113
|
+
* - The model produces a response without tool calls (`finishReason === "stop"`)
|
|
114
|
+
* - The model hits a token limit (`finishReason === "length"`)
|
|
115
|
+
* - Content is filtered (`finishReason === "content-filter"`)
|
|
116
|
+
* - Maximum turns is reached (configured via `Config`)
|
|
117
|
+
*
|
|
118
|
+
* MCP tools are handled automatically - they execute server-side and their
|
|
119
|
+
* results are included in the response. The loop continues based on whether
|
|
120
|
+
* there are additional local tool calls to process.
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* ```ts
|
|
124
|
+
* import { AgentRunner, LanguageModel } from "ariadne"
|
|
125
|
+
* import { Effect } from "effect"
|
|
126
|
+
*
|
|
127
|
+
* const program = LanguageModel.generateText({
|
|
128
|
+
* prompt: "Research and summarize AI trends",
|
|
129
|
+
* toolkit: MyToolkit,
|
|
130
|
+
* })
|
|
131
|
+
*
|
|
132
|
+
* // Single-step (without AgentRunner)
|
|
133
|
+
* program.pipe(
|
|
134
|
+
* Effect.provide(MyToolkitLive),
|
|
135
|
+
* Effect.provide(Gpt4oMini),
|
|
136
|
+
* Effect.provide(Dedalus),
|
|
137
|
+
* )
|
|
138
|
+
*
|
|
139
|
+
* // Multi-step loop (with AgentRunner)
|
|
140
|
+
* program.pipe(
|
|
141
|
+
* Effect.provide(MyToolkitLive),
|
|
142
|
+
* Effect.provide(AgentRunner.ReAct),
|
|
143
|
+
* Effect.provide(AgentRunner.defaultConfig),
|
|
144
|
+
* Effect.provide(Gpt4oMini),
|
|
145
|
+
* Effect.provide(Dedalus),
|
|
146
|
+
* )
|
|
147
|
+
* ```
|
|
148
|
+
*
|
|
149
|
+
* @since 1.0.0
|
|
150
|
+
* @category Layers
|
|
151
|
+
*/
|
|
152
|
+
export const ReAct = Layer.effect(LanguageModel.LanguageModel, Effect.gen(function* () {
|
|
153
|
+
const underlying = yield* LanguageModel.LanguageModel;
|
|
154
|
+
const config = yield* Config.getOrUndefined;
|
|
155
|
+
const maxTurns = config?.maxTurns ?? 10;
|
|
156
|
+
const shouldTerminate = (finishReason) => finishReason === "stop" ||
|
|
157
|
+
finishReason === "length" ||
|
|
158
|
+
finishReason === "content-filter" ||
|
|
159
|
+
finishReason === "error" ||
|
|
160
|
+
finishReason === "unknown";
|
|
161
|
+
// Filter out finish parts from intermediate turns to ensure the final
|
|
162
|
+
// response's finishReason reflects the actual termination condition
|
|
163
|
+
const excludeFinishParts = (content) => content.filter((p) => p.type !== "finish");
|
|
164
|
+
const generateText = (options) => Effect.gen(function* () {
|
|
165
|
+
const history = yield* Ref.make(Prompt.make(options.prompt));
|
|
166
|
+
let turns = 0;
|
|
167
|
+
let allContent = [];
|
|
168
|
+
while (turns < maxTurns) {
|
|
169
|
+
turns++;
|
|
170
|
+
const currentPrompt = yield* Ref.get(history);
|
|
171
|
+
const response = yield* underlying.generateText({
|
|
172
|
+
...options,
|
|
173
|
+
prompt: currentPrompt,
|
|
174
|
+
});
|
|
175
|
+
if (shouldTerminate(response.finishReason)) {
|
|
176
|
+
allContent = [...allContent, ...response.content];
|
|
177
|
+
return new LanguageModel.GenerateTextResponse(allContent);
|
|
178
|
+
}
|
|
179
|
+
allContent = [
|
|
180
|
+
...allContent,
|
|
181
|
+
...excludeFinishParts(response.content),
|
|
182
|
+
];
|
|
183
|
+
const newPrompt = Prompt.merge(currentPrompt, Prompt.fromResponseParts(response.content));
|
|
184
|
+
yield* Ref.set(history, newPrompt);
|
|
185
|
+
}
|
|
186
|
+
return new LanguageModel.GenerateTextResponse(allContent);
|
|
187
|
+
});
|
|
188
|
+
const generateObject = (options) => Effect.gen(function* () {
|
|
189
|
+
const history = yield* Ref.make(Prompt.make(options.prompt));
|
|
190
|
+
let turns = 0;
|
|
191
|
+
let allContent = [];
|
|
192
|
+
let finalValue;
|
|
193
|
+
while (turns < maxTurns) {
|
|
194
|
+
turns++;
|
|
195
|
+
const currentPrompt = yield* Ref.get(history);
|
|
196
|
+
const response = yield* underlying.generateObject({
|
|
197
|
+
...options,
|
|
198
|
+
prompt: currentPrompt,
|
|
199
|
+
});
|
|
200
|
+
finalValue = response.value;
|
|
201
|
+
if (shouldTerminate(response.finishReason)) {
|
|
202
|
+
allContent = [...allContent, ...response.content];
|
|
203
|
+
return new LanguageModel.GenerateObjectResponse(finalValue, allContent);
|
|
204
|
+
}
|
|
205
|
+
allContent = [
|
|
206
|
+
...allContent,
|
|
207
|
+
...excludeFinishParts(response.content),
|
|
208
|
+
];
|
|
209
|
+
const newPrompt = Prompt.merge(currentPrompt, Prompt.fromResponseParts(response.content));
|
|
210
|
+
yield* Ref.set(history, newPrompt);
|
|
211
|
+
}
|
|
212
|
+
return new LanguageModel.GenerateObjectResponse(finalValue, allContent);
|
|
213
|
+
});
|
|
214
|
+
const streamText = (options) => {
|
|
215
|
+
const history = Ref.unsafeMake(Prompt.make(options.prompt));
|
|
216
|
+
let turns = 0;
|
|
217
|
+
const runTurn = () => Stream.unwrap(Effect.gen(function* () {
|
|
218
|
+
if (turns >= maxTurns) {
|
|
219
|
+
return Stream.empty;
|
|
220
|
+
}
|
|
221
|
+
turns++;
|
|
222
|
+
const currentPrompt = yield* Ref.get(history);
|
|
223
|
+
let accumulatedParts = [];
|
|
224
|
+
let finishReason = "unknown";
|
|
225
|
+
const innerStream = underlying
|
|
226
|
+
.streamText({
|
|
227
|
+
...options,
|
|
228
|
+
prompt: currentPrompt,
|
|
229
|
+
})
|
|
230
|
+
.pipe(Stream.tap((part) => Effect.sync(() => {
|
|
231
|
+
accumulatedParts.push(part);
|
|
232
|
+
if (part.type === "finish") {
|
|
233
|
+
finishReason = part.reason;
|
|
234
|
+
}
|
|
235
|
+
})));
|
|
236
|
+
const continueOrEnd = Effect.gen(function* () {
|
|
237
|
+
if (!shouldTerminate(finishReason)) {
|
|
238
|
+
const currentPrompt = yield* Ref.get(history);
|
|
239
|
+
const newPrompt = Prompt.merge(currentPrompt, Prompt.fromResponseParts(accumulatedParts));
|
|
240
|
+
yield* Ref.set(history, newPrompt);
|
|
241
|
+
return runTurn();
|
|
242
|
+
}
|
|
243
|
+
return Stream.empty;
|
|
244
|
+
});
|
|
245
|
+
return Stream.concat(innerStream, Stream.unwrap(continueOrEnd));
|
|
246
|
+
}));
|
|
247
|
+
return runTurn();
|
|
248
|
+
};
|
|
249
|
+
const streamObject = (options) =>
|
|
250
|
+
// For streamObject, the loop behavior is less common since we're
|
|
251
|
+
// extracting a structured object. Delegate to underlying without
|
|
252
|
+
// looping - tool calls during object generation typically need
|
|
253
|
+
// different handling than iterative refinement.
|
|
254
|
+
underlying.streamObject(options);
|
|
255
|
+
return {
|
|
256
|
+
generateText,
|
|
257
|
+
generateObject,
|
|
258
|
+
streamText,
|
|
259
|
+
streamObject,
|
|
260
|
+
};
|
|
261
|
+
}));
|
|
262
|
+
//# sourceMappingURL=AgentRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgentRunner.js","sourceRoot":"","sources":["../src/AgentRunner.ts"],"names":[],"mappings":"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"}
|