@effect/ai 0.26.0 → 0.27.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/Chat/package.json +6 -0
- package/EmbeddingModel/package.json +6 -0
- package/IdGenerator/package.json +6 -0
- package/LanguageModel/package.json +6 -0
- package/Model/package.json +6 -0
- package/Prompt/package.json +6 -0
- package/Response/package.json +6 -0
- package/Telemetry/package.json +6 -0
- package/Tool/package.json +6 -0
- package/Toolkit/package.json +6 -0
- package/dist/cjs/AiError.js +575 -11
- package/dist/cjs/AiError.js.map +1 -1
- package/dist/cjs/Chat.js +302 -0
- package/dist/cjs/Chat.js.map +1 -0
- package/dist/cjs/EmbeddingModel.js +184 -0
- package/dist/cjs/EmbeddingModel.js.map +1 -0
- package/dist/cjs/IdGenerator.js +255 -0
- package/dist/cjs/IdGenerator.js.map +1 -0
- package/dist/cjs/LanguageModel.js +584 -0
- package/dist/cjs/LanguageModel.js.map +1 -0
- package/dist/cjs/McpServer.js +12 -4
- package/dist/cjs/McpServer.js.map +1 -1
- package/dist/cjs/Model.js +118 -0
- package/dist/cjs/Model.js.map +1 -0
- package/dist/cjs/Prompt.js +649 -0
- package/dist/cjs/Prompt.js.map +1 -0
- package/dist/cjs/Response.js +635 -0
- package/dist/cjs/Response.js.map +1 -0
- package/dist/cjs/Telemetry.js +176 -0
- package/dist/cjs/Telemetry.js.map +1 -0
- package/dist/cjs/Tokenizer.js +87 -8
- package/dist/cjs/Tokenizer.js.map +1 -1
- package/dist/cjs/Tool.js +556 -0
- package/dist/cjs/Tool.js.map +1 -0
- package/dist/cjs/Toolkit.js +279 -0
- package/dist/cjs/Toolkit.js.map +1 -0
- package/dist/cjs/index.js +21 -19
- package/dist/dts/AiError.d.ts +577 -9
- package/dist/dts/AiError.d.ts.map +1 -1
- package/dist/dts/Chat.d.ts +356 -0
- package/dist/dts/Chat.d.ts.map +1 -0
- package/dist/dts/EmbeddingModel.d.ts +153 -0
- package/dist/dts/EmbeddingModel.d.ts.map +1 -0
- package/dist/dts/IdGenerator.d.ts +272 -0
- package/dist/dts/IdGenerator.d.ts.map +1 -0
- package/dist/dts/LanguageModel.d.ts +458 -0
- package/dist/dts/LanguageModel.d.ts.map +1 -0
- package/dist/dts/McpSchema.d.ts +25 -25
- package/dist/dts/McpServer.d.ts +6 -4
- package/dist/dts/McpServer.d.ts.map +1 -1
- package/dist/dts/Model.d.ts +124 -0
- package/dist/dts/Model.d.ts.map +1 -0
- package/dist/dts/Prompt.d.ts +1119 -0
- package/dist/dts/Prompt.d.ts.map +1 -0
- package/dist/dts/Response.d.ts +1519 -0
- package/dist/dts/Response.d.ts.map +1 -0
- package/dist/dts/Telemetry.d.ts +520 -0
- package/dist/dts/Telemetry.d.ts.map +1 -0
- package/dist/dts/Tokenizer.d.ts +131 -13
- package/dist/dts/Tokenizer.d.ts.map +1 -1
- package/dist/dts/Tool.d.ts +876 -0
- package/dist/dts/Tool.d.ts.map +1 -0
- package/dist/dts/Toolkit.d.ts +310 -0
- package/dist/dts/Toolkit.d.ts.map +1 -0
- package/dist/dts/index.d.ts +498 -13
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/esm/AiError.js +570 -10
- package/dist/esm/AiError.js.map +1 -1
- package/dist/esm/Chat.js +291 -0
- package/dist/esm/Chat.js.map +1 -0
- package/dist/esm/EmbeddingModel.js +173 -0
- package/dist/esm/EmbeddingModel.js.map +1 -0
- package/dist/esm/IdGenerator.js +245 -0
- package/dist/esm/IdGenerator.js.map +1 -0
- package/dist/esm/LanguageModel.js +572 -0
- package/dist/esm/LanguageModel.js.map +1 -0
- package/dist/esm/McpServer.js +12 -4
- package/dist/esm/McpServer.js.map +1 -1
- package/dist/esm/Model.js +108 -0
- package/dist/esm/Model.js.map +1 -0
- package/dist/esm/Prompt.js +633 -0
- package/dist/esm/Prompt.js.map +1 -0
- package/dist/esm/Response.js +619 -0
- package/dist/esm/Response.js.map +1 -0
- package/dist/esm/Telemetry.js +166 -0
- package/dist/esm/Telemetry.js.map +1 -0
- package/dist/esm/Tokenizer.js +87 -8
- package/dist/esm/Tokenizer.js.map +1 -1
- package/dist/esm/Tool.js +534 -0
- package/dist/esm/Tool.js.map +1 -0
- package/dist/esm/Toolkit.js +269 -0
- package/dist/esm/Toolkit.js.map +1 -0
- package/dist/esm/index.js +498 -13
- package/dist/esm/index.js.map +1 -1
- package/package.json +76 -68
- package/src/AiError.ts +739 -9
- package/src/Chat.ts +546 -0
- package/src/EmbeddingModel.ts +311 -0
- package/src/IdGenerator.ts +320 -0
- package/src/LanguageModel.ts +1074 -0
- package/src/McpServer.ts +337 -194
- package/src/Model.ts +155 -0
- package/src/Prompt.ts +1616 -0
- package/src/Response.ts +2131 -0
- package/src/Telemetry.ts +655 -0
- package/src/Tokenizer.ts +145 -24
- package/src/Tool.ts +1267 -0
- package/src/Toolkit.ts +516 -0
- package/src/index.ts +499 -13
- package/AiChat/package.json +0 -6
- package/AiEmbeddingModel/package.json +0 -6
- package/AiInput/package.json +0 -6
- package/AiLanguageModel/package.json +0 -6
- package/AiModel/package.json +0 -6
- package/AiResponse/package.json +0 -6
- package/AiTelemetry/package.json +0 -6
- package/AiTool/package.json +0 -6
- package/AiToolkit/package.json +0 -6
- package/dist/cjs/AiChat.js +0 -122
- package/dist/cjs/AiChat.js.map +0 -1
- package/dist/cjs/AiEmbeddingModel.js +0 -109
- package/dist/cjs/AiEmbeddingModel.js.map +0 -1
- package/dist/cjs/AiInput.js +0 -458
- package/dist/cjs/AiInput.js.map +0 -1
- package/dist/cjs/AiLanguageModel.js +0 -351
- package/dist/cjs/AiLanguageModel.js.map +0 -1
- package/dist/cjs/AiModel.js +0 -37
- package/dist/cjs/AiModel.js.map +0 -1
- package/dist/cjs/AiResponse.js +0 -681
- package/dist/cjs/AiResponse.js.map +0 -1
- package/dist/cjs/AiTelemetry.js +0 -58
- package/dist/cjs/AiTelemetry.js.map +0 -1
- package/dist/cjs/AiTool.js +0 -150
- package/dist/cjs/AiTool.js.map +0 -1
- package/dist/cjs/AiToolkit.js +0 -157
- package/dist/cjs/AiToolkit.js.map +0 -1
- package/dist/cjs/internal/common.js +0 -21
- package/dist/cjs/internal/common.js.map +0 -1
- package/dist/dts/AiChat.d.ts +0 -101
- package/dist/dts/AiChat.d.ts.map +0 -1
- package/dist/dts/AiEmbeddingModel.d.ts +0 -65
- package/dist/dts/AiEmbeddingModel.d.ts.map +0 -1
- package/dist/dts/AiInput.d.ts +0 -590
- package/dist/dts/AiInput.d.ts.map +0 -1
- package/dist/dts/AiLanguageModel.d.ts +0 -302
- package/dist/dts/AiLanguageModel.d.ts.map +0 -1
- package/dist/dts/AiModel.d.ts +0 -25
- package/dist/dts/AiModel.d.ts.map +0 -1
- package/dist/dts/AiResponse.d.ts +0 -863
- package/dist/dts/AiResponse.d.ts.map +0 -1
- package/dist/dts/AiTelemetry.d.ts +0 -242
- package/dist/dts/AiTelemetry.d.ts.map +0 -1
- package/dist/dts/AiTool.d.ts +0 -334
- package/dist/dts/AiTool.d.ts.map +0 -1
- package/dist/dts/AiToolkit.d.ts +0 -96
- package/dist/dts/AiToolkit.d.ts.map +0 -1
- package/dist/dts/internal/common.d.ts +0 -2
- package/dist/dts/internal/common.d.ts.map +0 -1
- package/dist/esm/AiChat.js +0 -111
- package/dist/esm/AiChat.js.map +0 -1
- package/dist/esm/AiEmbeddingModel.js +0 -98
- package/dist/esm/AiEmbeddingModel.js.map +0 -1
- package/dist/esm/AiInput.js +0 -433
- package/dist/esm/AiInput.js.map +0 -1
- package/dist/esm/AiLanguageModel.js +0 -340
- package/dist/esm/AiLanguageModel.js.map +0 -1
- package/dist/esm/AiModel.js +0 -29
- package/dist/esm/AiModel.js.map +0 -1
- package/dist/esm/AiResponse.js +0 -657
- package/dist/esm/AiResponse.js.map +0 -1
- package/dist/esm/AiTelemetry.js +0 -48
- package/dist/esm/AiTelemetry.js.map +0 -1
- package/dist/esm/AiTool.js +0 -134
- package/dist/esm/AiTool.js.map +0 -1
- package/dist/esm/AiToolkit.js +0 -147
- package/dist/esm/AiToolkit.js.map +0 -1
- package/dist/esm/internal/common.js +0 -14
- package/dist/esm/internal/common.js.map +0 -1
- package/src/AiChat.ts +0 -251
- package/src/AiEmbeddingModel.ts +0 -169
- package/src/AiInput.ts +0 -602
- package/src/AiLanguageModel.ts +0 -685
- package/src/AiModel.ts +0 -53
- package/src/AiResponse.ts +0 -986
- package/src/AiTelemetry.ts +0 -333
- package/src/AiTool.ts +0 -579
- package/src/AiToolkit.ts +0 -265
- package/src/internal/common.ts +0 -12
package/src/Tokenizer.ts
CHANGED
|
@@ -1,70 +1,191 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* The `Tokenizer` module provides tokenization and text truncation capabilities
|
|
3
|
+
* for large language model text processing workflows.
|
|
4
|
+
*
|
|
5
|
+
* This module offers services for converting text into tokens and truncating
|
|
6
|
+
* prompts based on token limits, essential for managing context length
|
|
7
|
+
* constraints in large language models.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { Tokenizer, Prompt } from "@effect/ai"
|
|
12
|
+
* import { Effect } from "effect"
|
|
13
|
+
*
|
|
14
|
+
* const tokenizeText = Effect.gen(function* () {
|
|
15
|
+
* const tokenizer = yield* Tokenizer.Tokenizer
|
|
16
|
+
* const tokens = yield* tokenizer.tokenize("Hello, world!")
|
|
17
|
+
* console.log(`Token count: ${tokens.length}`)
|
|
18
|
+
* return tokens
|
|
19
|
+
* })
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* import { Tokenizer, Prompt } from "@effect/ai"
|
|
25
|
+
* import { Effect } from "effect"
|
|
26
|
+
*
|
|
27
|
+
* // Truncate a prompt to fit within token limits
|
|
28
|
+
* const truncatePrompt = Effect.gen(function* () {
|
|
29
|
+
* const tokenizer = yield* Tokenizer.Tokenizer
|
|
30
|
+
* const longPrompt = "This is a very long prompt..."
|
|
31
|
+
* const truncated = yield* tokenizer.truncate(longPrompt, 100)
|
|
32
|
+
* return truncated
|
|
33
|
+
* })
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
2
36
|
* @since 1.0.0
|
|
3
37
|
*/
|
|
4
38
|
import * as Context from "effect/Context"
|
|
5
39
|
import * as Effect from "effect/Effect"
|
|
6
40
|
import * as Predicate from "effect/Predicate"
|
|
7
|
-
import type
|
|
8
|
-
import * as
|
|
41
|
+
import type * as AiError from "./AiError.js"
|
|
42
|
+
import * as Prompt from "./Prompt.js"
|
|
9
43
|
|
|
10
44
|
/**
|
|
45
|
+
* The `Tokenizer` service tag for dependency injection.
|
|
46
|
+
*
|
|
47
|
+
* This tag provides access to tokenization functionality throughout your
|
|
48
|
+
* application, enabling token counting and prompt truncation capabilities.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```ts
|
|
52
|
+
* import { Tokenizer } from "@effect/ai"
|
|
53
|
+
* import { Effect } from "effect"
|
|
54
|
+
*
|
|
55
|
+
* const useTokenizer = Effect.gen(function* () {
|
|
56
|
+
* const tokenizer = yield* Tokenizer.Tokenizer
|
|
57
|
+
* const tokens = yield* tokenizer.tokenize("Hello, world!")
|
|
58
|
+
* return tokens.length
|
|
59
|
+
* })
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
11
62
|
* @since 1.0.0
|
|
12
|
-
* @category
|
|
63
|
+
* @category Context
|
|
13
64
|
*/
|
|
14
65
|
export class Tokenizer extends Context.Tag("@effect/ai/Tokenizer")<
|
|
15
66
|
Tokenizer,
|
|
16
|
-
|
|
67
|
+
Service
|
|
17
68
|
>() {}
|
|
18
69
|
|
|
19
70
|
/**
|
|
71
|
+
* Tokenizer service interface providing text tokenization and truncation
|
|
72
|
+
* operations.
|
|
73
|
+
*
|
|
74
|
+
* This interface defines the core operations for converting text to tokens and
|
|
75
|
+
* managing content length within token limits for AI model compatibility.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```ts
|
|
79
|
+
* import { Tokenizer, Prompt } from "@effect/ai"
|
|
80
|
+
* import { Effect } from "effect"
|
|
81
|
+
*
|
|
82
|
+
* const customTokenizer: Tokenizer.Service = {
|
|
83
|
+
* tokenize: (input) =>
|
|
84
|
+
* Effect.succeed(input.toString().split(' ').map((_, i) => i)),
|
|
85
|
+
* truncate: (input, maxTokens) =>
|
|
86
|
+
* Effect.succeed(Prompt.make(input.toString().slice(0, maxTokens * 5)))
|
|
87
|
+
* }
|
|
88
|
+
* ```
|
|
89
|
+
*
|
|
20
90
|
* @since 1.0.0
|
|
91
|
+
* @category Models
|
|
21
92
|
*/
|
|
22
|
-
export
|
|
93
|
+
export interface Service {
|
|
23
94
|
/**
|
|
24
|
-
*
|
|
25
|
-
* @category Models
|
|
95
|
+
* Converts text input into an array of token numbers.
|
|
26
96
|
*/
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
97
|
+
readonly tokenize: (
|
|
98
|
+
/**
|
|
99
|
+
* The text input to tokenize.
|
|
100
|
+
*/
|
|
101
|
+
input: Prompt.RawInput
|
|
102
|
+
) => Effect.Effect<Array<number>, AiError.AiError>
|
|
103
|
+
/**
|
|
104
|
+
* Truncates text input to fit within the specified token limit.
|
|
105
|
+
*/
|
|
106
|
+
readonly truncate: (
|
|
107
|
+
/**
|
|
108
|
+
* The text input to truncate.
|
|
109
|
+
*/
|
|
110
|
+
input: Prompt.RawInput,
|
|
111
|
+
/**
|
|
112
|
+
* Maximum number of tokens to retain.
|
|
113
|
+
*/
|
|
114
|
+
tokens: number
|
|
115
|
+
) => Effect.Effect<Prompt.Prompt, AiError.AiError>
|
|
31
116
|
}
|
|
32
117
|
|
|
33
118
|
/**
|
|
119
|
+
* Creates a Tokenizer service implementation from tokenization options.
|
|
120
|
+
*
|
|
121
|
+
* This function constructs a complete Tokenizer service by providing a
|
|
122
|
+
* tokenization function. The service handles both tokenization and
|
|
123
|
+
* truncation operations using the provided tokenizer.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```ts
|
|
127
|
+
* import { Tokenizer, Prompt } from "@effect/ai"
|
|
128
|
+
* import { Effect } from "effect"
|
|
129
|
+
*
|
|
130
|
+
* // Simple word-based tokenizer
|
|
131
|
+
* const wordTokenizer = Tokenizer.make({
|
|
132
|
+
* tokenize: (prompt) =>
|
|
133
|
+
* Effect.succeed(
|
|
134
|
+
* prompt.content
|
|
135
|
+
* .flatMap(msg =>
|
|
136
|
+
* typeof msg.content === "string"
|
|
137
|
+
* ? msg.content.split(' ')
|
|
138
|
+
* : msg.content.flatMap(part =>
|
|
139
|
+
* part.type === "text" ? part.text.split(' ') : []
|
|
140
|
+
* )
|
|
141
|
+
* )
|
|
142
|
+
* .map((_, index) => index)
|
|
143
|
+
* )
|
|
144
|
+
* })
|
|
145
|
+
* ```
|
|
146
|
+
*
|
|
34
147
|
* @since 1.0.0
|
|
35
148
|
* @category Constructors
|
|
36
149
|
*/
|
|
37
150
|
export const make = (options: {
|
|
38
|
-
|
|
39
|
-
|
|
151
|
+
/**
|
|
152
|
+
* Function to tokenize a prompt into an array of token numbers.
|
|
153
|
+
*/
|
|
154
|
+
readonly tokenize: (
|
|
155
|
+
/**
|
|
156
|
+
* The prompt to tokenize.
|
|
157
|
+
*/
|
|
158
|
+
content: Prompt.Prompt
|
|
159
|
+
) => Effect.Effect<Array<number>, AiError.AiError>
|
|
160
|
+
}): Service =>
|
|
40
161
|
Tokenizer.of({
|
|
41
162
|
tokenize(input) {
|
|
42
|
-
return options.tokenize(
|
|
163
|
+
return options.tokenize(Prompt.make(input))
|
|
43
164
|
},
|
|
44
165
|
truncate(input, tokens) {
|
|
45
|
-
return truncate(
|
|
166
|
+
return truncate(Prompt.make(input), options.tokenize, tokens)
|
|
46
167
|
}
|
|
47
168
|
})
|
|
48
169
|
|
|
49
170
|
const truncate = (
|
|
50
|
-
self:
|
|
51
|
-
tokenize: (input:
|
|
171
|
+
self: Prompt.Prompt,
|
|
172
|
+
tokenize: (input: Prompt.Prompt) => Effect.Effect<Array<number>, AiError.AiError>,
|
|
52
173
|
maxTokens: number
|
|
53
|
-
): Effect.Effect<
|
|
174
|
+
): Effect.Effect<Prompt.Prompt, AiError.AiError> =>
|
|
54
175
|
Effect.suspend(() => {
|
|
55
176
|
let count = 0
|
|
56
|
-
let inputMessages = self.
|
|
57
|
-
let outputMessages: Array<
|
|
58
|
-
const loop: Effect.Effect<
|
|
177
|
+
let inputMessages = self.content
|
|
178
|
+
let outputMessages: Array<Prompt.Message> = []
|
|
179
|
+
const loop: Effect.Effect<Prompt.Prompt, AiError.AiError> = Effect.suspend(() => {
|
|
59
180
|
const message = inputMessages[inputMessages.length - 1]
|
|
60
181
|
if (Predicate.isUndefined(message)) {
|
|
61
|
-
return Effect.succeed(
|
|
182
|
+
return Effect.succeed(Prompt.fromMessages(outputMessages))
|
|
62
183
|
}
|
|
63
184
|
inputMessages = inputMessages.slice(0, inputMessages.length - 1)
|
|
64
|
-
return Effect.flatMap(tokenize(
|
|
185
|
+
return Effect.flatMap(tokenize(Prompt.fromMessages([message])), (tokens) => {
|
|
65
186
|
count += tokens.length
|
|
66
187
|
if (count > maxTokens) {
|
|
67
|
-
return Effect.succeed(
|
|
188
|
+
return Effect.succeed(Prompt.fromMessages(outputMessages))
|
|
68
189
|
}
|
|
69
190
|
outputMessages = [message, ...outputMessages]
|
|
70
191
|
return loop
|