ExecutionPlan.ts overview
Since v3.16.0
Exports Grouped by Category
Combining
merge
Signature
declare const merge: <const Plans extends NonEmptyReadonlyArray<ExecutionPlan<any>>>(
...plans: Plans
) => ExecutionPlan<{
provides: make.PlanProvides<Plans>
input: make.PlanInput<Plans>
error: Plans[number] extends ExecutionPlan<infer T> ? T["error"] : never
requirements: Plans[number] extends ExecutionPlan<infer T> ? T["requirements"] : never
}>
Since v3.16.0
Constructors
make
Create an ExecutionPlan, which can be used with Effect.withExecutionPlan or Stream.withExecutionPlan, allowing you to provide different resources for each step of execution until the effect succeeds or the plan is exhausted.
import type { LanguageModel } from "@effect/ai"
import type { Layer } from "effect"
import { Effect, ExecutionPlan, Schedule } from "effect"
declare const layerBad: Layer.Layer<LanguageModel.LanguageModel>
declare const layerGood: Layer.Layer<LanguageModel.LanguageModel>
const ThePlan = ExecutionPlan.make(
{
// First try with the bad layer 2 times with a 3 second delay between attempts
provide: layerBad,
attempts: 2,
schedule: Schedule.spaced(3000)
},
// Then try with the bad layer 3 times with a 1 second delay between attempts
{
provide: layerBad,
attempts: 3,
schedule: Schedule.spaced(1000)
},
// Finally try with the good layer.
//
// If `attempts` is omitted, the plan will only attempt once, unless a schedule is provided.
{
provide: layerGood
}
)
declare const effect: Effect.Effect<void, never, LanguageModel.LanguageModel>
const withPlan: Effect.Effect<void> = Effect.withExecutionPlan(effect, ThePlan)
Signature
declare const make: <const Steps extends NonEmptyReadonlyArray<make.Step>>(
...steps: Steps & { [K in keyof Steps]: make.Step }
) => ExecutionPlan<{
provides: make.StepProvides<Steps>
input: make.StepInput<Steps>
error:
| (Steps[number]["provide"] extends Context.Context<infer _P> | Layer.Layer<infer _P, infer E, infer _R>
? E
: never)
| (Steps[number]["while"] extends (input: infer _I) => Effect.Effect<infer _A, infer _E, infer _R> ? _E : never)
requirements:
| (Steps[number]["provide"] extends Layer.Layer<infer _A, infer _E, infer R> ? R : never)
| (Steps[number]["while"] extends (input: infer _I) => Effect.Effect<infer _A, infer _E, infer R> ? R : never)
| (Steps[number]["schedule"] extends Schedule.Schedule<infer _O, infer _I, infer R> ? R : never)
}>
Since v3.16.0
Guards
isExecutionPlan
Signature
declare const isExecutionPlan: (u: unknown) => u is ExecutionPlan<any>
Since v3.16.0
Models
ExecutionPlan (interface)
A ExecutionPlan can be used with Effect.withExecutionPlan or Stream.withExecutionPlan, allowing you to provide different resources for each step of execution until the effect succeeds or the plan is exhausted.
import type { LanguageModel } from "@effect/ai"
import type { Layer } from "effect"
import { Effect, ExecutionPlan, Schedule } from "effect"
declare const layerBad: Layer.Layer<LanguageModel.LanguageModel>
declare const layerGood: Layer.Layer<LanguageModel.LanguageModel>
const ThePlan = ExecutionPlan.make(
{
// First try with the bad layer 2 times with a 3 second delay between attempts
provide: layerBad,
attempts: 2,
schedule: Schedule.spaced(3000)
},
// Then try with the bad layer 3 times with a 1 second delay between attempts
{
provide: layerBad,
attempts: 3,
schedule: Schedule.spaced(1000)
},
// Finally try with the good layer.
//
// If `attempts` is omitted, the plan will only attempt once, unless a schedule is provided.
{
provide: layerGood
}
)
declare const effect: Effect.Effect<void, never, LanguageModel.LanguageModel>
const withPlan: Effect.Effect<void> = Effect.withExecutionPlan(effect, ThePlan)
Signature
export interface ExecutionPlan<
Types extends {
provides: any
input: any
error: any
requirements: any
}
> extends Pipeable {
readonly [TypeId]: TypeId
readonly steps: NonEmptyReadonlyArray<{
readonly provide:
| Context.Context<Types["provides"]>
| Layer.Layer<Types["provides"], Types["error"], Types["requirements"]>
readonly attempts?: number | undefined
readonly while?:
| ((input: Types["input"]) => Effect.Effect<boolean, Types["error"], Types["requirements"]>)
| undefined
readonly schedule?: Schedule.Schedule<any, Types["input"], Types["requirements"]> | undefined
}>
/**
* Returns an equivalent `ExecutionPlan` with the requirements satisfied,
* using the current context.
*/
readonly withRequirements: Effect.Effect<
ExecutionPlan<{
provides: Types["provides"]
input: Types["input"]
error: Types["error"]
requirements: never
}>,
never,
Types["requirements"]
>
}
Since v3.16.0
Symbols
TypeId
Signature
declare const TypeId: unique symbol
Since v3.16.0
TypeId (type alias)
Signature
type TypeId = typeof TypeId
Since v3.16.0
utils
TypesBase (type alias)
Signature
type TypesBase = {
provides: any
input: any
error: any
requirements: any
}
Since v3.16.0
make (namespace)
Since v3.16.0
Step (type alias)
Signature
type Step = {
readonly provide: Context.Context<any> | Context.Context<never> | Layer.Layer.Any
readonly attempts?: number | undefined
readonly while?: ((input: any) => boolean | Effect.Effect<boolean, any, any>) | undefined
readonly schedule?: Schedule.Schedule<any, any, any> | undefined
}
Since v3.16.0
StepProvides (type alias)
Signature
type StepProvides<Steps, Out> = Steps extends readonly [infer Step, ...infer Rest]
? StepProvides<
Rest,
Out &
(Step extends { readonly provide: Context.Context<infer P> | Layer.Layer<infer P, infer _E, infer _R> }
? P
: unknown)
>
: Out
Since v3.16.1
PlanProvides (type alias)
Signature
type PlanProvides<Plans, Out> = Plans extends readonly [infer Plan, ...infer Rest]
? PlanProvides<Rest, Out & (Plan extends ExecutionPlan<infer T> ? T["provides"] : unknown)>
: Out
Since v3.16.1
StepInput (type alias)
Signature
type StepInput<Steps, Out> = Steps extends readonly [infer Step, ...infer Rest]
? StepInput<
Rest,
Out &
((Step extends { readonly while: (input: infer I) => infer _ } ? I : unknown) &
(Step extends { readonly schedule: Schedule.Schedule<infer _O, infer I, infer _R> } ? I : unknown))
>
: Out
Since v3.16.0
PlanInput (type alias)
Signature
type PlanInput<Plans, Out> = Plans extends readonly [infer Plan, ...infer Rest]
? PlanInput<Rest, Out & (Plan extends ExecutionPlan<infer T> ? T["input"] : unknown)>
: Out
Since v3.16.0