liminal 0.7.0 → 0.9.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/index.ts CHANGED
@@ -1,3 +1,2 @@
1
- export * from "./Context.ts"
2
1
  export * as L from "./L.ts"
3
- export * from "./strand.ts"
2
+ export * as Strand from "./Strand.ts"
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.7.0",
6
+ "version": "0.9.0",
7
7
  "license": "Apache-2.0",
8
8
  "repository": {
9
9
  "type": "git",
@@ -13,10 +13,12 @@
13
13
  "type": "module",
14
14
  "description": "Primitives for composing conversation trees with language models and TypeScript iterators.",
15
15
  "exports": {
16
- ".": "./dist/index.js"
16
+ ".": "./dist/index.js",
17
+ "./L": "./dist/L.js",
18
+ "./Strand": "./dist/Strand.js"
17
19
  },
18
20
  "peerDependencies": {
19
- "@effect/ai": "^0.18.2",
20
- "effect": "^3.16.3"
21
+ "@effect/ai": "^0.18.16",
22
+ "effect": "^3.17.2"
21
23
  }
22
24
  }
package/Context.ts DELETED
@@ -1,10 +0,0 @@
1
- import * as AiInput from "@effect/ai/AiInput"
2
- import * as AiToolkit from "@effect/ai/AiToolkit"
3
- import * as Context from "effect/Context"
4
- import * as Ref from "effect/Ref"
5
-
6
- export class MessagesRef extends Context.Tag("liminal/Messages")<MessagesRef, Ref.Ref<Array<AiInput.Message>>>() {}
7
-
8
- export class System extends Context.Tag("liminal/System")<System, string | undefined>() {}
9
-
10
- export class Toolkit extends Context.Tag("liminal/Tools")<Toolkit, AiToolkit.AiToolkit<any> | undefined>() {}
package/assistant.ts DELETED
@@ -1,52 +0,0 @@
1
- import type { AiError } from "@effect/ai/AiError"
2
- import * as AiInput from "@effect/ai/AiInput"
3
- import * as AiLanguageModel from "@effect/ai/AiLanguageModel"
4
- import * as Effect from "effect/Effect"
5
- import * as Option from "effect/Option"
6
- import * as Ref from "effect/Ref"
7
- import type * as Schema from "effect/Schema"
8
- import { MessagesRef, System, Toolkit } from "./Context.ts"
9
-
10
- export const assistant: {
11
- (): Effect.Effect<string, AiError, AiLanguageModel.AiLanguageModel | MessagesRef | System>
12
- <O, I>(
13
- schema: Schema.Schema<O, I, never>,
14
- ): Effect.Effect<O, AiError, AiLanguageModel.AiLanguageModel | MessagesRef | System>
15
- } = Effect.fn(function*(schema?: Schema.Schema<any>) {
16
- const model = yield* AiLanguageModel.AiLanguageModel
17
- const messagesRef = yield* MessagesRef
18
- const toolkitOption = yield* Effect.serviceOption(Toolkit)
19
- const prompt = yield* Ref.get(messagesRef)
20
- const system = yield* System
21
- if (schema) {
22
- const response = yield* model.generateObject({
23
- system,
24
- schema,
25
- prompt,
26
- })
27
- const { value, text } = response
28
- yield* appendMessage(text)
29
- return value
30
- }
31
- const response = yield* model.generateText({
32
- system,
33
- prompt,
34
- ...Option.isSome(toolkitOption)
35
- ? toolkitOption.value
36
- ? { toolkit: toolkitOption.value }
37
- : {}
38
- : {},
39
- })
40
- const { text } = response
41
- yield* appendMessage(text)
42
- return text
43
-
44
- function* appendMessage(text: string) {
45
- yield* Ref.update(messagesRef, (prev) => [
46
- ...prev,
47
- new AiInput.AssistantMessage({
48
- parts: [new AiInput.TextPart({ text })],
49
- }),
50
- ])
51
- }
52
- })
package/dist/Context.d.ts DELETED
@@ -1,14 +0,0 @@
1
- import * as AiInput from "@effect/ai/AiInput";
2
- import * as AiToolkit from "@effect/ai/AiToolkit";
3
- import * as Context from "effect/Context";
4
- import * as Ref from "effect/Ref";
5
- declare const MessagesRef_base: Context.TagClass<MessagesRef, "liminal/Messages", Ref.Ref<(AiInput.UserMessage | AiInput.AssistantMessage | AiInput.ToolMessage)[]>>;
6
- export declare class MessagesRef extends MessagesRef_base {
7
- }
8
- declare const System_base: Context.TagClass<System, "liminal/System", string | undefined>;
9
- export declare class System extends System_base {
10
- }
11
- declare const Toolkit_base: Context.TagClass<Toolkit, "liminal/Tools", AiToolkit.AiToolkit<any> | undefined>;
12
- export declare class Toolkit extends Toolkit_base {
13
- }
14
- export {};
package/dist/Context.js DELETED
@@ -1,11 +0,0 @@
1
- import * as AiInput from "@effect/ai/AiInput";
2
- import * as AiToolkit from "@effect/ai/AiToolkit";
3
- import * as Context from "effect/Context";
4
- import * as Ref from "effect/Ref";
5
- export class MessagesRef extends Context.Tag("liminal/Messages")() {
6
- }
7
- export class System extends Context.Tag("liminal/System")() {
8
- }
9
- export class Toolkit extends Context.Tag("liminal/Tools")() {
10
- }
11
- //# sourceMappingURL=Context.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Context.js","sourceRoot":"","sources":["../Context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,SAAS,MAAM,sBAAsB,CAAA;AACjD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AAEjC,MAAM,OAAO,WAAY,SAAQ,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAgD;CAAG;AAEnH,MAAM,OAAO,MAAO,SAAQ,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAA8B;CAAG;AAE1F,MAAM,OAAO,OAAQ,SAAQ,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAiD;CAAG"}
@@ -1,9 +0,0 @@
1
- import type { AiError } from "@effect/ai/AiError";
2
- import * as AiLanguageModel from "@effect/ai/AiLanguageModel";
3
- import * as Effect from "effect/Effect";
4
- import type * as Schema from "effect/Schema";
5
- import { MessagesRef, System } from "./Context.ts";
6
- export declare const assistant: {
7
- (): Effect.Effect<string, AiError, AiLanguageModel.AiLanguageModel | MessagesRef | System>;
8
- <O, I>(schema: Schema.Schema<O, I, never>): Effect.Effect<O, AiError, AiLanguageModel.AiLanguageModel | MessagesRef | System>;
9
- };
package/dist/assistant.js DELETED
@@ -1,44 +0,0 @@
1
- import * as AiInput from "@effect/ai/AiInput";
2
- import * as AiLanguageModel from "@effect/ai/AiLanguageModel";
3
- import * as Effect from "effect/Effect";
4
- import * as Option from "effect/Option";
5
- import * as Ref from "effect/Ref";
6
- import { MessagesRef, System, Toolkit } from "./Context.js";
7
- export const assistant = Effect.fn(function* (schema) {
8
- const model = yield* AiLanguageModel.AiLanguageModel;
9
- const messagesRef = yield* MessagesRef;
10
- const toolkitOption = yield* Effect.serviceOption(Toolkit);
11
- const prompt = yield* Ref.get(messagesRef);
12
- const system = yield* System;
13
- if (schema) {
14
- const response = yield* model.generateObject({
15
- system,
16
- schema,
17
- prompt,
18
- });
19
- const { value, text } = response;
20
- yield* appendMessage(text);
21
- return value;
22
- }
23
- const response = yield* model.generateText({
24
- system,
25
- prompt,
26
- ...Option.isSome(toolkitOption)
27
- ? toolkitOption.value
28
- ? { toolkit: toolkitOption.value }
29
- : {}
30
- : {},
31
- });
32
- const { text } = response;
33
- yield* appendMessage(text);
34
- return text;
35
- function* appendMessage(text) {
36
- yield* Ref.update(messagesRef, (prev) => [
37
- ...prev,
38
- new AiInput.AssistantMessage({
39
- parts: [new AiInput.TextPart({ text })],
40
- }),
41
- ]);
42
- }
43
- });
44
- //# sourceMappingURL=assistant.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assistant.js","sourceRoot":"","sources":["../assistant.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,eAAe,MAAM,4BAA4B,CAAA;AAC7D,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AAEjC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE3D,MAAM,CAAC,MAAM,SAAS,GAKlB,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAC,MAA2B;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,eAAe,CAAC,eAAe,CAAA;IACpD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,WAAW,CAAA;IACtC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IAC5B,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;YAC3C,MAAM;YACN,MAAM;YACN,MAAM;SACP,CAAC,CAAA;QACF,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAA;QAChC,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;QAC1B,OAAO,KAAK,CAAA;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC;QACzC,MAAM;QACN,MAAM;QACN,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;YAC7B,CAAC,CAAC,aAAa,CAAC,KAAK;gBACnB,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE;gBAClC,CAAC,CAAC,EAAE;YACN,CAAC,CAAC,EAAE;KACP,CAAC,CAAA;IACF,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAA;IACzB,KAAK,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;IAC1B,OAAO,IAAI,CAAA;IAEX,QAAQ,CAAC,CAAC,aAAa,CAAC,IAAY;QAClC,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YACvC,GAAG,IAAI;YACP,IAAI,OAAO,CAAC,gBAAgB,CAAC;gBAC3B,KAAK,EAAE,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;aACxC,CAAC;SACH,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAC,CAAA"}
@@ -1,4 +0,0 @@
1
- import type { Message } from "@effect/ai/AiInput";
2
- import * as Effect from "effect/Effect";
3
- import { MessagesRef } from "./Context.ts";
4
- export declare const messages: Effect.Effect<Array<Message>, never, MessagesRef>;
package/dist/messages.js DELETED
@@ -1,5 +0,0 @@
1
- import * as Effect from "effect/Effect";
2
- import * as Ref from "effect/Ref";
3
- import { MessagesRef } from "./Context.js";
4
- export const messages = Effect.flatMap(MessagesRef, Ref.get);
5
- //# sourceMappingURL=messages.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"","sources":["../messages.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,CAAC,MAAM,QAAQ,GAAsD,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,CAAA"}
package/dist/set.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import * as Effect from "effect/Effect";
2
- import { MessagesRef } from "./Context.ts";
3
- export declare const set: (messages: Iterable<import("@effect/ai/AiInput").UserMessage | import("@effect/ai/AiInput").AssistantMessage | import("@effect/ai/AiInput").ToolMessage>) => Effect.Effect<(import("@effect/ai/AiInput").UserMessage | import("@effect/ai/AiInput").AssistantMessage | import("@effect/ai/AiInput").ToolMessage)[], never, MessagesRef>;
package/dist/set.js DELETED
@@ -1,11 +0,0 @@
1
- import { Message } from "@effect/ai/AiInput";
2
- import * as Effect from "effect/Effect";
3
- import * as Ref from "effect/Ref";
4
- import { MessagesRef } from "./Context.js";
5
- export const set = Effect.fn(function* (messages) {
6
- const messagesRef = yield* MessagesRef;
7
- const previous = yield* Ref.get(messagesRef);
8
- yield* Ref.set(messagesRef, [...messages]);
9
- return previous;
10
- });
11
- //# sourceMappingURL=set.js.map
package/dist/set.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"set.js","sourceRoot":"","sources":["../set.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,CAAC,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAC,QAA2B;IAChE,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,WAAW,CAAA;IACtC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;IAC5C,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAA;IAC1C,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAC,CAAA"}
package/dist/strand.d.ts DELETED
@@ -1,15 +0,0 @@
1
- import * as AiInput from "@effect/ai/AiInput";
2
- import * as AiTool from "@effect/ai/AiTool";
3
- import type * as AiToolkit from "@effect/ai/AiToolkit";
4
- import * as Effect from "effect/Effect";
5
- import { MessagesRef, System } from "./Context.ts";
6
- export interface StrandOptions<in out Tool extends AiTool.Any> {
7
- /** The system prompt. */
8
- system?: string | undefined;
9
- /** The initial list of AI input messages. */
10
- messages?: Iterable<AiInput.Message> | undefined;
11
- /** The tools to use for by strand. */
12
- toolkit?: AiToolkit.AiToolkit<Tool> | undefined;
13
- }
14
- /** Create an isolated clone of the current conversation to provide for an effect. */
15
- export declare const strand: <HE = never, T extends AiTool.Any = never>(options?: StrandOptions<T>) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | HE, Exclude<R, MessagesRef | System> | T>;
package/dist/strand.js DELETED
@@ -1,19 +0,0 @@
1
- import * as AiInput from "@effect/ai/AiInput";
2
- import * as AiTool from "@effect/ai/AiTool";
3
- import * as Effect from "effect/Effect";
4
- import * as Option from "effect/Option";
5
- import * as Ref from "effect/Ref";
6
- import { MessagesRef, System, Toolkit } from "./Context.js";
7
- /** Create an isolated clone of the current conversation to provide for an effect. */
8
- export const strand = (options) => (effect) => Effect.gen(function* () {
9
- const messagesRef = options?.messages
10
- ? Ref.unsafeMake([...options.messages])
11
- : yield* Option.match(yield* Effect.serviceOption(MessagesRef), {
12
- *onSome(ref) {
13
- return Ref.unsafeMake([...yield* Ref.get(ref)]);
14
- },
15
- onNone: () => Ref.make([]),
16
- });
17
- return yield* (effect.pipe(Effect.provideService(MessagesRef, messagesRef), Effect.provideService(System, options?.system), Effect.provideService(Toolkit, options?.toolkit)));
18
- });
19
- //# sourceMappingURL=strand.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"strand.js","sourceRoot":"","sources":["../strand.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAE3C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAW3D,qFAAqF;AACrF,MAAM,CAAC,MAAM,MAAM,GAImD,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAC5F,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,WAAW,GAAG,OAAO,EAAE,QAAQ;QACnC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE;YAC9D,CAAC,MAAM,CAAC,GAAG;gBACT,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACjD,CAAC;YACD,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAA4B,CAAC;SACrD,CAAC,CAAA;IACJ,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CACxB,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,WAAW,CAAC,EAC/C,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,EAC9C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CACjD,CAAC,CAAA;AACJ,CAAC,CAAU,CAAA"}
package/dist/user.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import * as Effect from "effect/Effect";
2
- import { MessagesRef } from "./Context.ts";
3
- export declare const user: {
4
- (template: TemplateStringsArray, ...substitutions: Array<unknown>): Effect.Effect<void, never, MessagesRef>;
5
- (message: string): Effect.Effect<void, never, MessagesRef>;
6
- };
package/dist/user.js DELETED
@@ -1,16 +0,0 @@
1
- import * as AiInput from "@effect/ai/AiInput";
2
- import * as Effect from "effect/Effect";
3
- import * as Ref from "effect/Ref";
4
- import { MessagesRef } from "./Context.js";
5
- import { isTemplateStringsArray } from "./util/isTemplateStringsArray.js";
6
- export const user = Effect.fn(function* (e0, ...eRest) {
7
- const message = new AiInput.UserMessage({
8
- parts: [
9
- new AiInput.TextPart({
10
- text: isTemplateStringsArray(e0) ? String.raw({ raw: e0 }, ...eRest) : e0,
11
- }),
12
- ],
13
- });
14
- yield* Ref.update(yield* MessagesRef, (messages) => [...messages, message]);
15
- });
16
- //# sourceMappingURL=user.js.map
package/dist/user.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"user.js","sourceRoot":"","sources":["../user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAA;AAC7C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AAEzE,MAAM,CAAC,MAAM,IAAI,GAMb,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAC,EAAE,EAAE,GAAG,KAAK;IAClC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;QACtC,KAAK,EAAE;YACL,IAAI,OAAO,CAAC,QAAQ,CAAC;gBACnB,IAAI,EAAE,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;aAC1E,CAAC;SACH;KACF,CAAC,CAAA;IACF,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;AAC7E,CAAC,CAAU,CAAA"}
package/messages.ts DELETED
@@ -1,6 +0,0 @@
1
- import type { Message } from "@effect/ai/AiInput"
2
- import * as Effect from "effect/Effect"
3
- import * as Ref from "effect/Ref"
4
- import { MessagesRef } from "./Context.ts"
5
-
6
- export const messages: Effect.Effect<Array<Message>, never, MessagesRef> = Effect.flatMap(MessagesRef, Ref.get)
package/set.ts DELETED
@@ -1,11 +0,0 @@
1
- import { Message } from "@effect/ai/AiInput"
2
- import * as Effect from "effect/Effect"
3
- import * as Ref from "effect/Ref"
4
- import { MessagesRef } from "./Context.ts"
5
-
6
- export const set = Effect.fn(function*(messages: Iterable<Message>) {
7
- const messagesRef = yield* MessagesRef
8
- const previous = yield* Ref.get(messagesRef)
9
- yield* Ref.set(messagesRef, [...messages])
10
- return previous
11
- })
package/strand.ts DELETED
@@ -1,38 +0,0 @@
1
- import * as AiInput from "@effect/ai/AiInput"
2
- import * as AiTool from "@effect/ai/AiTool"
3
- import type * as AiToolkit from "@effect/ai/AiToolkit"
4
- import * as Effect from "effect/Effect"
5
- import * as Option from "effect/Option"
6
- import * as Ref from "effect/Ref"
7
- import { MessagesRef, System, Toolkit } from "./Context.ts"
8
-
9
- export interface StrandOptions<in out Tool extends AiTool.Any> {
10
- /** The system prompt. */
11
- system?: string | undefined
12
- /** The initial list of AI input messages. */
13
- messages?: Iterable<AiInput.Message> | undefined
14
- /** The tools to use for by strand. */
15
- toolkit?: AiToolkit.AiToolkit<Tool> | undefined
16
- }
17
-
18
- /** Create an isolated clone of the current conversation to provide for an effect. */
19
- export const strand: <HE = never, T extends AiTool.Any = never>(
20
- options?: StrandOptions<T>,
21
- ) => <A, E, R>(
22
- effect: Effect.Effect<A, E, R>,
23
- ) => Effect.Effect<A, E | HE, Exclude<R, MessagesRef | System> | T> = (options) => (effect) =>
24
- Effect.gen(function*() {
25
- const messagesRef = options?.messages
26
- ? Ref.unsafeMake([...options.messages])
27
- : yield* Option.match(yield* Effect.serviceOption(MessagesRef), {
28
- *onSome(ref) {
29
- return Ref.unsafeMake([...yield* Ref.get(ref)])
30
- },
31
- onNone: () => Ref.make([] as Array<AiInput.Message>),
32
- })
33
- return yield* (effect.pipe(
34
- Effect.provideService(MessagesRef, messagesRef),
35
- Effect.provideService(System, options?.system),
36
- Effect.provideService(Toolkit, options?.toolkit),
37
- ))
38
- }) as never
package/user.ts DELETED
@@ -1,22 +0,0 @@
1
- import * as AiInput from "@effect/ai/AiInput"
2
- import * as Effect from "effect/Effect"
3
- import * as Ref from "effect/Ref"
4
- import { MessagesRef } from "./Context.ts"
5
- import { isTemplateStringsArray } from "./util/isTemplateStringsArray.ts"
6
-
7
- export const user: {
8
- (
9
- template: TemplateStringsArray,
10
- ...substitutions: Array<unknown>
11
- ): Effect.Effect<void, never, MessagesRef>
12
- (message: string): Effect.Effect<void, never, MessagesRef>
13
- } = Effect.fn(function*(e0, ...eRest) {
14
- const message = new AiInput.UserMessage({
15
- parts: [
16
- new AiInput.TextPart({
17
- text: isTemplateStringsArray(e0) ? String.raw({ raw: e0 }, ...eRest) : e0,
18
- }),
19
- ],
20
- })
21
- yield* Ref.update(yield* MessagesRef, (messages) => [...messages, message])
22
- }) as never