@effect-agent/testing 0.1.0-beta.8 → 0.1.0-beta.81
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/Certification.d.mts +105 -0
- package/dist/Certification.mjs +592 -0
- package/dist/Certification.mjs.map +1 -0
- package/dist/Chaos.d.mts +126 -0
- package/dist/Chaos.mjs +755 -0
- package/dist/Chaos.mjs.map +1 -0
- package/dist/CodeExecutorConformance.d.mts +33 -0
- package/dist/CodeExecutorConformance.mjs +231 -0
- package/dist/CodeExecutorConformance.mjs.map +1 -0
- package/dist/CodeExecutorSubstitute.d.mts +21 -0
- package/dist/CodeExecutorSubstitute.mjs +368 -0
- package/dist/CodeExecutorSubstitute.mjs.map +1 -0
- package/dist/DocsResearcher.d.mts +270 -0
- package/dist/DocsResearcher.mjs +490 -0
- package/dist/DocsResearcher.mjs.map +1 -0
- package/dist/ScriptedModel-DAvxIiud.d.mts +220 -0
- package/dist/ScriptedModel.d.mts +2 -0
- package/dist/ScriptedModel.mjs +155 -0
- package/dist/ScriptedModel.mjs.map +1 -0
- package/dist/TravelPlanner.d.mts +1665 -0
- package/dist/TravelPlanner.mjs +1963 -0
- package/dist/TravelPlanner.mjs.map +1 -0
- package/dist/deterministic-layers-Eka0fMZq.mjs +358 -0
- package/dist/deterministic-layers-Eka0fMZq.mjs.map +1 -0
- package/dist/index.d.mts +2 -3406
- package/dist/index.mjs +2 -4771
- package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
- package/package.json +1 -48
- package/src/{certification.ts → Certification.ts} +251 -117
- package/src/{chaos.ts → Chaos.ts} +246 -122
- package/src/{code-executor-conformance.ts → CodeExecutorConformance.ts} +29 -6
- package/src/{code-executor-substitute.ts → CodeExecutorSubstitute.ts} +112 -45
- package/src/{fixtures/docs-researcher/index.ts → DocsResearcher.ts} +68 -5
- package/src/{scripted-model.ts → ScriptedModel.ts} +22 -25
- package/src/TravelPlanner.ts +232 -0
- package/src/fixtures/docs-researcher/definition.ts +19 -10
- package/src/fixtures/docs-researcher/harness.ts +41 -30
- package/src/fixtures/docs-researcher/mcp.ts +49 -3
- package/src/fixtures/travel-planner/definition.ts +15 -2
- package/src/fixtures/travel-planner/deterministic-layers.ts +47 -4
- package/src/fixtures/travel-planner/phase2.ts +4 -3
- package/src/fixtures/travel-planner/phase3.ts +18 -41
- package/src/fixtures/travel-planner/phase4.ts +23 -36
- package/src/fixtures/travel-planner/phase5.ts +38 -41
- package/src/fixtures/travel-planner/phase6.ts +187 -84
- package/src/fixtures/travel-planner/phase7.ts +4 -102
- package/src/fixtures/travel-planner/scenarios.ts +3 -4
- package/src/fixtures/travel-planner/subagents-durable.ts +33 -57
- package/src/fixtures/travel-planner/subagents.ts +35 -13
- package/src/index.ts +1 -11
- package/dist/index.mjs.map +0 -1
- package/src/code-executor-conformance.d.ts +0 -30
- package/src/fixtures/travel-planner/index.ts +0 -11
- package/src/fixtures/warehouse/index.ts +0 -412
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { Context, Effect, Layer, Schema } from "effect";
|
|
2
|
+
import { AiError, LanguageModel, Response } from "effect/unstable/ai";
|
|
3
|
+
declare namespace ScriptedModel_d_exports {
|
|
4
|
+
export { ScriptedGeneratePart, ScriptedGenerateTurn, ScriptedModel, ScriptedRequest, ScriptedRequestKind, ScriptedStreamPart, ScriptedStreamTermination, ScriptedStreamTurn, ScriptedTurn, ScriptedTurnHooks, ScriptedTurnInput };
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Schema for encoded, non-streaming Effect AI response parts.
|
|
8
|
+
*
|
|
9
|
+
* Generic Tool payloads remain explicitly unknown here. `LanguageModel.make`
|
|
10
|
+
* performs the toolkit-specific decode when the scripted response is consumed.
|
|
11
|
+
*/
|
|
12
|
+
declare const ScriptedGeneratePart: Schema.Union<readonly [Schema.toEncoded<Schema.Codec<Response.Part<{}, false>, Response.PartEncoded, never, never>>, Schema.toEncoded<Schema.Struct<{
|
|
13
|
+
readonly type: Schema.tag<"reasoning-delta">;
|
|
14
|
+
readonly id: Schema.String;
|
|
15
|
+
readonly delta: Schema.String;
|
|
16
|
+
readonly "~effect/ai/Content/Part": Schema.withDecodingDefaultKey<Schema.tag<"~effect/ai/Content/Part">>;
|
|
17
|
+
readonly metadata: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.Codec<Schema.Json>>>;
|
|
18
|
+
}>>, Schema.toEncoded<Schema.Struct<{
|
|
19
|
+
readonly type: Schema.tag<"reasoning-end">;
|
|
20
|
+
readonly id: Schema.String;
|
|
21
|
+
readonly "~effect/ai/Content/Part": Schema.withDecodingDefaultKey<Schema.tag<"~effect/ai/Content/Part">>;
|
|
22
|
+
readonly metadata: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.Codec<Schema.Json>>>;
|
|
23
|
+
}>>, Schema.Struct<{
|
|
24
|
+
readonly metadata: Schema.optionalKey<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>>>;
|
|
25
|
+
readonly type: Schema.Literal<"tool-call">;
|
|
26
|
+
readonly id: Schema.String;
|
|
27
|
+
readonly name: Schema.String;
|
|
28
|
+
readonly params: Schema.Unknown;
|
|
29
|
+
readonly providerExecuted: Schema.optionalKey<Schema.Boolean>;
|
|
30
|
+
}>, Schema.Struct<{
|
|
31
|
+
readonly metadata: Schema.optionalKey<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>>>;
|
|
32
|
+
readonly type: Schema.Literal<"tool-result">;
|
|
33
|
+
readonly id: Schema.String;
|
|
34
|
+
readonly name: Schema.String;
|
|
35
|
+
readonly result: Schema.Unknown;
|
|
36
|
+
readonly isFailure: Schema.Boolean;
|
|
37
|
+
readonly providerExecuted: Schema.optionalKey<Schema.Boolean>;
|
|
38
|
+
readonly preliminary: Schema.optionalKey<Schema.Boolean>;
|
|
39
|
+
}>]>;
|
|
40
|
+
type ScriptedGeneratePart = typeof ScriptedGeneratePart.Type;
|
|
41
|
+
/**
|
|
42
|
+
* Schema for encoded Effect AI streaming response parts.
|
|
43
|
+
*/
|
|
44
|
+
declare const ScriptedStreamPart: Schema.Union<readonly [Schema.toEncoded<Schema.Codec<Response.StreamPart<{}, false>, Response.StreamPartEncoded, never, never>>, Schema.Struct<{
|
|
45
|
+
readonly metadata: Schema.optionalKey<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>>>;
|
|
46
|
+
readonly type: Schema.Literal<"tool-call">;
|
|
47
|
+
readonly id: Schema.String;
|
|
48
|
+
readonly name: Schema.String;
|
|
49
|
+
readonly params: Schema.Unknown;
|
|
50
|
+
readonly providerExecuted: Schema.optionalKey<Schema.Boolean>;
|
|
51
|
+
}>, Schema.Struct<{
|
|
52
|
+
readonly metadata: Schema.optionalKey<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>>>;
|
|
53
|
+
readonly type: Schema.Literal<"tool-result">;
|
|
54
|
+
readonly id: Schema.String;
|
|
55
|
+
readonly name: Schema.String;
|
|
56
|
+
readonly result: Schema.Unknown;
|
|
57
|
+
readonly isFailure: Schema.Boolean;
|
|
58
|
+
readonly providerExecuted: Schema.optionalKey<Schema.Boolean>;
|
|
59
|
+
readonly preliminary: Schema.optionalKey<Schema.Boolean>;
|
|
60
|
+
}>]>;
|
|
61
|
+
type ScriptedStreamPart = typeof ScriptedStreamPart.Type;
|
|
62
|
+
/** Controls whether a scripted stream completes, fails, or waits for interruption. */
|
|
63
|
+
declare const ScriptedStreamTermination: Schema.Union<readonly [Schema.TaggedStruct<"Complete", {}>, Schema.TaggedStruct<"Fail", {
|
|
64
|
+
readonly description: Schema.String;
|
|
65
|
+
}>, Schema.TaggedStruct<"Hang", {}>]>;
|
|
66
|
+
type ScriptedStreamTermination = typeof ScriptedStreamTermination.Type;
|
|
67
|
+
/** One non-streaming invocation and the encoded response parts it returns. */
|
|
68
|
+
declare const ScriptedGenerateTurn: Schema.TaggedStruct<"Generate", {
|
|
69
|
+
readonly parts: Schema.$Array<Schema.Union<readonly [Schema.toEncoded<Schema.Codec<Response.Part<{}, false>, Response.PartEncoded, never, never>>, Schema.toEncoded<Schema.Struct<{
|
|
70
|
+
readonly type: Schema.tag<"reasoning-delta">;
|
|
71
|
+
readonly id: Schema.String;
|
|
72
|
+
readonly delta: Schema.String;
|
|
73
|
+
readonly "~effect/ai/Content/Part": Schema.withDecodingDefaultKey<Schema.tag<"~effect/ai/Content/Part">>;
|
|
74
|
+
readonly metadata: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.Codec<Schema.Json>>>;
|
|
75
|
+
}>>, Schema.toEncoded<Schema.Struct<{
|
|
76
|
+
readonly type: Schema.tag<"reasoning-end">;
|
|
77
|
+
readonly id: Schema.String;
|
|
78
|
+
readonly "~effect/ai/Content/Part": Schema.withDecodingDefaultKey<Schema.tag<"~effect/ai/Content/Part">>;
|
|
79
|
+
readonly metadata: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.Codec<Schema.Json>>>;
|
|
80
|
+
}>>, Schema.Struct<{
|
|
81
|
+
readonly metadata: Schema.optionalKey<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>>>;
|
|
82
|
+
readonly type: Schema.Literal<"tool-call">;
|
|
83
|
+
readonly id: Schema.String;
|
|
84
|
+
readonly name: Schema.String;
|
|
85
|
+
readonly params: Schema.Unknown;
|
|
86
|
+
readonly providerExecuted: Schema.optionalKey<Schema.Boolean>;
|
|
87
|
+
}>, Schema.Struct<{
|
|
88
|
+
readonly metadata: Schema.optionalKey<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>>>;
|
|
89
|
+
readonly type: Schema.Literal<"tool-result">;
|
|
90
|
+
readonly id: Schema.String;
|
|
91
|
+
readonly name: Schema.String;
|
|
92
|
+
readonly result: Schema.Unknown;
|
|
93
|
+
readonly isFailure: Schema.Boolean;
|
|
94
|
+
readonly providerExecuted: Schema.optionalKey<Schema.Boolean>;
|
|
95
|
+
readonly preliminary: Schema.optionalKey<Schema.Boolean>;
|
|
96
|
+
}>]>>;
|
|
97
|
+
}>;
|
|
98
|
+
type ScriptedGenerateTurn = typeof ScriptedGenerateTurn.Type;
|
|
99
|
+
/** One streaming invocation with its encoded parts and terminal behavior. */
|
|
100
|
+
declare const ScriptedStreamTurn: Schema.TaggedStruct<"Stream", {
|
|
101
|
+
readonly parts: Schema.$Array<Schema.Union<readonly [Schema.toEncoded<Schema.Codec<Response.StreamPart<{}, false>, Response.StreamPartEncoded, never, never>>, Schema.Struct<{
|
|
102
|
+
readonly metadata: Schema.optionalKey<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>>>;
|
|
103
|
+
readonly type: Schema.Literal<"tool-call">;
|
|
104
|
+
readonly id: Schema.String;
|
|
105
|
+
readonly name: Schema.String;
|
|
106
|
+
readonly params: Schema.Unknown;
|
|
107
|
+
readonly providerExecuted: Schema.optionalKey<Schema.Boolean>;
|
|
108
|
+
}>, Schema.Struct<{
|
|
109
|
+
readonly metadata: Schema.optionalKey<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>>>;
|
|
110
|
+
readonly type: Schema.Literal<"tool-result">;
|
|
111
|
+
readonly id: Schema.String;
|
|
112
|
+
readonly name: Schema.String;
|
|
113
|
+
readonly result: Schema.Unknown;
|
|
114
|
+
readonly isFailure: Schema.Boolean;
|
|
115
|
+
readonly providerExecuted: Schema.optionalKey<Schema.Boolean>;
|
|
116
|
+
readonly preliminary: Schema.optionalKey<Schema.Boolean>;
|
|
117
|
+
}>]>>;
|
|
118
|
+
readonly termination: Schema.Union<readonly [Schema.TaggedStruct<"Complete", {}>, Schema.TaggedStruct<"Fail", {
|
|
119
|
+
readonly description: Schema.String;
|
|
120
|
+
}>, Schema.TaggedStruct<"Hang", {}>]>;
|
|
121
|
+
}>;
|
|
122
|
+
type ScriptedStreamTurn = typeof ScriptedStreamTurn.Type;
|
|
123
|
+
/**
|
|
124
|
+
* Serializable grammar for one finite scripted provider invocation.
|
|
125
|
+
*/
|
|
126
|
+
declare const ScriptedTurn: Schema.Union<readonly [Schema.TaggedStruct<"Generate", {
|
|
127
|
+
readonly parts: Schema.$Array<Schema.Union<readonly [Schema.toEncoded<Schema.Codec<Response.Part<{}, false>, Response.PartEncoded, never, never>>, Schema.toEncoded<Schema.Struct<{
|
|
128
|
+
readonly type: Schema.tag<"reasoning-delta">;
|
|
129
|
+
readonly id: Schema.String;
|
|
130
|
+
readonly delta: Schema.String;
|
|
131
|
+
readonly "~effect/ai/Content/Part": Schema.withDecodingDefaultKey<Schema.tag<"~effect/ai/Content/Part">>;
|
|
132
|
+
readonly metadata: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.Codec<Schema.Json>>>;
|
|
133
|
+
}>>, Schema.toEncoded<Schema.Struct<{
|
|
134
|
+
readonly type: Schema.tag<"reasoning-end">;
|
|
135
|
+
readonly id: Schema.String;
|
|
136
|
+
readonly "~effect/ai/Content/Part": Schema.withDecodingDefaultKey<Schema.tag<"~effect/ai/Content/Part">>;
|
|
137
|
+
readonly metadata: Schema.withDecodingDefault<Schema.$Record<Schema.String, Schema.Codec<Schema.Json>>>;
|
|
138
|
+
}>>, Schema.Struct<{
|
|
139
|
+
readonly metadata: Schema.optionalKey<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>>>;
|
|
140
|
+
readonly type: Schema.Literal<"tool-call">;
|
|
141
|
+
readonly id: Schema.String;
|
|
142
|
+
readonly name: Schema.String;
|
|
143
|
+
readonly params: Schema.Unknown;
|
|
144
|
+
readonly providerExecuted: Schema.optionalKey<Schema.Boolean>;
|
|
145
|
+
}>, Schema.Struct<{
|
|
146
|
+
readonly metadata: Schema.optionalKey<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>>>;
|
|
147
|
+
readonly type: Schema.Literal<"tool-result">;
|
|
148
|
+
readonly id: Schema.String;
|
|
149
|
+
readonly name: Schema.String;
|
|
150
|
+
readonly result: Schema.Unknown;
|
|
151
|
+
readonly isFailure: Schema.Boolean;
|
|
152
|
+
readonly providerExecuted: Schema.optionalKey<Schema.Boolean>;
|
|
153
|
+
readonly preliminary: Schema.optionalKey<Schema.Boolean>;
|
|
154
|
+
}>]>>;
|
|
155
|
+
}>, Schema.TaggedStruct<"Stream", {
|
|
156
|
+
readonly parts: Schema.$Array<Schema.Union<readonly [Schema.toEncoded<Schema.Codec<Response.StreamPart<{}, false>, Response.StreamPartEncoded, never, never>>, Schema.Struct<{
|
|
157
|
+
readonly metadata: Schema.optionalKey<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>>>;
|
|
158
|
+
readonly type: Schema.Literal<"tool-call">;
|
|
159
|
+
readonly id: Schema.String;
|
|
160
|
+
readonly name: Schema.String;
|
|
161
|
+
readonly params: Schema.Unknown;
|
|
162
|
+
readonly providerExecuted: Schema.optionalKey<Schema.Boolean>;
|
|
163
|
+
}>, Schema.Struct<{
|
|
164
|
+
readonly metadata: Schema.optionalKey<Schema.$Record<Schema.String, Schema.NullOr<Schema.Codec<Schema.Json, Schema.Json, never, never>>>>;
|
|
165
|
+
readonly type: Schema.Literal<"tool-result">;
|
|
166
|
+
readonly id: Schema.String;
|
|
167
|
+
readonly name: Schema.String;
|
|
168
|
+
readonly result: Schema.Unknown;
|
|
169
|
+
readonly isFailure: Schema.Boolean;
|
|
170
|
+
readonly providerExecuted: Schema.optionalKey<Schema.Boolean>;
|
|
171
|
+
readonly preliminary: Schema.optionalKey<Schema.Boolean>;
|
|
172
|
+
}>]>>;
|
|
173
|
+
readonly termination: Schema.Union<readonly [Schema.TaggedStruct<"Complete", {}>, Schema.TaggedStruct<"Fail", {
|
|
174
|
+
readonly description: Schema.String;
|
|
175
|
+
}>, Schema.TaggedStruct<"Hang", {}>]>;
|
|
176
|
+
}>]>;
|
|
177
|
+
type ScriptedTurn = typeof ScriptedTurn.Type;
|
|
178
|
+
type ScriptedRequestKind = "generate" | "stream";
|
|
179
|
+
/**
|
|
180
|
+
* A request after Effect AI has normalized its prompt, tools, response format,
|
|
181
|
+
* tool choice, span, and incremental-response fields.
|
|
182
|
+
*/
|
|
183
|
+
interface ScriptedRequest {
|
|
184
|
+
readonly kind: ScriptedRequestKind;
|
|
185
|
+
readonly options: LanguageModel.ProviderOptions;
|
|
186
|
+
}
|
|
187
|
+
/** Optional request assertions and stream lifecycle effects for one scripted turn. */
|
|
188
|
+
interface ScriptedTurnHooks {
|
|
189
|
+
/** Runs against the normalized provider request before producing the response. */
|
|
190
|
+
readonly assertRequest?: (request: LanguageModel.ProviderOptions) => Effect.Effect<void, AiError.AiError> | void;
|
|
191
|
+
/** Runs immediately before the scripted stream begins emitting parts. */
|
|
192
|
+
readonly onStreamStart?: Effect.Effect<void> | undefined;
|
|
193
|
+
/** Runs when the scripted stream completes, fails, or is interrupted. */
|
|
194
|
+
readonly onStreamFinalize?: Effect.Effect<void> | undefined;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Runtime hooks are deliberately separate from the serializable turn grammar.
|
|
198
|
+
*/
|
|
199
|
+
type ScriptedTurnInput = ScriptedTurn & ScriptedTurnHooks;
|
|
200
|
+
declare const ScriptedModel_base: Context.ServiceClass<ScriptedModel, "@effect-agent/testing/ScriptedModel", {
|
|
201
|
+
/** Normalized provider requests captured in invocation order. */
|
|
202
|
+
readonly requests: Effect.Effect<ReadonlyArray<ScriptedRequest>>;
|
|
203
|
+
/** Number of scripted turns not yet consumed. */
|
|
204
|
+
readonly remaining: Effect.Effect<number>;
|
|
205
|
+
/** Fails with `AiError` when any scripted turns remain. */
|
|
206
|
+
readonly assertExhausted: Effect.Effect<void, AiError.AiError>;
|
|
207
|
+
}>;
|
|
208
|
+
/** Inspection service for a deterministic LanguageModel backed by finite scripted turns. */
|
|
209
|
+
declare class ScriptedModel extends ScriptedModel_base {
|
|
210
|
+
/**
|
|
211
|
+
* Provides the native Effect AI `LanguageModel` and this inspection service.
|
|
212
|
+
* Supplying the extra inspection service does not add it to model-call
|
|
213
|
+
* requirements. Each model invocation consumes one turn before assertion and
|
|
214
|
+
* turn-kind validation.
|
|
215
|
+
*/
|
|
216
|
+
static layer(turns: ReadonlyArray<ScriptedTurnInput>): Layer.Layer<LanguageModel.LanguageModel | ScriptedModel, never, never>;
|
|
217
|
+
}
|
|
218
|
+
//#endregion
|
|
219
|
+
export { ScriptedRequest as a, ScriptedStreamTermination as c, ScriptedTurnHooks as d, ScriptedTurnInput as f, ScriptedModel_d_exports as i, ScriptedStreamTurn as l, ScriptedGenerateTurn as n, ScriptedRequestKind as o, ScriptedModel as r, ScriptedStreamPart as s, ScriptedGeneratePart as t, ScriptedTurn as u };
|
|
220
|
+
//# sourceMappingURL=ScriptedModel-DAvxIiud.d.mts.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { a as ScriptedRequest, c as ScriptedStreamTermination, d as ScriptedTurnHooks, f as ScriptedTurnInput, l as ScriptedStreamTurn, n as ScriptedGenerateTurn, o as ScriptedRequestKind, r as ScriptedModel, s as ScriptedStreamPart, t as ScriptedGeneratePart, u as ScriptedTurn } from "./ScriptedModel-DAvxIiud.mjs";
|
|
2
|
+
export { ScriptedGeneratePart, ScriptedGenerateTurn, ScriptedModel, ScriptedRequest, ScriptedRequestKind, ScriptedStreamPart, ScriptedStreamTermination, ScriptedStreamTurn, ScriptedTurn, ScriptedTurnHooks, ScriptedTurnInput };
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.mjs";
|
|
2
|
+
import { Context, Effect, Layer, Ref, Schema, Stream } from "effect";
|
|
3
|
+
import { AiError, LanguageModel, Response, Toolkit } from "effect/unstable/ai";
|
|
4
|
+
//#region src/ScriptedModel.ts
|
|
5
|
+
var ScriptedModel_exports = /* @__PURE__ */ __exportAll({
|
|
6
|
+
ScriptedGeneratePart: () => ScriptedGeneratePart,
|
|
7
|
+
ScriptedGenerateTurn: () => ScriptedGenerateTurn,
|
|
8
|
+
ScriptedModel: () => ScriptedModel,
|
|
9
|
+
ScriptedStreamPart: () => ScriptedStreamPart,
|
|
10
|
+
ScriptedStreamTermination: () => ScriptedStreamTermination,
|
|
11
|
+
ScriptedStreamTurn: () => ScriptedStreamTurn,
|
|
12
|
+
ScriptedTurn: () => ScriptedTurn
|
|
13
|
+
});
|
|
14
|
+
const ScriptedPartMetadata = Schema.Record(Schema.String, Schema.NullOr(Schema.Json));
|
|
15
|
+
const ScriptedPartBase = { metadata: Schema.optionalKey(ScriptedPartMetadata) };
|
|
16
|
+
const ScriptedToolCallPart = Schema.Struct({
|
|
17
|
+
...ScriptedPartBase,
|
|
18
|
+
type: Schema.Literal("tool-call"),
|
|
19
|
+
id: Schema.String,
|
|
20
|
+
name: Schema.String,
|
|
21
|
+
params: Schema.Unknown,
|
|
22
|
+
providerExecuted: Schema.optionalKey(Schema.Boolean)
|
|
23
|
+
});
|
|
24
|
+
const ScriptedToolResultPart = Schema.Struct({
|
|
25
|
+
...ScriptedPartBase,
|
|
26
|
+
type: Schema.Literal("tool-result"),
|
|
27
|
+
id: Schema.String,
|
|
28
|
+
name: Schema.String,
|
|
29
|
+
result: Schema.Unknown,
|
|
30
|
+
isFailure: Schema.Boolean,
|
|
31
|
+
providerExecuted: Schema.optionalKey(Schema.Boolean),
|
|
32
|
+
preliminary: Schema.optionalKey(Schema.Boolean)
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* Schema for encoded, non-streaming Effect AI response parts.
|
|
36
|
+
*
|
|
37
|
+
* Generic Tool payloads remain explicitly unknown here. `LanguageModel.make`
|
|
38
|
+
* performs the toolkit-specific decode when the scripted response is consumed.
|
|
39
|
+
*/
|
|
40
|
+
const ScriptedGeneratePart = Schema.Union([
|
|
41
|
+
Schema.toEncoded(Response.Part(Toolkit.empty)),
|
|
42
|
+
Schema.toEncoded(Response.ReasoningDeltaPart),
|
|
43
|
+
Schema.toEncoded(Response.ReasoningEndPart),
|
|
44
|
+
ScriptedToolCallPart,
|
|
45
|
+
ScriptedToolResultPart
|
|
46
|
+
]).annotate({ identifier: "ScriptedGeneratePart" });
|
|
47
|
+
/**
|
|
48
|
+
* Schema for encoded Effect AI streaming response parts.
|
|
49
|
+
*/
|
|
50
|
+
const ScriptedStreamPart = Schema.Union([
|
|
51
|
+
Schema.toEncoded(Response.StreamPart(Toolkit.empty)),
|
|
52
|
+
ScriptedToolCallPart,
|
|
53
|
+
ScriptedToolResultPart
|
|
54
|
+
]).annotate({ identifier: "ScriptedStreamPart" });
|
|
55
|
+
/** Controls whether a scripted stream completes, fails, or waits for interruption. */
|
|
56
|
+
const ScriptedStreamTermination = Schema.Union([
|
|
57
|
+
Schema.TaggedStruct("Complete", {}),
|
|
58
|
+
Schema.TaggedStruct("Fail", { description: Schema.String }),
|
|
59
|
+
Schema.TaggedStruct("Hang", {})
|
|
60
|
+
]);
|
|
61
|
+
/** One non-streaming invocation and the encoded response parts it returns. */
|
|
62
|
+
const ScriptedGenerateTurn = Schema.TaggedStruct("Generate", { parts: Schema.Array(ScriptedGeneratePart) });
|
|
63
|
+
/** One streaming invocation with its encoded parts and terminal behavior. */
|
|
64
|
+
const ScriptedStreamTurn = Schema.TaggedStruct("Stream", {
|
|
65
|
+
parts: Schema.Array(ScriptedStreamPart),
|
|
66
|
+
termination: ScriptedStreamTermination
|
|
67
|
+
});
|
|
68
|
+
/**
|
|
69
|
+
* Serializable grammar for one finite scripted provider invocation.
|
|
70
|
+
*/
|
|
71
|
+
const ScriptedTurn = Schema.Union([ScriptedGenerateTurn, ScriptedStreamTurn]);
|
|
72
|
+
const scriptedError = (method, description) => AiError.AiError.make({
|
|
73
|
+
module: "@effect-agent/testing/ScriptedModel",
|
|
74
|
+
method,
|
|
75
|
+
reason: AiError.UnknownError.make({ description })
|
|
76
|
+
});
|
|
77
|
+
const runAssertion = Effect.fn("ScriptedModel.runAssertion")((assertion, request) => {
|
|
78
|
+
if (assertion === void 0) return Effect.void;
|
|
79
|
+
return Effect.suspend(() => {
|
|
80
|
+
const result = assertion(request);
|
|
81
|
+
return Effect.isEffect(result) ? result : Effect.void;
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
const takeTurn = Effect.fn("ScriptedModel.takeTurn")((state, kind, options) => Ref.modify(state, (current) => {
|
|
85
|
+
const turn = current.remaining[0];
|
|
86
|
+
if (turn === void 0) return [void 0, {
|
|
87
|
+
...current,
|
|
88
|
+
requests: [...current.requests, {
|
|
89
|
+
kind,
|
|
90
|
+
options
|
|
91
|
+
}]
|
|
92
|
+
}];
|
|
93
|
+
return [turn, {
|
|
94
|
+
remaining: current.remaining.slice(1),
|
|
95
|
+
requests: [...current.requests, {
|
|
96
|
+
kind,
|
|
97
|
+
options
|
|
98
|
+
}]
|
|
99
|
+
}];
|
|
100
|
+
}).pipe(Effect.flatMap((turn) => turn === void 0 ? Effect.fail(scriptedError(kind, `Script exhausted before the ${kind} request`)) : Effect.succeed(turn))));
|
|
101
|
+
const requireGenerateTurn = (turn) => turn._tag === "Generate" ? Effect.succeed(turn) : Effect.fail(scriptedError("generate", `Expected a Generate turn but found ${turn._tag}`));
|
|
102
|
+
const requireStreamTurn = (turn) => turn._tag === "Stream" ? Effect.succeed(turn) : Effect.fail(scriptedError("stream", `Expected a Stream turn but found ${turn._tag}`));
|
|
103
|
+
const streamForTurn = (turn) => {
|
|
104
|
+
let stream = Stream.fromIterable(turn.parts);
|
|
105
|
+
switch (turn.termination._tag) {
|
|
106
|
+
case "Complete": break;
|
|
107
|
+
case "Fail":
|
|
108
|
+
stream = stream.pipe(Stream.concat(Stream.fail(scriptedError("stream", turn.termination.description))));
|
|
109
|
+
break;
|
|
110
|
+
case "Hang": stream = stream.pipe(Stream.concat(Stream.never));
|
|
111
|
+
}
|
|
112
|
+
if (turn.onStreamStart !== void 0) stream = Stream.fromEffectDrain(turn.onStreamStart).pipe(Stream.concat(stream));
|
|
113
|
+
if (turn.onStreamFinalize !== void 0) stream = stream.pipe(Stream.ensuring(turn.onStreamFinalize));
|
|
114
|
+
return stream;
|
|
115
|
+
};
|
|
116
|
+
/** Inspection service for a deterministic LanguageModel backed by finite scripted turns. */
|
|
117
|
+
var ScriptedModel = class ScriptedModel extends Context.Service()("@effect-agent/testing/ScriptedModel") {
|
|
118
|
+
/**
|
|
119
|
+
* Provides the native Effect AI `LanguageModel` and this inspection service.
|
|
120
|
+
* Supplying the extra inspection service does not add it to model-call
|
|
121
|
+
* requirements. Each model invocation consumes one turn before assertion and
|
|
122
|
+
* turn-kind validation.
|
|
123
|
+
*/
|
|
124
|
+
static layer(turns) {
|
|
125
|
+
return Layer.effectContext(Effect.gen(function* () {
|
|
126
|
+
const state = yield* Ref.make({
|
|
127
|
+
remaining: [...turns],
|
|
128
|
+
requests: []
|
|
129
|
+
});
|
|
130
|
+
const languageModel = yield* LanguageModel.make({
|
|
131
|
+
generateText: (options) => Effect.gen(function* () {
|
|
132
|
+
const turn = yield* takeTurn(state, "generate", options);
|
|
133
|
+
yield* runAssertion(turn.assertRequest, options);
|
|
134
|
+
return [...(yield* requireGenerateTurn(turn)).parts];
|
|
135
|
+
}),
|
|
136
|
+
streamText: (options) => Stream.unwrap(Effect.gen(function* () {
|
|
137
|
+
const turn = yield* takeTurn(state, "stream", options);
|
|
138
|
+
yield* runAssertion(turn.assertRequest, options);
|
|
139
|
+
const streamTurn = yield* requireStreamTurn(turn);
|
|
140
|
+
return streamForTurn(streamTurn);
|
|
141
|
+
}))
|
|
142
|
+
});
|
|
143
|
+
const inspection = ScriptedModel.of({
|
|
144
|
+
requests: Ref.get(state).pipe(Effect.map((current) => current.requests)),
|
|
145
|
+
remaining: Ref.get(state).pipe(Effect.map((current) => current.remaining.length)),
|
|
146
|
+
assertExhausted: Ref.get(state).pipe(Effect.flatMap((current) => current.remaining.length === 0 ? Effect.void : Effect.fail(scriptedError("assertExhausted", `${current.remaining.length} scripted turn(s) remain`))))
|
|
147
|
+
});
|
|
148
|
+
return Context.make(LanguageModel.LanguageModel, languageModel).pipe(Context.add(ScriptedModel, inspection));
|
|
149
|
+
}));
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
//#endregion
|
|
153
|
+
export { ScriptedGeneratePart, ScriptedGenerateTurn, ScriptedModel, ScriptedStreamPart, ScriptedStreamTermination, ScriptedStreamTurn, ScriptedTurn, ScriptedModel_exports as t };
|
|
154
|
+
|
|
155
|
+
//# sourceMappingURL=ScriptedModel.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScriptedModel.mjs","names":[],"sources":["../src/ScriptedModel.ts"],"sourcesContent":["import { Context, Effect, Layer, Ref, Schema, Stream } from \"effect\";\nimport { AiError, LanguageModel, Response, Toolkit } from \"effect/unstable/ai\";\n\nconst ScriptedPartMetadata = Schema.Record(Schema.String, Schema.NullOr(Schema.Json));\n\nconst ScriptedPartBase = {\n metadata: Schema.optionalKey(ScriptedPartMetadata),\n};\n\nconst ScriptedToolCallPart = Schema.Struct({\n ...ScriptedPartBase,\n type: Schema.Literal(\"tool-call\"),\n id: Schema.String,\n name: Schema.String,\n params: Schema.Unknown,\n providerExecuted: Schema.optionalKey(Schema.Boolean),\n});\n\nconst ScriptedToolResultPart = Schema.Struct({\n ...ScriptedPartBase,\n type: Schema.Literal(\"tool-result\"),\n id: Schema.String,\n name: Schema.String,\n result: Schema.Unknown,\n isFailure: Schema.Boolean,\n providerExecuted: Schema.optionalKey(Schema.Boolean),\n preliminary: Schema.optionalKey(Schema.Boolean),\n});\n\n/**\n * Schema for encoded, non-streaming Effect AI response parts.\n *\n * Generic Tool payloads remain explicitly unknown here. `LanguageModel.make`\n * performs the toolkit-specific decode when the scripted response is consumed.\n */\nexport const ScriptedGeneratePart = Schema.Union([\n Schema.toEncoded(Response.Part(Toolkit.empty)),\n // PartEncoded also admits these reasoning markers, which the Part schema omits.\n Schema.toEncoded(Response.ReasoningDeltaPart),\n Schema.toEncoded(Response.ReasoningEndPart),\n ScriptedToolCallPart,\n ScriptedToolResultPart,\n]).annotate({ identifier: \"ScriptedGeneratePart\" });\n\nexport type ScriptedGeneratePart = typeof ScriptedGeneratePart.Type;\n\n/**\n * Schema for encoded Effect AI streaming response parts.\n */\nexport const ScriptedStreamPart = Schema.Union([\n Schema.toEncoded(Response.StreamPart(Toolkit.empty)),\n ScriptedToolCallPart,\n ScriptedToolResultPart,\n]).annotate({ identifier: \"ScriptedStreamPart\" });\n\nexport type ScriptedStreamPart = typeof ScriptedStreamPart.Type;\n\n/** Controls whether a scripted stream completes, fails, or waits for interruption. */\nexport const ScriptedStreamTermination = Schema.Union([\n Schema.TaggedStruct(\"Complete\", {}),\n Schema.TaggedStruct(\"Fail\", {\n description: Schema.String,\n }),\n Schema.TaggedStruct(\"Hang\", {}),\n]);\n\nexport type ScriptedStreamTermination = typeof ScriptedStreamTermination.Type;\n\n/** One non-streaming invocation and the encoded response parts it returns. */\nexport const ScriptedGenerateTurn = Schema.TaggedStruct(\"Generate\", {\n parts: Schema.Array(ScriptedGeneratePart),\n});\n\nexport type ScriptedGenerateTurn = typeof ScriptedGenerateTurn.Type;\n\n/** One streaming invocation with its encoded parts and terminal behavior. */\nexport const ScriptedStreamTurn = Schema.TaggedStruct(\"Stream\", {\n parts: Schema.Array(ScriptedStreamPart),\n termination: ScriptedStreamTermination,\n});\n\nexport type ScriptedStreamTurn = typeof ScriptedStreamTurn.Type;\n\n/**\n * Serializable grammar for one finite scripted provider invocation.\n */\nexport const ScriptedTurn = Schema.Union([ScriptedGenerateTurn, ScriptedStreamTurn]);\nexport type ScriptedTurn = typeof ScriptedTurn.Type;\n\nexport type ScriptedRequestKind = \"generate\" | \"stream\";\n\n/**\n * A request after Effect AI has normalized its prompt, tools, response format,\n * tool choice, span, and incremental-response fields.\n */\nexport interface ScriptedRequest {\n readonly kind: ScriptedRequestKind;\n readonly options: LanguageModel.ProviderOptions;\n}\n\n/** Optional request assertions and stream lifecycle effects for one scripted turn. */\nexport interface ScriptedTurnHooks {\n /** Runs against the normalized provider request before producing the response. */\n readonly assertRequest?: (\n request: LanguageModel.ProviderOptions,\n ) => Effect.Effect<void, AiError.AiError> | void;\n /** Runs immediately before the scripted stream begins emitting parts. */\n readonly onStreamStart?: Effect.Effect<void> | undefined;\n /** Runs when the scripted stream completes, fails, or is interrupted. */\n readonly onStreamFinalize?: Effect.Effect<void> | undefined;\n}\n\n/**\n * Runtime hooks are deliberately separate from the serializable turn grammar.\n */\nexport type ScriptedTurnInput = ScriptedTurn & ScriptedTurnHooks;\n\ninterface ScriptState {\n readonly remaining: ReadonlyArray<ScriptedTurnInput>;\n readonly requests: ReadonlyArray<ScriptedRequest>;\n}\n\nconst scriptedError = (method: string, description: string): AiError.AiError =>\n AiError.AiError.make({\n module: \"@effect-agent/testing/ScriptedModel\",\n method,\n reason: AiError.UnknownError.make({ description }),\n });\n\nconst runAssertion = Effect.fn(\"ScriptedModel.runAssertion\")((\n assertion: ScriptedTurnHooks[\"assertRequest\"],\n request: LanguageModel.ProviderOptions,\n): Effect.Effect<void, AiError.AiError> => {\n if (assertion === undefined) {\n return Effect.void;\n }\n\n return Effect.suspend(() => {\n const result = assertion(request);\n\n return Effect.isEffect(result) ? result : Effect.void;\n });\n});\n\nconst takeTurn = Effect.fn(\"ScriptedModel.takeTurn\")(\n (\n state: Ref.Ref<ScriptState>,\n kind: ScriptedRequestKind,\n options: LanguageModel.ProviderOptions,\n ): Effect.Effect<ScriptedTurnInput, AiError.AiError> =>\n Ref.modify(state, (current) => {\n const turn = current.remaining[0];\n\n if (turn === undefined) {\n return [\n undefined,\n {\n ...current,\n requests: [...current.requests, { kind, options }],\n },\n ] as const;\n }\n\n return [\n turn,\n {\n remaining: current.remaining.slice(1),\n requests: [...current.requests, { kind, options }],\n },\n ] as const;\n }).pipe(\n Effect.flatMap((turn) =>\n turn === undefined\n ? Effect.fail(scriptedError(kind, `Script exhausted before the ${kind} request`))\n : Effect.succeed(turn),\n ),\n ),\n);\n\nconst requireGenerateTurn = (\n turn: ScriptedTurnInput,\n): Effect.Effect<ScriptedGenerateTurn & ScriptedTurnHooks, AiError.AiError> =>\n turn._tag === \"Generate\"\n ? Effect.succeed(turn)\n : Effect.fail(scriptedError(\"generate\", `Expected a Generate turn but found ${turn._tag}`));\n\nconst requireStreamTurn = (\n turn: ScriptedTurnInput,\n): Effect.Effect<ScriptedStreamTurn & ScriptedTurnHooks, AiError.AiError> =>\n turn._tag === \"Stream\"\n ? Effect.succeed(turn)\n : Effect.fail(scriptedError(\"stream\", `Expected a Stream turn but found ${turn._tag}`));\n\nconst streamForTurn = (\n turn: ScriptedStreamTurn & ScriptedTurnHooks,\n): Stream.Stream<Response.StreamPartEncoded, AiError.AiError> => {\n let stream: Stream.Stream<Response.StreamPartEncoded, AiError.AiError> = Stream.fromIterable(\n turn.parts,\n );\n\n switch (turn.termination._tag) {\n case \"Complete\": {\n break;\n }\n case \"Fail\": {\n stream = stream.pipe(\n Stream.concat(Stream.fail(scriptedError(\"stream\", turn.termination.description))),\n );\n break;\n }\n case \"Hang\": {\n stream = stream.pipe(Stream.concat(Stream.never));\n break;\n }\n }\n if (turn.onStreamStart !== undefined) {\n stream = Stream.fromEffectDrain(turn.onStreamStart).pipe(Stream.concat(stream));\n }\n if (turn.onStreamFinalize !== undefined) {\n stream = stream.pipe(Stream.ensuring(turn.onStreamFinalize));\n }\n\n return stream;\n};\n\n/** Inspection service for a deterministic LanguageModel backed by finite scripted turns. */\nexport class ScriptedModel extends Context.Service<\n ScriptedModel,\n {\n /** Normalized provider requests captured in invocation order. */\n readonly requests: Effect.Effect<ReadonlyArray<ScriptedRequest>>;\n /** Number of scripted turns not yet consumed. */\n readonly remaining: Effect.Effect<number>;\n /** Fails with `AiError` when any scripted turns remain. */\n readonly assertExhausted: Effect.Effect<void, AiError.AiError>;\n }\n>()(\"@effect-agent/testing/ScriptedModel\") {\n /**\n * Provides the native Effect AI `LanguageModel` and this inspection service.\n * Supplying the extra inspection service does not add it to model-call\n * requirements. Each model invocation consumes one turn before assertion and\n * turn-kind validation.\n */\n static layer(\n turns: ReadonlyArray<ScriptedTurnInput>,\n ): Layer.Layer<LanguageModel.LanguageModel | ScriptedModel, never, never> {\n return Layer.effectContext(\n Effect.gen(function* () {\n const state = yield* Ref.make<ScriptState>({\n remaining: [...turns],\n requests: [],\n });\n\n const languageModel = yield* LanguageModel.make({\n generateText: (options) =>\n Effect.gen(function* () {\n const turn = yield* takeTurn(state, \"generate\", options);\n\n yield* runAssertion(turn.assertRequest, options);\n const generateTurn = yield* requireGenerateTurn(turn);\n\n return [...generateTurn.parts];\n }),\n streamText: (options) =>\n Stream.unwrap(\n Effect.gen(function* () {\n const turn = yield* takeTurn(state, \"stream\", options);\n\n yield* runAssertion(turn.assertRequest, options);\n const streamTurn = yield* requireStreamTurn(turn);\n\n return streamForTurn(streamTurn);\n }),\n ),\n });\n\n const inspection = ScriptedModel.of({\n requests: Ref.get(state).pipe(Effect.map((current) => current.requests)),\n remaining: Ref.get(state).pipe(Effect.map((current) => current.remaining.length)),\n assertExhausted: Ref.get(state).pipe(\n Effect.flatMap((current) =>\n current.remaining.length === 0\n ? Effect.void\n : Effect.fail(\n scriptedError(\n \"assertExhausted\",\n `${current.remaining.length} scripted turn(s) remain`,\n ),\n ),\n ),\n ),\n });\n\n return Context.make(LanguageModel.LanguageModel, languageModel).pipe(\n Context.add(ScriptedModel, inspection),\n );\n }),\n );\n }\n}\n"],"mappings":"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"}
|