liminal 0.9.0 → 0.10.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 +6 -0
- package/L.ts +8 -81
- package/LEvent.ts +17 -0
- package/Strand.ts +37 -38
- package/Taggable.ts +17 -0
- package/append.ts +13 -0
- package/assistant.ts +24 -0
- package/assistantStruct.ts +33 -0
- package/dist/L.d.ts +8 -15
- package/dist/L.js +8 -56
- package/dist/L.js.map +1 -1
- package/dist/LEvent.d.ts +22 -0
- package/dist/LEvent.js +13 -0
- package/dist/LEvent.js.map +1 -0
- package/dist/Strand.d.ts +12 -17
- package/dist/Strand.js +19 -17
- package/dist/Strand.js.map +1 -1
- package/dist/Taggable.d.ts +11 -0
- package/dist/Taggable.js +2 -0
- package/dist/Taggable.js.map +1 -0
- package/dist/append.d.ts +5 -0
- package/dist/append.js +11 -0
- package/dist/append.js.map +1 -0
- package/dist/assistant.d.ts +6 -0
- package/dist/assistant.js +21 -0
- package/dist/assistant.js.map +1 -0
- package/dist/assistantStruct.d.ts +12 -0
- package/dist/assistantStruct.js +21 -0
- package/dist/assistantStruct.js.map +1 -0
- package/dist/events.d.ts +5 -0
- package/dist/events.js +6 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/reduce.d.ts +6 -0
- package/dist/reduce.js +39 -0
- package/dist/reduce.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/turn.d.ts +7 -0
- package/dist/turn.js +21 -0
- package/dist/turn.js.map +1 -0
- package/dist/unsafeSet.d.ts +5 -0
- package/dist/unsafeSet.js +13 -0
- package/dist/unsafeSet.js.map +1 -0
- package/dist/user.d.ts +5 -0
- package/dist/user.js +14 -0
- package/dist/user.js.map +1 -0
- package/events.ts +9 -0
- package/index.ts +2 -1
- package/package.json +7 -5
- package/reduce.ts +56 -0
- package/tsconfig.json +11 -1
- package/turn.ts +25 -0
- package/unsafeSet.ts +15 -0
- package/user.ts +17 -0
- package/dist/util/JSONValue.d.ts +0 -5
- package/dist/util/JSONValue.js +0 -2
- package/dist/util/JSONValue.js.map +0 -1
- package/dist/util/fixTemplateStrings.d.ts +0 -11
- package/dist/util/fixTemplateStrings.js +0 -83
- package/dist/util/fixTemplateStrings.js.map +0 -1
- package/dist/util/isTemplateStringsArray.d.ts +0 -1
- package/dist/util/isTemplateStringsArray.js +0 -4
- package/dist/util/isTemplateStringsArray.js.map +0 -1
- package/util/JSONValue.ts +0 -5
- package/util/fixTemplateStrings.ts +0 -99
- package/util/isTemplateStringsArray.ts +0 -3
package/CHANGELOG.md
CHANGED
package/L.ts
CHANGED
|
@@ -1,81 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export const user: {
|
|
11
|
-
(template: TemplateStringsArray, ...substitutions: Array<unknown>): Effect.Effect<void, never, Strand.Strand>
|
|
12
|
-
(message: string): Effect.Effect<void, never, Strand.Strand>
|
|
13
|
-
(a0: TemplateStringsArray | string, ...aRest: Array<unknown>): Effect.Effect<void, never, Strand.Strand>
|
|
14
|
-
} = Effect.fnUntraced(function*(a0, ...aRest) {
|
|
15
|
-
const { messages, onMessage } = yield* Strand.Strand
|
|
16
|
-
const text = isTemplateStringsArray(a0) ? String.raw({ raw: a0 }, ...aRest) : a0
|
|
17
|
-
const message = new AiInput.UserMessage({
|
|
18
|
-
parts: [new AiInput.TextPart({ text })],
|
|
19
|
-
})
|
|
20
|
-
yield* onMessage(message)
|
|
21
|
-
messages.push(message)
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
export const messages: Effect.Effect<Array<AiInput.Message>, never, Strand.Strand> = Effect.map(
|
|
25
|
-
Strand.Strand,
|
|
26
|
-
({ messages }) => messages,
|
|
27
|
-
)
|
|
28
|
-
|
|
29
|
-
export const setMessages: (
|
|
30
|
-
messages: Iterable<AiInput.Message>,
|
|
31
|
-
) => Effect.Effect<Array<AiInput.Message>, never, Strand.Strand> = Effect.fnUntraced(
|
|
32
|
-
function*(messages: Iterable<AiInput.Message>) {
|
|
33
|
-
const strand = yield* Strand.Strand
|
|
34
|
-
const { messages: prev } = strand
|
|
35
|
-
strand.messages = [...messages]
|
|
36
|
-
return prev
|
|
37
|
-
},
|
|
38
|
-
)
|
|
39
|
-
|
|
40
|
-
export const assistantText: Effect.Effect<
|
|
41
|
-
string,
|
|
42
|
-
AiError.AiError,
|
|
43
|
-
AiLanguageModel.AiLanguageModel | Strand.Strand
|
|
44
|
-
> = Effect.gen(function*() {
|
|
45
|
-
const model = yield* AiLanguageModel.AiLanguageModel
|
|
46
|
-
const { system, messages, tools } = yield* Strand.Strand
|
|
47
|
-
const response = yield* model.generateText({
|
|
48
|
-
system,
|
|
49
|
-
prompt: messages,
|
|
50
|
-
toolkit: AiToolkit.make(...tools ?? []) as never,
|
|
51
|
-
})
|
|
52
|
-
const { text } = response
|
|
53
|
-
yield* append(text)
|
|
54
|
-
return text
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
export const assistantStruct: <O, I extends Record<string, unknown>>(
|
|
58
|
-
schema: Schema.Schema<O, I, never>,
|
|
59
|
-
) => Effect.Effect<O, AiError.AiError, AiLanguageModel.AiLanguageModel | Strand.Strand> = Effect.fnUntraced(
|
|
60
|
-
function*(schema) {
|
|
61
|
-
const model = yield* AiLanguageModel.AiLanguageModel
|
|
62
|
-
const { system, messages } = yield* Strand.Strand
|
|
63
|
-
const response = yield* model.generateObject({
|
|
64
|
-
system,
|
|
65
|
-
schema,
|
|
66
|
-
prompt: messages,
|
|
67
|
-
})
|
|
68
|
-
const { value, text } = response
|
|
69
|
-
yield* append(text)
|
|
70
|
-
return value
|
|
71
|
-
},
|
|
72
|
-
)
|
|
73
|
-
|
|
74
|
-
const append = Effect.fnUntraced(function*(text: string) {
|
|
75
|
-
const { messages, onMessage } = yield* Strand.Strand
|
|
76
|
-
const message = new AiInput.AssistantMessage({
|
|
77
|
-
parts: [new AiInput.TextPart({ text })],
|
|
78
|
-
})
|
|
79
|
-
yield* onMessage(message)
|
|
80
|
-
messages.push(message)
|
|
81
|
-
})
|
|
1
|
+
export * from "./append.ts"
|
|
2
|
+
export * from "./assistant.ts"
|
|
3
|
+
export * from "./assistantStruct.ts"
|
|
4
|
+
export * from "./events.ts"
|
|
5
|
+
export * from "./reduce.ts"
|
|
6
|
+
export * from "./turn.ts"
|
|
7
|
+
export * from "./unsafeSet.ts"
|
|
8
|
+
export * from "./user.ts"
|
package/LEvent.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Message } from "@effect/ai/AiInput"
|
|
2
|
+
import * as Schema from "effect/Schema"
|
|
3
|
+
|
|
4
|
+
export class MessagesAppended extends Schema.TaggedClass<MessagesAppended>("MessagesAppended")("MessagesAppended", {
|
|
5
|
+
messages: Schema.Array(Message),
|
|
6
|
+
}) {}
|
|
7
|
+
|
|
8
|
+
export class MessagesReduced extends Schema.TaggedClass<MessagesReduced>("MessagesReduced")("MessagesReduced", {
|
|
9
|
+
previous: Schema.Array(Message),
|
|
10
|
+
messages: Schema.Array(Message),
|
|
11
|
+
}) {}
|
|
12
|
+
|
|
13
|
+
export type LEvent = typeof LEvent.Type
|
|
14
|
+
export const LEvent: Schema.Union<[
|
|
15
|
+
typeof MessagesAppended,
|
|
16
|
+
typeof MessagesReduced,
|
|
17
|
+
]> = Schema.Union(MessagesAppended, MessagesReduced)
|
package/Strand.ts
CHANGED
|
@@ -1,46 +1,45 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Message } from "@effect/ai/AiInput"
|
|
2
2
|
import * 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
|
-
import * as
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
/** The system prompt. */
|
|
10
|
-
system?: string | undefined
|
|
11
|
-
/** The initial list of AI input messages. */
|
|
12
|
-
messages?: Array<AiInput.Message> | undefined
|
|
13
|
-
/** Handler to be execute when messages are appended. */
|
|
14
|
-
onMessage?: (message: AiInput.Message) => Effect.Effect<void, E, R>
|
|
15
|
-
}
|
|
6
|
+
import * as PubSub from "effect/PubSub"
|
|
7
|
+
import type { LEvent } from "./LEvent.ts"
|
|
8
|
+
import { normalize, type OptionallyTaggable } from "./Taggable.ts"
|
|
16
9
|
|
|
17
10
|
export class Strand extends Context.Tag("liminal/Strand")<Strand, {
|
|
18
|
-
system?: string | undefined
|
|
19
|
-
messages: Array<
|
|
20
|
-
tools?: Array<AiTool.AiTool<string>>
|
|
21
|
-
|
|
22
|
-
}>() {
|
|
11
|
+
readonly system?: string | undefined
|
|
12
|
+
messages: Array<Message>
|
|
13
|
+
tools?: Array<AiTool.AiTool<string>> | undefined
|
|
14
|
+
readonly events: PubSub.PubSub<LEvent>
|
|
15
|
+
}>() {
|
|
16
|
+
/** Create a layer for a Strand, which represents an conversation isolate. */
|
|
17
|
+
static new: OptionallyTaggable<Layer.Layer<Strand>> = (a0, ...aRest) =>
|
|
18
|
+
Layer.effect(
|
|
19
|
+
Strand,
|
|
20
|
+
PubSub.unbounded<LEvent>().pipe(
|
|
21
|
+
Effect.map((events) =>
|
|
22
|
+
Strand.of({
|
|
23
|
+
system: normalize(a0, aRest),
|
|
24
|
+
messages: [],
|
|
25
|
+
events,
|
|
26
|
+
})
|
|
27
|
+
),
|
|
28
|
+
),
|
|
29
|
+
)
|
|
23
30
|
|
|
24
|
-
/** Create
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}),
|
|
37
|
-
onNone: () => ({
|
|
38
|
-
system: config?.system,
|
|
39
|
-
messages: config?.messages ?? [],
|
|
40
|
-
onMessage: (config?.onMessage ?? (() => Effect.succeed(undefined))) as never,
|
|
31
|
+
/** Create a layer for a Strand, which represents an conversation isolate. */
|
|
32
|
+
static clone: OptionallyTaggable<Layer.Layer<Strand, never, Strand>> = (a0, ...aRest) =>
|
|
33
|
+
Layer.effect(
|
|
34
|
+
Strand,
|
|
35
|
+
Effect.gen(function*() {
|
|
36
|
+
const { system, messages, tools } = yield* Strand
|
|
37
|
+
return Strand.of({
|
|
38
|
+
system: a0 ? normalize(a0, aRest) : system,
|
|
39
|
+
messages: [...messages],
|
|
40
|
+
tools,
|
|
41
|
+
events: yield* PubSub.unbounded<LEvent>(),
|
|
42
|
+
})
|
|
41
43
|
}),
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
export const layer: <E = never, R = never>(config?: StrandConfig<E, R>) => Layer.Layer<Strand, E, R> = (config) =>
|
|
46
|
-
Layer.effect(Strand, make(config))
|
|
44
|
+
)
|
|
45
|
+
}
|
package/Taggable.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type Taggable<T> = {
|
|
2
|
+
(value: string): T
|
|
3
|
+
(template: TemplateStringsArray, ...substitutions: Array<unknown>): T
|
|
4
|
+
(template: string | TemplateStringsArray, ...substitutions: Array<unknown>): T
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export type OptionallyTaggable<T> = {
|
|
8
|
+
(value?: string | undefined): T
|
|
9
|
+
(template: TemplateStringsArray, ...substitutions: Array<unknown>): T
|
|
10
|
+
(template?: string | TemplateStringsArray | undefined, ...substitutions: Array<unknown>): T
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export const normalize = <A0 extends string | TemplateStringsArray | undefined>(
|
|
14
|
+
a0: A0,
|
|
15
|
+
aRest: Array<unknown> = [],
|
|
16
|
+
): string | (undefined extends A0 ? undefined : never) =>
|
|
17
|
+
a0 ? typeof a0 === "string" ? a0 : String.raw(a0, aRest) : undefined as never
|
package/append.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Message } from "@effect/ai/AiInput"
|
|
2
|
+
import * as Effect from "effect/Effect"
|
|
3
|
+
import { MessagesAppended } from "./LEvent.ts"
|
|
4
|
+
import { Strand } from "./Strand.ts"
|
|
5
|
+
|
|
6
|
+
/** Append messages to the current strand's message list. */
|
|
7
|
+
export const append: (
|
|
8
|
+
...messages: Array<Message>
|
|
9
|
+
) => Effect.Effect<void, never, Strand> = Effect.fnUntraced(function*(...messages) {
|
|
10
|
+
const strand = yield* Strand
|
|
11
|
+
strand.messages.push(...messages)
|
|
12
|
+
yield* strand.events.publish(MessagesAppended.make({ messages }))
|
|
13
|
+
})
|
package/assistant.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AiError } from "@effect/ai/AiError"
|
|
2
|
+
import { AssistantMessage, TextPart } from "@effect/ai/AiInput"
|
|
3
|
+
import { AiLanguageModel } from "@effect/ai/AiLanguageModel"
|
|
4
|
+
import * as AiToolkit from "@effect/ai/AiToolkit"
|
|
5
|
+
import * as Effect from "effect/Effect"
|
|
6
|
+
import { append } from "./append.ts"
|
|
7
|
+
import { Strand } from "./Strand.ts"
|
|
8
|
+
|
|
9
|
+
/** Infer an assistant message and append it to the conversation. */
|
|
10
|
+
export const assistant: Effect.Effect<string, AiError, AiLanguageModel | Strand> = Effect.gen(function*() {
|
|
11
|
+
const model = yield* AiLanguageModel
|
|
12
|
+
const { system, messages, tools } = yield* Strand
|
|
13
|
+
const { text } = yield* model.generateText({
|
|
14
|
+
system,
|
|
15
|
+
prompt: messages,
|
|
16
|
+
toolkit: AiToolkit.make(...tools ?? []) as never,
|
|
17
|
+
})
|
|
18
|
+
yield* append(
|
|
19
|
+
new AssistantMessage({
|
|
20
|
+
parts: [new TextPart({ text })],
|
|
21
|
+
}),
|
|
22
|
+
)
|
|
23
|
+
return text
|
|
24
|
+
})
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { AiError } from "@effect/ai/AiError"
|
|
2
|
+
import { AssistantMessage, TextPart } from "@effect/ai/AiInput"
|
|
3
|
+
import { AiLanguageModel } from "@effect/ai/AiLanguageModel"
|
|
4
|
+
import * as Effect from "effect/Effect"
|
|
5
|
+
import * as Schema from "effect/Schema"
|
|
6
|
+
import { append } from "./append.ts"
|
|
7
|
+
import { Strand } from "./Strand.ts"
|
|
8
|
+
|
|
9
|
+
/** Infer a structured assistant message and append its JSON representation to the conversation. */
|
|
10
|
+
export const assistantStruct: {
|
|
11
|
+
<F extends Record<string, Schema.Schema.AnyNoContext>>(
|
|
12
|
+
fields: F,
|
|
13
|
+
): Effect.Effect<{ [K in keyof F]: Schema.Schema.Type<F[K]> }, AiError, AiLanguageModel | Strand>
|
|
14
|
+
<O, I extends Record<string, unknown>>(
|
|
15
|
+
schema: Schema.Schema<O, I, never>,
|
|
16
|
+
): Effect.Effect<O, AiError, AiLanguageModel | Strand>
|
|
17
|
+
} = Effect.fnUntraced(
|
|
18
|
+
function*(schema) {
|
|
19
|
+
const model = yield* AiLanguageModel
|
|
20
|
+
const { system, messages } = yield* Strand
|
|
21
|
+
const { value, text } = yield* model.generateObject({
|
|
22
|
+
system,
|
|
23
|
+
schema: Schema.isSchema(schema) ? schema as Schema.Schema.AnyNoContext : Schema.Struct(schema),
|
|
24
|
+
prompt: messages,
|
|
25
|
+
})
|
|
26
|
+
yield* append(
|
|
27
|
+
new AssistantMessage({
|
|
28
|
+
parts: [new TextPart({ text })],
|
|
29
|
+
}),
|
|
30
|
+
)
|
|
31
|
+
return value
|
|
32
|
+
},
|
|
33
|
+
)
|
package/dist/L.d.ts
CHANGED
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export
|
|
8
|
-
|
|
9
|
-
(message: string): Effect.Effect<void, never, Strand.Strand>;
|
|
10
|
-
(a0: TemplateStringsArray | string, ...aRest: Array<unknown>): Effect.Effect<void, never, Strand.Strand>;
|
|
11
|
-
};
|
|
12
|
-
export declare const messages: Effect.Effect<Array<AiInput.Message>, never, Strand.Strand>;
|
|
13
|
-
export declare const setMessages: (messages: Iterable<AiInput.Message>) => Effect.Effect<Array<AiInput.Message>, never, Strand.Strand>;
|
|
14
|
-
export declare const assistantText: Effect.Effect<string, AiError.AiError, AiLanguageModel.AiLanguageModel | Strand.Strand>;
|
|
15
|
-
export declare const assistantStruct: <O, I extends Record<string, unknown>>(schema: Schema.Schema<O, I, never>) => Effect.Effect<O, AiError.AiError, AiLanguageModel.AiLanguageModel | Strand.Strand>;
|
|
1
|
+
export * from "./append.ts";
|
|
2
|
+
export * from "./assistant.ts";
|
|
3
|
+
export * from "./assistantStruct.ts";
|
|
4
|
+
export * from "./events.ts";
|
|
5
|
+
export * from "./reduce.ts";
|
|
6
|
+
export * from "./turn.ts";
|
|
7
|
+
export * from "./unsafeSet.ts";
|
|
8
|
+
export * from "./user.ts";
|
package/dist/L.js
CHANGED
|
@@ -1,57 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
export const user = Effect.fnUntraced(function* (a0, ...aRest) {
|
|
10
|
-
const { messages, onMessage } = yield* Strand.Strand;
|
|
11
|
-
const text = isTemplateStringsArray(a0) ? String.raw({ raw: a0 }, ...aRest) : a0;
|
|
12
|
-
const message = new AiInput.UserMessage({
|
|
13
|
-
parts: [new AiInput.TextPart({ text })],
|
|
14
|
-
});
|
|
15
|
-
yield* onMessage(message);
|
|
16
|
-
messages.push(message);
|
|
17
|
-
});
|
|
18
|
-
export const messages = Effect.map(Strand.Strand, ({ messages }) => messages);
|
|
19
|
-
export const setMessages = Effect.fnUntraced(function* (messages) {
|
|
20
|
-
const strand = yield* Strand.Strand;
|
|
21
|
-
const { messages: prev } = strand;
|
|
22
|
-
strand.messages = [...messages];
|
|
23
|
-
return prev;
|
|
24
|
-
});
|
|
25
|
-
export const assistantText = Effect.gen(function* () {
|
|
26
|
-
const model = yield* AiLanguageModel.AiLanguageModel;
|
|
27
|
-
const { system, messages, tools } = yield* Strand.Strand;
|
|
28
|
-
const response = yield* model.generateText({
|
|
29
|
-
system,
|
|
30
|
-
prompt: messages,
|
|
31
|
-
toolkit: AiToolkit.make(...tools ?? []),
|
|
32
|
-
});
|
|
33
|
-
const { text } = response;
|
|
34
|
-
yield* append(text);
|
|
35
|
-
return text;
|
|
36
|
-
});
|
|
37
|
-
export const assistantStruct = Effect.fnUntraced(function* (schema) {
|
|
38
|
-
const model = yield* AiLanguageModel.AiLanguageModel;
|
|
39
|
-
const { system, messages } = yield* Strand.Strand;
|
|
40
|
-
const response = yield* model.generateObject({
|
|
41
|
-
system,
|
|
42
|
-
schema,
|
|
43
|
-
prompt: messages,
|
|
44
|
-
});
|
|
45
|
-
const { value, text } = response;
|
|
46
|
-
yield* append(text);
|
|
47
|
-
return value;
|
|
48
|
-
});
|
|
49
|
-
const append = Effect.fnUntraced(function* (text) {
|
|
50
|
-
const { messages, onMessage } = yield* Strand.Strand;
|
|
51
|
-
const message = new AiInput.AssistantMessage({
|
|
52
|
-
parts: [new AiInput.TextPart({ text })],
|
|
53
|
-
});
|
|
54
|
-
yield* onMessage(message);
|
|
55
|
-
messages.push(message);
|
|
56
|
-
});
|
|
1
|
+
export * from "./append.js";
|
|
2
|
+
export * from "./assistant.js";
|
|
3
|
+
export * from "./assistantStruct.js";
|
|
4
|
+
export * from "./events.js";
|
|
5
|
+
export * from "./reduce.js";
|
|
6
|
+
export * from "./turn.js";
|
|
7
|
+
export * from "./unsafeSet.js";
|
|
8
|
+
export * from "./user.js";
|
|
57
9
|
//# sourceMappingURL=L.js.map
|
package/dist/L.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"L.js","sourceRoot":"","sources":["../L.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"L.js","sourceRoot":"","sources":["../L.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,aAAa,CAAA;AAC3B,cAAc,aAAa,CAAA;AAC3B,cAAc,WAAW,CAAA;AACzB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,WAAW,CAAA"}
|
package/dist/LEvent.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as Schema from "effect/Schema";
|
|
2
|
+
declare const MessagesAppended_base: Schema.TaggedClass<MessagesAppended, "MessagesAppended", {
|
|
3
|
+
readonly _tag: Schema.tag<"MessagesAppended">;
|
|
4
|
+
} & {
|
|
5
|
+
messages: Schema.Array$<Schema.Union<[typeof import("@effect/ai/AiInput").UserMessage, typeof import("@effect/ai/AiInput").AssistantMessage, typeof import("@effect/ai/AiInput").ToolMessage]>>;
|
|
6
|
+
}>;
|
|
7
|
+
export declare class MessagesAppended extends MessagesAppended_base {
|
|
8
|
+
}
|
|
9
|
+
declare const MessagesReduced_base: Schema.TaggedClass<MessagesReduced, "MessagesReduced", {
|
|
10
|
+
readonly _tag: Schema.tag<"MessagesReduced">;
|
|
11
|
+
} & {
|
|
12
|
+
previous: Schema.Array$<Schema.Union<[typeof import("@effect/ai/AiInput").UserMessage, typeof import("@effect/ai/AiInput").AssistantMessage, typeof import("@effect/ai/AiInput").ToolMessage]>>;
|
|
13
|
+
messages: Schema.Array$<Schema.Union<[typeof import("@effect/ai/AiInput").UserMessage, typeof import("@effect/ai/AiInput").AssistantMessage, typeof import("@effect/ai/AiInput").ToolMessage]>>;
|
|
14
|
+
}>;
|
|
15
|
+
export declare class MessagesReduced extends MessagesReduced_base {
|
|
16
|
+
}
|
|
17
|
+
export type LEvent = typeof LEvent.Type;
|
|
18
|
+
export declare const LEvent: Schema.Union<[
|
|
19
|
+
typeof MessagesAppended,
|
|
20
|
+
typeof MessagesReduced
|
|
21
|
+
]>;
|
|
22
|
+
export {};
|
package/dist/LEvent.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Message } from "@effect/ai/AiInput";
|
|
2
|
+
import * as Schema from "effect/Schema";
|
|
3
|
+
export class MessagesAppended extends Schema.TaggedClass("MessagesAppended")("MessagesAppended", {
|
|
4
|
+
messages: Schema.Array(Message),
|
|
5
|
+
}) {
|
|
6
|
+
}
|
|
7
|
+
export class MessagesReduced extends Schema.TaggedClass("MessagesReduced")("MessagesReduced", {
|
|
8
|
+
previous: Schema.Array(Message),
|
|
9
|
+
messages: Schema.Array(Message),
|
|
10
|
+
}) {
|
|
11
|
+
}
|
|
12
|
+
export const LEvent = Schema.Union(MessagesAppended, MessagesReduced);
|
|
13
|
+
//# sourceMappingURL=LEvent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LEvent.js","sourceRoot":"","sources":["../LEvent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,MAAM,OAAO,gBAAiB,SAAQ,MAAM,CAAC,WAAW,CAAmB,kBAAkB,CAAC,CAAC,kBAAkB,EAAE;IACjH,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;CAChC,CAAC;CAAG;AAEL,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,WAAW,CAAkB,iBAAiB,CAAC,CAAC,iBAAiB,EAAE;IAC7G,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;CAChC,CAAC;CAAG;AAGL,MAAM,CAAC,MAAM,MAAM,GAGd,MAAM,CAAC,KAAK,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAA"}
|
package/dist/Strand.d.ts
CHANGED
|
@@ -1,25 +1,20 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Message } from "@effect/ai/AiInput";
|
|
2
2
|
import * as AiTool from "@effect/ai/AiTool";
|
|
3
3
|
import * as Context from "effect/Context";
|
|
4
|
-
import * as Effect from "effect/Effect";
|
|
5
4
|
import * as Layer from "effect/Layer";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
/** The initial list of AI input messages. */
|
|
10
|
-
messages?: Array<AiInput.Message> | undefined;
|
|
11
|
-
/** Handler to be execute when messages are appended. */
|
|
12
|
-
onMessage?: (message: AiInput.Message) => Effect.Effect<void, E, R>;
|
|
13
|
-
}
|
|
5
|
+
import * as PubSub from "effect/PubSub";
|
|
6
|
+
import type { LEvent } from "./LEvent.ts";
|
|
7
|
+
import { type OptionallyTaggable } from "./Taggable.ts";
|
|
14
8
|
declare const Strand_base: Context.TagClass<Strand, "liminal/Strand", {
|
|
15
|
-
system?: string | undefined;
|
|
16
|
-
messages: Array<
|
|
17
|
-
tools?: Array<AiTool.AiTool<string
|
|
18
|
-
|
|
9
|
+
readonly system?: string | undefined;
|
|
10
|
+
messages: Array<Message>;
|
|
11
|
+
tools?: Array<AiTool.AiTool<string>> | undefined;
|
|
12
|
+
readonly events: PubSub.PubSub<LEvent>;
|
|
19
13
|
}>;
|
|
20
14
|
export declare class Strand extends Strand_base {
|
|
15
|
+
/** Create a layer for a Strand, which represents an conversation isolate. */
|
|
16
|
+
static new: OptionallyTaggable<Layer.Layer<Strand>>;
|
|
17
|
+
/** Create a layer for a Strand, which represents an conversation isolate. */
|
|
18
|
+
static clone: OptionallyTaggable<Layer.Layer<Strand, never, Strand>>;
|
|
21
19
|
}
|
|
22
|
-
/** Create an isolated clone of the current conversation to provide for an effect. */
|
|
23
|
-
export declare const make: <E = never, R = never>(config?: StrandConfig<E, R>) => Effect.Effect<Strand["Type"], E, R>;
|
|
24
|
-
export declare const layer: <E = never, R = never>(config?: StrandConfig<E, R>) => Layer.Layer<Strand, E, R>;
|
|
25
20
|
export {};
|
package/dist/Strand.js
CHANGED
|
@@ -1,24 +1,26 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Message } from "@effect/ai/AiInput";
|
|
2
2
|
import * 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
|
-
import * as
|
|
6
|
+
import * as PubSub from "effect/PubSub";
|
|
7
|
+
import { normalize } from "./Taggable.js";
|
|
7
8
|
export class Strand extends Context.Tag("liminal/Strand")() {
|
|
9
|
+
/** Create a layer for a Strand, which represents an conversation isolate. */
|
|
10
|
+
static new = (a0, ...aRest) => Layer.effect(Strand, PubSub.unbounded().pipe(Effect.map((events) => Strand.of({
|
|
11
|
+
system: normalize(a0, aRest),
|
|
12
|
+
messages: [],
|
|
13
|
+
events,
|
|
14
|
+
}))));
|
|
15
|
+
/** Create a layer for a Strand, which represents an conversation isolate. */
|
|
16
|
+
static clone = (a0, ...aRest) => Layer.effect(Strand, Effect.gen(function* () {
|
|
17
|
+
const { system, messages, tools } = yield* Strand;
|
|
18
|
+
return Strand.of({
|
|
19
|
+
system: a0 ? normalize(a0, aRest) : system,
|
|
20
|
+
messages: [...messages],
|
|
21
|
+
tools,
|
|
22
|
+
events: yield* PubSub.unbounded(),
|
|
23
|
+
});
|
|
24
|
+
}));
|
|
8
25
|
}
|
|
9
|
-
/** Create an isolated clone of the current conversation to provide for an effect. */
|
|
10
|
-
export const make = (config) => Effect.map(Effect.serviceOption(Strand), Option.match({
|
|
11
|
-
onSome: ({ system, messages, tools, onMessage }) => ({
|
|
12
|
-
system: config ? config?.system : system,
|
|
13
|
-
messages: [...config ? config?.messages ?? [] : messages],
|
|
14
|
-
tools: [...tools ?? []],
|
|
15
|
-
onMessage: onMessage ?? (() => Effect.succeed(undefined)),
|
|
16
|
-
}),
|
|
17
|
-
onNone: () => ({
|
|
18
|
-
system: config?.system,
|
|
19
|
-
messages: config?.messages ?? [],
|
|
20
|
-
onMessage: (config?.onMessage ?? (() => Effect.succeed(undefined))),
|
|
21
|
-
}),
|
|
22
|
-
}));
|
|
23
|
-
export const layer = (config) => Layer.effect(Strand, make(config));
|
|
24
26
|
//# sourceMappingURL=Strand.js.map
|
package/dist/Strand.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Strand.js","sourceRoot":"","sources":["../Strand.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"Strand.js","sourceRoot":"","sources":["../Strand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAA;AAC3C,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;AAEvC,OAAO,EAAE,SAAS,EAA2B,MAAM,eAAe,CAAA;AAElE,MAAM,OAAO,MAAO,SAAQ,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAKrD;IACF,6EAA6E;IAC7E,MAAM,CAAC,GAAG,GAA4C,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CACrE,KAAK,CAAC,MAAM,CACV,MAAM,EACN,MAAM,CAAC,SAAS,EAAU,CAAC,IAAI,CAC7B,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CACpB,MAAM,CAAC,EAAE,CAAC;QACR,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC;QAC5B,QAAQ,EAAE,EAAE;QACZ,MAAM;KACP,CAAC,CACH,CACF,CACF,CAAA;IAEH,6EAA6E;IAC7E,MAAM,CAAC,KAAK,GAA2D,CAAC,EAAE,EAAE,GAAG,KAAK,EAAE,EAAE,CACtF,KAAK,CAAC,MAAM,CACV,MAAM,EACN,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;QACjD,OAAO,MAAM,CAAC,EAAE,CAAC;YACf,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM;YAC1C,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC;YACvB,KAAK;YACL,MAAM,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,SAAS,EAAU;SAC1C,CAAC,CAAA;IACJ,CAAC,CAAC,CACH,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type Taggable<T> = {
|
|
2
|
+
(value: string): T;
|
|
3
|
+
(template: TemplateStringsArray, ...substitutions: Array<unknown>): T;
|
|
4
|
+
(template: string | TemplateStringsArray, ...substitutions: Array<unknown>): T;
|
|
5
|
+
};
|
|
6
|
+
export type OptionallyTaggable<T> = {
|
|
7
|
+
(value?: string | undefined): T;
|
|
8
|
+
(template: TemplateStringsArray, ...substitutions: Array<unknown>): T;
|
|
9
|
+
(template?: string | TemplateStringsArray | undefined, ...substitutions: Array<unknown>): T;
|
|
10
|
+
};
|
|
11
|
+
export declare const normalize: <A0 extends string | TemplateStringsArray | undefined>(a0: A0, aRest?: Array<unknown>) => string | (undefined extends A0 ? undefined : never);
|
package/dist/Taggable.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Taggable.js","sourceRoot":"","sources":["../Taggable.ts"],"names":[],"mappings":"AAYA,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,EAAM,EACN,QAAwB,EAAE,EAC2B,EAAE,CACvD,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,SAAkB,CAAA"}
|
package/dist/append.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Message } from "@effect/ai/AiInput";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import { Strand } from "./Strand.ts";
|
|
4
|
+
/** Append messages to the current strand's message list. */
|
|
5
|
+
export declare const append: (...messages: Array<Message>) => Effect.Effect<void, never, Strand>;
|
package/dist/append.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Message } from "@effect/ai/AiInput";
|
|
2
|
+
import * as Effect from "effect/Effect";
|
|
3
|
+
import { MessagesAppended } from "./LEvent.js";
|
|
4
|
+
import { Strand } from "./Strand.js";
|
|
5
|
+
/** Append messages to the current strand's message list. */
|
|
6
|
+
export const append = Effect.fnUntraced(function* (...messages) {
|
|
7
|
+
const strand = yield* Strand;
|
|
8
|
+
strand.messages.push(...messages);
|
|
9
|
+
yield* strand.events.publish(MessagesAppended.make({ messages }));
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=append.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"append.js","sourceRoot":"","sources":["../append.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,4DAA4D;AAC5D,MAAM,CAAC,MAAM,MAAM,GAEuB,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAC,GAAG,QAAQ;IAC/E,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IAC5B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;IACjC,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;AACnE,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AiError } from "@effect/ai/AiError";
|
|
2
|
+
import { AiLanguageModel } from "@effect/ai/AiLanguageModel";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import { Strand } from "./Strand.ts";
|
|
5
|
+
/** Infer an assistant message and append it to the conversation. */
|
|
6
|
+
export declare const assistant: Effect.Effect<string, AiError, AiLanguageModel | Strand>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { AssistantMessage, TextPart } from "@effect/ai/AiInput";
|
|
2
|
+
import { AiLanguageModel } from "@effect/ai/AiLanguageModel";
|
|
3
|
+
import * as AiToolkit from "@effect/ai/AiToolkit";
|
|
4
|
+
import * as Effect from "effect/Effect";
|
|
5
|
+
import { append } from "./append.js";
|
|
6
|
+
import { Strand } from "./Strand.js";
|
|
7
|
+
/** Infer an assistant message and append it to the conversation. */
|
|
8
|
+
export const assistant = Effect.gen(function* () {
|
|
9
|
+
const model = yield* AiLanguageModel;
|
|
10
|
+
const { system, messages, tools } = yield* Strand;
|
|
11
|
+
const { text } = yield* model.generateText({
|
|
12
|
+
system,
|
|
13
|
+
prompt: messages,
|
|
14
|
+
toolkit: AiToolkit.make(...tools ?? []),
|
|
15
|
+
});
|
|
16
|
+
yield* append(new AssistantMessage({
|
|
17
|
+
parts: [new TextPart({ text })],
|
|
18
|
+
}));
|
|
19
|
+
return text;
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=assistant.js.map
|
|
@@ -0,0 +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,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;QACN,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAU;KACjD,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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { AiError } from "@effect/ai/AiError";
|
|
2
|
+
import { AiLanguageModel } from "@effect/ai/AiLanguageModel";
|
|
3
|
+
import * as Effect from "effect/Effect";
|
|
4
|
+
import * as Schema from "effect/Schema";
|
|
5
|
+
import { Strand } from "./Strand.ts";
|
|
6
|
+
/** Infer a structured assistant message and append its JSON representation to the conversation. */
|
|
7
|
+
export declare const assistantStruct: {
|
|
8
|
+
<F extends Record<string, Schema.Schema.AnyNoContext>>(fields: F): Effect.Effect<{
|
|
9
|
+
[K in keyof F]: Schema.Schema.Type<F[K]>;
|
|
10
|
+
}, AiError, AiLanguageModel | Strand>;
|
|
11
|
+
<O, I extends Record<string, unknown>>(schema: Schema.Schema<O, I, never>): Effect.Effect<O, AiError, AiLanguageModel | Strand>;
|
|
12
|
+
};
|