liminal 0.13.0 → 0.15.0

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/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # liminal
2
2
 
3
+ ## 0.15.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 3b4ec1a: - Instead of providing `AiToolkit` to `L.enable`/`L.disable`, we now provide tools directly.
8
+ - Also includes the beginnings of a `coalesceModels` pattern.
9
+
10
+ ## 0.14.0
11
+
12
+ ### Minor Changes
13
+
14
+ - e7006b7: Implement tool enablement and disablement.
15
+
3
16
  ## 0.13.0
4
17
 
5
18
  ### Minor Changes
package/Strand.ts CHANGED
@@ -1,10 +1,11 @@
1
1
  import type { Message } from "@effect/ai/AiInput"
2
- import type * as AiToolkit from "@effect/ai/AiToolkit"
2
+ import type * as AiTool from "@effect/ai/AiTool"
3
3
  import * as Context from "effect/Context"
4
4
  import * as Effect from "effect/Effect"
5
5
  import * as Layer from "effect/Layer"
6
6
  import * as Option from "effect/Option"
7
7
  import * as PubSub from "effect/PubSub"
8
+ import type { Schema } from "effect/Schema"
8
9
  import type { LEvent } from "./LEvent.ts"
9
10
 
10
11
  export declare namespace Strand {
@@ -18,17 +19,21 @@ export declare namespace Strand {
18
19
  /** The list of messages that the model uses to infer the next message. */
19
20
  messages: Array<Message>
20
21
  /** The tools available to the model. */
21
- tools: Set<AiToolkit.Any>
22
+ tools: Set<AiTool.AiTool<string, AiTool.AnyStructSchema, Schema.Any, Schema.Any, never>>
22
23
  }
23
24
  }
24
25
 
25
26
  /** A context tag that denotes the boundary of a conversation isolate. */
26
27
  export class Strand extends Context.Tag("liminal/Strand")<Strand, Strand.Service>() {
27
- static layer: (init?: {
28
+ static layer: <T extends AiTool.Any = never>(init?: {
28
29
  system?: string | undefined
29
30
  messages?: Array<Message> | undefined
30
- tools?: Set<AiToolkit.Any>
31
- }) => Layer.Layer<Strand> = ({ system, messages, tools } = {}) =>
31
+ tools?: Set<T> | undefined
32
+ }) => Layer.Layer<
33
+ Strand,
34
+ [T] extends [AiTool.Any] ? AiTool.Failure<T> : never,
35
+ [T] extends [AiTool.Any] ? AiTool.Context<T> : never
36
+ > = ({ system, messages, tools } = {}) =>
32
37
  Layer.effect(
33
38
  Strand,
34
39
  Effect.gen(function*() {
@@ -37,7 +42,7 @@ export class Strand extends Context.Tag("liminal/Strand")<Strand, Strand.Service
37
42
  events: yield* PubSub.unbounded<LEvent>(),
38
43
  system: Option.fromNullable(system),
39
44
  messages: [...messages ?? []],
40
- tools: new Set(tools ?? []),
45
+ tools: new Set(tools as never ?? []),
41
46
  })
42
47
  }),
43
48
  )
package/assistant.ts CHANGED
@@ -11,11 +11,15 @@ import { Strand } from "./Strand.ts"
11
11
  export const assistant: Effect.Effect<string, AiError, AiLanguageModel | Strand> = Effect.gen(function*() {
12
12
  const model = yield* AiLanguageModel
13
13
  const { system, messages, tools } = yield* Strand
14
- const { text } = yield* model.generateText({
14
+ let { text, results } = yield* model.generateText({
15
15
  system: Option.getOrUndefined(system),
16
16
  prompt: messages,
17
- toolkit: AiToolkit.merge(...tools) as never,
17
+ toolkit: AiToolkit.make(...tools) as never,
18
18
  })
19
+ // TODO: this shouldn't be necessary. Bug in Effect AI?
20
+ if (!text.trim()) {
21
+ text = results.values().next().value?.result as never as string
22
+ }
19
23
  yield* append(
20
24
  new AssistantMessage({
21
25
  parts: [new TextPart({ text })],
@@ -19,7 +19,7 @@ export const assistantStream: Stream.Stream<
19
19
  return model.streamText({
20
20
  system: Option.getOrUndefined(system),
21
21
  prompt: messages,
22
- toolkit: AiToolkit.merge(...tools) as never,
22
+ toolkit: AiToolkit.make(...tools),
23
23
  })
24
24
  }),
25
25
  )
package/disable.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  import * as AiTool from "@effect/ai/AiTool"
2
- import type { AiToolkit } from "@effect/ai/AiToolkit"
3
2
  import * as Effect from "effect/Effect"
3
+ import { Strand } from "./Strand"
4
4
 
5
- export declare const disable: (toolkit: AiToolkit<AiTool.Any>) => Effect.Effect<void>
5
+ export const disable: (tool: AiTool.Any) => Effect.Effect<void, never, Strand> = (tool) =>
6
+ Effect.map(Strand, ({ tools }) => {
7
+ tools.delete(tool as never)
8
+ })
package/dist/Strand.d.ts CHANGED
@@ -1,9 +1,10 @@
1
1
  import type { Message } from "@effect/ai/AiInput";
2
- import type * as AiToolkit from "@effect/ai/AiToolkit";
2
+ import type * as AiTool from "@effect/ai/AiTool";
3
3
  import * as Context from "effect/Context";
4
4
  import * as Layer from "effect/Layer";
5
5
  import * as Option from "effect/Option";
6
6
  import * as PubSub from "effect/PubSub";
7
+ import type { Schema } from "effect/Schema";
7
8
  import type { LEvent } from "./LEvent.ts";
8
9
  export declare namespace Strand {
9
10
  interface Service {
@@ -16,16 +17,20 @@ export declare namespace Strand {
16
17
  /** The list of messages that the model uses to infer the next message. */
17
18
  messages: Array<Message>;
18
19
  /** The tools available to the model. */
19
- tools: Set<AiToolkit.Any>;
20
+ tools: Set<AiTool.AiTool<string, AiTool.AnyStructSchema, Schema.Any, Schema.Any, never>>;
20
21
  }
21
22
  }
22
23
  declare const Strand_base: Context.TagClass<Strand, "liminal/Strand", Strand.Service>;
23
24
  /** A context tag that denotes the boundary of a conversation isolate. */
24
25
  export declare class Strand extends Strand_base {
25
- static layer: (init?: {
26
+ static layer: <T extends AiTool.Any = never>(init?: {
26
27
  system?: string | undefined;
27
28
  messages?: Array<Message> | undefined;
28
- tools?: Set<AiToolkit.Any>;
29
- }) => Layer.Layer<Strand>;
29
+ tools?: Set<T> | undefined;
30
+ }) => Layer.Layer<Strand, [
31
+ T
32
+ ] extends [AiTool.Any] ? AiTool.Failure<T> : never, [
33
+ T
34
+ ] extends [AiTool.Any] ? AiTool.Context<T> : never>;
30
35
  }
31
36
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"Strand.js","sourceRoot":"","sources":["../Strand.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAkBvC,yEAAyE;AACzE,MAAM,OAAO,MAAO,SAAQ,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAA0B;IACjF,MAAM,CAAC,KAAK,GAIgB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CAC/D,KAAK,CAAC,MAAM,CACV,MAAM,EACN,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,OAAO,MAAM,CAAC,EAAE,CAAC;YACf,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;YAC3C,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,EAAU;YACzC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,CAAC,GAAG,QAAQ,IAAI,EAAE,CAAC;YAC7B,KAAK,EAAE,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;SAC5B,CAAC,CAAA;IACJ,CAAC,CAAC,CACH,CAAA"}
1
+ {"version":3,"file":"Strand.js","sourceRoot":"","sources":["../Strand.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAmBvC,yEAAyE;AACzE,MAAM,OAAO,MAAO,SAAQ,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAA0B;IACjF,MAAM,CAAC,KAAK,GAQR,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EAAE,CACvC,KAAK,CAAC,MAAM,CACV,MAAM,EACN,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,OAAO,MAAM,CAAC,EAAE,CAAC;YACf,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC;YAC3C,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,EAAU;YACzC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;YACnC,QAAQ,EAAE,CAAC,GAAG,QAAQ,IAAI,EAAE,CAAC;YAC7B,KAAK,EAAE,IAAI,GAAG,CAAC,KAAc,IAAI,EAAE,CAAC;SACrC,CAAC,CAAA;IACJ,CAAC,CAAC,CACH,CAAA"}
package/dist/assistant.js CHANGED
@@ -9,11 +9,15 @@ import { Strand } from "./Strand.js";
9
9
  export const assistant = Effect.gen(function* () {
10
10
  const model = yield* AiLanguageModel;
11
11
  const { system, messages, tools } = yield* Strand;
12
- const { text } = yield* model.generateText({
12
+ let { text, results } = yield* model.generateText({
13
13
  system: Option.getOrUndefined(system),
14
14
  prompt: messages,
15
- toolkit: AiToolkit.merge(...tools),
15
+ toolkit: AiToolkit.make(...tools),
16
16
  });
17
+ // TODO: this shouldn't be necessary. Bug in Effect AI?
18
+ if (!text.trim()) {
19
+ text = results.values().next().value?.result;
20
+ }
17
21
  yield* append(new AssistantMessage({
18
22
  parts: [new TextPart({ text })],
19
23
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../assistant.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,oEAAoE;AACpE,MAAM,CAAC,MAAM,SAAS,GAA6D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACrG,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IACpC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IACjD,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;QACzC,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;QACrC,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAU;KAC5C,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,MAAM,CACX,IAAI,gBAAgB,CAAC;QACnB,KAAK,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;KAChC,CAAC,CACH,CAAA;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../assistant.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,oEAAoE;AACpE,MAAM,CAAC,MAAM,SAAS,GAA6D,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IACrG,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IACpC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IACjD,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;QAChD,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;QACrC,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAU;KAC3C,CAAC,CAAA;IACF,uDAAuD;IACvD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;QACjB,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,MAAyB,CAAA;IACjE,CAAC;IACD,KAAK,CAAC,CAAC,MAAM,CACX,IAAI,gBAAgB,CAAC;QACnB,KAAK,EAAE,CAAC,IAAI,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;KAChC,CAAC,CACH,CAAA;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAC,CAAA"}
@@ -11,7 +11,7 @@ export const assistantStream = Stream.unwrap(Effect.gen(function* () {
11
11
  return model.streamText({
12
12
  system: Option.getOrUndefined(system),
13
13
  prompt: messages,
14
- toolkit: AiToolkit.merge(...tools),
14
+ toolkit: AiToolkit.make(...tools),
15
15
  });
16
16
  }));
17
17
  //# sourceMappingURL=assistantStream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"assistantStream.js","sourceRoot":"","sources":["../assistantStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,iGAAiG;AACjG,MAAM,CAAC,MAAM,eAAe,GAIxB,MAAM,CAAC,MAAM,CACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IACpC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IACjD,OAAO,KAAK,CAAC,UAAU,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;QACrC,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,CAAU;KAC5C,CAAC,CAAA;AACJ,CAAC,CAAC,CACH,CAAA"}
1
+ {"version":3,"file":"assistantStream.js","sourceRoot":"","sources":["../assistantStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,iGAAiG;AACjG,MAAM,CAAC,MAAM,eAAe,GAIxB,MAAM,CAAC,MAAM,CACf,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,eAAe,CAAA;IACpC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IACjD,OAAO,KAAK,CAAC,UAAU,CAAC;QACtB,MAAM,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC;QACrC,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;KAClC,CAAC,CAAA;AACJ,CAAC,CAAC,CACH,CAAA"}
package/dist/disable.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  import * as AiTool from "@effect/ai/AiTool";
2
- import type { AiToolkit } from "@effect/ai/AiToolkit";
3
2
  import * as Effect from "effect/Effect";
4
- export declare const disable: (toolkit: AiToolkit<AiTool.Any>) => Effect.Effect<void>;
3
+ import { Strand } from "./Strand";
4
+ export declare const disable: (tool: AiTool.Any) => Effect.Effect<void, never, Strand>;
package/dist/disable.js CHANGED
@@ -1,3 +1,7 @@
1
1
  import * as AiTool from "@effect/ai/AiTool";
2
2
  import * as Effect from "effect/Effect";
3
+ import { Strand } from "./Strand";
4
+ export const disable = (tool) => Effect.map(Strand, ({ tools }) => {
5
+ tools.delete(tool);
6
+ });
3
7
  //# sourceMappingURL=disable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"disable.js","sourceRoot":"","sources":["../disable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"disable.js","sourceRoot":"","sources":["../disable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,MAAM,CAAC,MAAM,OAAO,GAA6D,CAAC,IAAI,EAAE,EAAE,CACxF,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IAC/B,KAAK,CAAC,MAAM,CAAC,IAAa,CAAC,CAAA;AAC7B,CAAC,CAAC,CAAA"}
package/dist/enable.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import * as AiTool from "@effect/ai/AiTool";
2
- import type { AiToolkit } from "@effect/ai/AiToolkit";
1
+ import type { AiTool, AnyStructSchema, Handler } from "@effect/ai/AiTool";
3
2
  import * as Effect from "effect/Effect";
4
- import type { Strand } from "./Strand.ts";
5
- export declare const enable: <Tools extends AiTool.Any>(toolkit: AiToolkit<Tools>) => Effect.Effect<never, never, AiTool.Handler<Tools["name"]> | Strand>;
3
+ import type { Schema } from "effect/Schema";
4
+ import { Strand } from "./Strand.ts";
5
+ export declare const enable: <K extends string, E extends Schema.All, R>(toolkit: AiTool<K, AnyStructSchema, Schema.Any, E, R>) => Effect.Effect<void, E, Handler<K> | Strand | R>;
package/dist/enable.js CHANGED
@@ -1,3 +1,6 @@
1
- import * as AiTool from "@effect/ai/AiTool";
2
1
  import * as Effect from "effect/Effect";
2
+ import { Strand } from "./Strand.js";
3
+ export const enable = (toolkit) => Effect.map(Strand, ({ tools }) => {
4
+ tools.add(toolkit);
5
+ });
3
6
  //# sourceMappingURL=enable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"enable.js","sourceRoot":"","sources":["../enable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA"}
1
+ {"version":3,"file":"enable.js","sourceRoot":"","sources":["../enable.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,CAAC,MAAM,MAAM,GAMoC,CAAC,OAAO,EAAE,EAAE,CACjE,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;IAC/B,KAAK,CAAC,GAAG,CAAC,OAAgB,CAAC,CAAA;AAC7B,CAAC,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import type { AiError } from "@effect/ai/AiError";
2
+ import type { AiLanguageModel } from "@effect/ai/AiLanguageModel";
3
+ import type { AiModel } from "@effect/ai/AiModel";
4
+ import * as Effect from "effect/Effect";
5
+ import type { Strand } from "../Strand.ts";
6
+ export declare const coalesceModels: <E, R, M extends Array<AiModel<any, any>>>(effect: Effect.Effect<any, E, R>, models: M) => Effect.Effect<string, AiError | E, Strand | AiLanguageModel | ([M[number]] extends [AiModel<any, infer R>] ? R : never)>;
@@ -0,0 +1,15 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { assistant } from "../assistant.js";
3
+ import { user } from "../user.js";
4
+ export const coalesceModels = Effect.fn(function* (effect, models) {
5
+ const all = yield* Effect.all(models.map((model) => effect.pipe(Effect.provide(model))));
6
+ yield* user `
7
+ Coalesce the following items into a single item:
8
+
9
+ ---
10
+
11
+ ${all.map((item) => JSON.stringify(item, null, 2)).join("\n\n---")}
12
+ `;
13
+ return yield* assistant;
14
+ });
15
+ //# sourceMappingURL=coalesce_models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coalesce_models.js","sourceRoot":"","sources":["../../patterns/coalesce_models.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEjC,MAAM,CAAC,MAAM,cAAc,GAOvB,MAAM,CAAC,EAAE,CACX,QAAQ,CAAC,EAAC,MAAM,EAAE,MAAM;IACtB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAEtF,CAAA;IACD,KAAK,CAAC,CAAC,IAAI,CAAA;;;;;QAKP,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;KACnE,CAAA;IACD,OAAO,KAAK,CAAC,CAAC,SAAS,CAAA;AACzB,CAAC,CACF,CAAA"}
@@ -0,0 +1,3 @@
1
+ import * as Effect from "effect/Effect";
2
+ import { Strand } from "../Strand.ts";
3
+ export declare const matchGist: <R extends Record<string, Effect.All.EffectAny>>(routes: R) => Effect.Effect<Effect.Effect.Success<R[keyof R]>, ([R[keyof R]] extends [never] ? never : Effect.Effect.Error<R[keyof R]>), ([R[keyof R]] extends [never] ? never : Effect.Effect.Context<R[keyof R]>) | Strand>;
@@ -0,0 +1,16 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as Schema from "effect/Schema";
3
+ import { assistantSchema } from "../assistantSchema.js";
4
+ import { branch } from "../branch.js";
5
+ import { Strand } from "../Strand.js";
6
+ import { user } from "../user.js";
7
+ export const matchGist = Effect.fnUntraced(function* (routes) {
8
+ const descriptions = Object.keys(routes);
9
+ const description = yield* branch(user `
10
+ Which of the following descriptions best matches the current conversation?
11
+
12
+ - ${descriptions.join("\n -")}
13
+ `, assistantSchema(Schema.Literal(...descriptions)));
14
+ return yield* routes[description];
15
+ });
16
+ //# sourceMappingURL=match_gist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"match_gist.js","sourceRoot":"","sources":["../../patterns/match_gist.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAEjC,MAAM,CAAC,MAAM,SAAS,GAIlB,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAC,MAAM;IACpC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACxC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,MAAM,CAC/B,IAAI,CAAA;;;UAGE,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;KAC9B,EACD,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC,CACjD,CAAA;IACD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAE,CAAA;AACpC,CAAC,CAAC,CAAA"}