@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.
Files changed (188) hide show
  1. package/Chat/package.json +6 -0
  2. package/EmbeddingModel/package.json +6 -0
  3. package/IdGenerator/package.json +6 -0
  4. package/LanguageModel/package.json +6 -0
  5. package/Model/package.json +6 -0
  6. package/Prompt/package.json +6 -0
  7. package/Response/package.json +6 -0
  8. package/Telemetry/package.json +6 -0
  9. package/Tool/package.json +6 -0
  10. package/Toolkit/package.json +6 -0
  11. package/dist/cjs/AiError.js +575 -11
  12. package/dist/cjs/AiError.js.map +1 -1
  13. package/dist/cjs/Chat.js +302 -0
  14. package/dist/cjs/Chat.js.map +1 -0
  15. package/dist/cjs/EmbeddingModel.js +184 -0
  16. package/dist/cjs/EmbeddingModel.js.map +1 -0
  17. package/dist/cjs/IdGenerator.js +255 -0
  18. package/dist/cjs/IdGenerator.js.map +1 -0
  19. package/dist/cjs/LanguageModel.js +584 -0
  20. package/dist/cjs/LanguageModel.js.map +1 -0
  21. package/dist/cjs/McpServer.js +12 -4
  22. package/dist/cjs/McpServer.js.map +1 -1
  23. package/dist/cjs/Model.js +118 -0
  24. package/dist/cjs/Model.js.map +1 -0
  25. package/dist/cjs/Prompt.js +649 -0
  26. package/dist/cjs/Prompt.js.map +1 -0
  27. package/dist/cjs/Response.js +635 -0
  28. package/dist/cjs/Response.js.map +1 -0
  29. package/dist/cjs/Telemetry.js +176 -0
  30. package/dist/cjs/Telemetry.js.map +1 -0
  31. package/dist/cjs/Tokenizer.js +87 -8
  32. package/dist/cjs/Tokenizer.js.map +1 -1
  33. package/dist/cjs/Tool.js +556 -0
  34. package/dist/cjs/Tool.js.map +1 -0
  35. package/dist/cjs/Toolkit.js +279 -0
  36. package/dist/cjs/Toolkit.js.map +1 -0
  37. package/dist/cjs/index.js +21 -19
  38. package/dist/dts/AiError.d.ts +577 -9
  39. package/dist/dts/AiError.d.ts.map +1 -1
  40. package/dist/dts/Chat.d.ts +356 -0
  41. package/dist/dts/Chat.d.ts.map +1 -0
  42. package/dist/dts/EmbeddingModel.d.ts +153 -0
  43. package/dist/dts/EmbeddingModel.d.ts.map +1 -0
  44. package/dist/dts/IdGenerator.d.ts +272 -0
  45. package/dist/dts/IdGenerator.d.ts.map +1 -0
  46. package/dist/dts/LanguageModel.d.ts +458 -0
  47. package/dist/dts/LanguageModel.d.ts.map +1 -0
  48. package/dist/dts/McpSchema.d.ts +25 -25
  49. package/dist/dts/McpServer.d.ts +6 -4
  50. package/dist/dts/McpServer.d.ts.map +1 -1
  51. package/dist/dts/Model.d.ts +124 -0
  52. package/dist/dts/Model.d.ts.map +1 -0
  53. package/dist/dts/Prompt.d.ts +1119 -0
  54. package/dist/dts/Prompt.d.ts.map +1 -0
  55. package/dist/dts/Response.d.ts +1519 -0
  56. package/dist/dts/Response.d.ts.map +1 -0
  57. package/dist/dts/Telemetry.d.ts +520 -0
  58. package/dist/dts/Telemetry.d.ts.map +1 -0
  59. package/dist/dts/Tokenizer.d.ts +131 -13
  60. package/dist/dts/Tokenizer.d.ts.map +1 -1
  61. package/dist/dts/Tool.d.ts +876 -0
  62. package/dist/dts/Tool.d.ts.map +1 -0
  63. package/dist/dts/Toolkit.d.ts +310 -0
  64. package/dist/dts/Toolkit.d.ts.map +1 -0
  65. package/dist/dts/index.d.ts +498 -13
  66. package/dist/dts/index.d.ts.map +1 -1
  67. package/dist/esm/AiError.js +570 -10
  68. package/dist/esm/AiError.js.map +1 -1
  69. package/dist/esm/Chat.js +291 -0
  70. package/dist/esm/Chat.js.map +1 -0
  71. package/dist/esm/EmbeddingModel.js +173 -0
  72. package/dist/esm/EmbeddingModel.js.map +1 -0
  73. package/dist/esm/IdGenerator.js +245 -0
  74. package/dist/esm/IdGenerator.js.map +1 -0
  75. package/dist/esm/LanguageModel.js +572 -0
  76. package/dist/esm/LanguageModel.js.map +1 -0
  77. package/dist/esm/McpServer.js +12 -4
  78. package/dist/esm/McpServer.js.map +1 -1
  79. package/dist/esm/Model.js +108 -0
  80. package/dist/esm/Model.js.map +1 -0
  81. package/dist/esm/Prompt.js +633 -0
  82. package/dist/esm/Prompt.js.map +1 -0
  83. package/dist/esm/Response.js +619 -0
  84. package/dist/esm/Response.js.map +1 -0
  85. package/dist/esm/Telemetry.js +166 -0
  86. package/dist/esm/Telemetry.js.map +1 -0
  87. package/dist/esm/Tokenizer.js +87 -8
  88. package/dist/esm/Tokenizer.js.map +1 -1
  89. package/dist/esm/Tool.js +534 -0
  90. package/dist/esm/Tool.js.map +1 -0
  91. package/dist/esm/Toolkit.js +269 -0
  92. package/dist/esm/Toolkit.js.map +1 -0
  93. package/dist/esm/index.js +498 -13
  94. package/dist/esm/index.js.map +1 -1
  95. package/package.json +76 -68
  96. package/src/AiError.ts +739 -9
  97. package/src/Chat.ts +546 -0
  98. package/src/EmbeddingModel.ts +311 -0
  99. package/src/IdGenerator.ts +320 -0
  100. package/src/LanguageModel.ts +1074 -0
  101. package/src/McpServer.ts +337 -194
  102. package/src/Model.ts +155 -0
  103. package/src/Prompt.ts +1616 -0
  104. package/src/Response.ts +2131 -0
  105. package/src/Telemetry.ts +655 -0
  106. package/src/Tokenizer.ts +145 -24
  107. package/src/Tool.ts +1267 -0
  108. package/src/Toolkit.ts +516 -0
  109. package/src/index.ts +499 -13
  110. package/AiChat/package.json +0 -6
  111. package/AiEmbeddingModel/package.json +0 -6
  112. package/AiInput/package.json +0 -6
  113. package/AiLanguageModel/package.json +0 -6
  114. package/AiModel/package.json +0 -6
  115. package/AiResponse/package.json +0 -6
  116. package/AiTelemetry/package.json +0 -6
  117. package/AiTool/package.json +0 -6
  118. package/AiToolkit/package.json +0 -6
  119. package/dist/cjs/AiChat.js +0 -122
  120. package/dist/cjs/AiChat.js.map +0 -1
  121. package/dist/cjs/AiEmbeddingModel.js +0 -109
  122. package/dist/cjs/AiEmbeddingModel.js.map +0 -1
  123. package/dist/cjs/AiInput.js +0 -458
  124. package/dist/cjs/AiInput.js.map +0 -1
  125. package/dist/cjs/AiLanguageModel.js +0 -351
  126. package/dist/cjs/AiLanguageModel.js.map +0 -1
  127. package/dist/cjs/AiModel.js +0 -37
  128. package/dist/cjs/AiModel.js.map +0 -1
  129. package/dist/cjs/AiResponse.js +0 -681
  130. package/dist/cjs/AiResponse.js.map +0 -1
  131. package/dist/cjs/AiTelemetry.js +0 -58
  132. package/dist/cjs/AiTelemetry.js.map +0 -1
  133. package/dist/cjs/AiTool.js +0 -150
  134. package/dist/cjs/AiTool.js.map +0 -1
  135. package/dist/cjs/AiToolkit.js +0 -157
  136. package/dist/cjs/AiToolkit.js.map +0 -1
  137. package/dist/cjs/internal/common.js +0 -21
  138. package/dist/cjs/internal/common.js.map +0 -1
  139. package/dist/dts/AiChat.d.ts +0 -101
  140. package/dist/dts/AiChat.d.ts.map +0 -1
  141. package/dist/dts/AiEmbeddingModel.d.ts +0 -65
  142. package/dist/dts/AiEmbeddingModel.d.ts.map +0 -1
  143. package/dist/dts/AiInput.d.ts +0 -590
  144. package/dist/dts/AiInput.d.ts.map +0 -1
  145. package/dist/dts/AiLanguageModel.d.ts +0 -302
  146. package/dist/dts/AiLanguageModel.d.ts.map +0 -1
  147. package/dist/dts/AiModel.d.ts +0 -25
  148. package/dist/dts/AiModel.d.ts.map +0 -1
  149. package/dist/dts/AiResponse.d.ts +0 -863
  150. package/dist/dts/AiResponse.d.ts.map +0 -1
  151. package/dist/dts/AiTelemetry.d.ts +0 -242
  152. package/dist/dts/AiTelemetry.d.ts.map +0 -1
  153. package/dist/dts/AiTool.d.ts +0 -334
  154. package/dist/dts/AiTool.d.ts.map +0 -1
  155. package/dist/dts/AiToolkit.d.ts +0 -96
  156. package/dist/dts/AiToolkit.d.ts.map +0 -1
  157. package/dist/dts/internal/common.d.ts +0 -2
  158. package/dist/dts/internal/common.d.ts.map +0 -1
  159. package/dist/esm/AiChat.js +0 -111
  160. package/dist/esm/AiChat.js.map +0 -1
  161. package/dist/esm/AiEmbeddingModel.js +0 -98
  162. package/dist/esm/AiEmbeddingModel.js.map +0 -1
  163. package/dist/esm/AiInput.js +0 -433
  164. package/dist/esm/AiInput.js.map +0 -1
  165. package/dist/esm/AiLanguageModel.js +0 -340
  166. package/dist/esm/AiLanguageModel.js.map +0 -1
  167. package/dist/esm/AiModel.js +0 -29
  168. package/dist/esm/AiModel.js.map +0 -1
  169. package/dist/esm/AiResponse.js +0 -657
  170. package/dist/esm/AiResponse.js.map +0 -1
  171. package/dist/esm/AiTelemetry.js +0 -48
  172. package/dist/esm/AiTelemetry.js.map +0 -1
  173. package/dist/esm/AiTool.js +0 -134
  174. package/dist/esm/AiTool.js.map +0 -1
  175. package/dist/esm/AiToolkit.js +0 -147
  176. package/dist/esm/AiToolkit.js.map +0 -1
  177. package/dist/esm/internal/common.js +0 -14
  178. package/dist/esm/internal/common.js.map +0 -1
  179. package/src/AiChat.ts +0 -251
  180. package/src/AiEmbeddingModel.ts +0 -169
  181. package/src/AiInput.ts +0 -602
  182. package/src/AiLanguageModel.ts +0 -685
  183. package/src/AiModel.ts +0 -53
  184. package/src/AiResponse.ts +0 -986
  185. package/src/AiTelemetry.ts +0 -333
  186. package/src/AiTool.ts +0 -579
  187. package/src/AiToolkit.ts +0 -265
  188. 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 { AiError } from "./AiError.js"
8
- import * as AiInput from "./AiInput.js"
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 Tags
63
+ * @category Context
13
64
  */
14
65
  export class Tokenizer extends Context.Tag("@effect/ai/Tokenizer")<
15
66
  Tokenizer,
16
- Tokenizer.Service
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 declare namespace Tokenizer {
93
+ export interface Service {
23
94
  /**
24
- * @since 1.0.0
25
- * @category Models
95
+ * Converts text input into an array of token numbers.
26
96
  */
27
- export interface Service {
28
- readonly tokenize: (input: AiInput.Raw) => Effect.Effect<Array<number>, AiError>
29
- readonly truncate: (input: AiInput.Raw, tokens: number) => Effect.Effect<AiInput.AiInput, AiError>
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
- readonly tokenize: (content: AiInput.AiInput) => Effect.Effect<Array<number>, AiError>
39
- }): Tokenizer.Service =>
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(AiInput.make(input))
163
+ return options.tokenize(Prompt.make(input))
43
164
  },
44
165
  truncate(input, tokens) {
45
- return truncate(AiInput.make(input), options.tokenize, tokens)
166
+ return truncate(Prompt.make(input), options.tokenize, tokens)
46
167
  }
47
168
  })
48
169
 
49
170
  const truncate = (
50
- self: AiInput.AiInput,
51
- tokenize: (input: AiInput.AiInput) => Effect.Effect<Array<number>, AiError>,
171
+ self: Prompt.Prompt,
172
+ tokenize: (input: Prompt.Prompt) => Effect.Effect<Array<number>, AiError.AiError>,
52
173
  maxTokens: number
53
- ): Effect.Effect<AiInput.AiInput, AiError> =>
174
+ ): Effect.Effect<Prompt.Prompt, AiError.AiError> =>
54
175
  Effect.suspend(() => {
55
176
  let count = 0
56
- let inputMessages = self.messages
57
- let outputMessages: Array<AiInput.Message> = []
58
- const loop: Effect.Effect<AiInput.AiInput, AiError> = Effect.suspend(() => {
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(AiInput.make(outputMessages))
182
+ return Effect.succeed(Prompt.fromMessages(outputMessages))
62
183
  }
63
184
  inputMessages = inputMessages.slice(0, inputMessages.length - 1)
64
- return Effect.flatMap(tokenize(AiInput.make(message)), (tokens) => {
185
+ return Effect.flatMap(tokenize(Prompt.fromMessages([message])), (tokens) => {
65
186
  count += tokens.length
66
187
  if (count > maxTokens) {
67
- return Effect.succeed(AiInput.make(outputMessages))
188
+ return Effect.succeed(Prompt.fromMessages(outputMessages))
68
189
  }
69
190
  outputMessages = [message, ...outputMessages]
70
191
  return loop