@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
@@ -0,0 +1,291 @@
1
+ /**
2
+ * The `Chat` module provides a stateful conversation interface for AI language
3
+ * models.
4
+ *
5
+ * This module enables persistent chat sessions that maintain conversation
6
+ * history, support tool calling, and offer both streaming and non-streaming
7
+ * text generation. It integrates seamlessly with the Effect AI ecosystem,
8
+ * providing type-safe conversational AI capabilities.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { Chat, LanguageModel } from "@effect/ai"
13
+ * import { Effect, Layer } from "effect"
14
+ *
15
+ * // Create a new chat session
16
+ * const program = Effect.gen(function* () {
17
+ * const chat = yield* Chat.empty
18
+ *
19
+ * // Send a message and get response
20
+ * const response = yield* chat.generateText({
21
+ * prompt: "Hello! What can you help me with?"
22
+ * })
23
+ *
24
+ * console.log(response.content)
25
+ *
26
+ * return response
27
+ * })
28
+ * ```
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * import { Chat, LanguageModel } from "@effect/ai"
33
+ * import { Effect, Stream } from "effect"
34
+ *
35
+ * // Streaming chat with tool support
36
+ * const streamingChat = Effect.gen(function* () {
37
+ * const chat = yield* Chat.empty
38
+ *
39
+ * yield* chat.streamText({
40
+ * prompt: "Generate a creative story"
41
+ * }).pipe(Stream.runForEach((part) =>
42
+ * Effect.sync(() => console.log(part))
43
+ * ))
44
+ * })
45
+ * ```
46
+ *
47
+ * @since 1.0.0
48
+ */
49
+ import * as Channel from "effect/Channel";
50
+ import * as Context from "effect/Context";
51
+ import * as Effect from "effect/Effect";
52
+ import * as Ref from "effect/Ref";
53
+ import * as Schema from "effect/Schema";
54
+ import * as Stream from "effect/Stream";
55
+ import * as LanguageModel from "./LanguageModel.js";
56
+ import * as Prompt from "./Prompt.js";
57
+ /**
58
+ * The `Chat` service tag for dependency injection.
59
+ *
60
+ * This tag provides access to chat functionality throughout your application,
61
+ * enabling persistent conversational AI interactions with full context
62
+ * management.
63
+ *
64
+ * @example
65
+ * ```ts
66
+ * import { Chat } from "@effect/ai"
67
+ * import { Effect } from "effect"
68
+ *
69
+ * const useChat = Effect.gen(function* () {
70
+ * const chat = yield* Chat
71
+ * const response = yield* chat.generateText({
72
+ * prompt: "Explain quantum computing in simple terms"
73
+ * })
74
+ * return response.content
75
+ * })
76
+ * ```
77
+ *
78
+ * @since 1.0.0
79
+ * @category Context
80
+ */
81
+ export class Chat extends /*#__PURE__*/Context.Tag("@effect/ai/Chat")() {}
82
+ /**
83
+ * Creates a new Chat service from an initial prompt.
84
+ *
85
+ * This is the primary constructor for creating chat instances. It initializes
86
+ * a new conversation with the provided prompt as the starting context.
87
+ *
88
+ * @example
89
+ * ```ts
90
+ * import { Chat, Prompt } from "@effect/ai"
91
+ * import { Effect } from "effect"
92
+ *
93
+ * const chatWithSystemPrompt = Effect.gen(function* () {
94
+ * const chat = yield* Chat.fromPrompt([{
95
+ * role: "system",
96
+ * content: "You are a helpful assistant specialized in mathematics."
97
+ * }])
98
+ *
99
+ * const response = yield* chat.generateText({
100
+ * prompt: "What is 2+2?"
101
+ * })
102
+ *
103
+ * return response.content
104
+ * })
105
+ * ```
106
+ *
107
+ * @example
108
+ * ```ts
109
+ * import { Chat, Prompt } from "@effect/ai"
110
+ * import { Effect } from "effect"
111
+ *
112
+ * // Initialize with conversation history
113
+ * const existingChat = Effect.gen(function* () {
114
+ * const chat = yield* Chat.fromPrompt([
115
+ * { role: "user", content: [{ type: "text", text: "What's the weather like?" }] },
116
+ * { role: "assistant", content: [{ type: "text", text: "I don't have access to weather data." }] },
117
+ * { role: "user", content: [{ type: "text", text: "Can you help me with coding?" }] }
118
+ * ])
119
+ *
120
+ * const response = yield* chat.generateText({
121
+ * prompt: "I need help with TypeScript"
122
+ * })
123
+ *
124
+ * return response
125
+ * })
126
+ * ```
127
+ *
128
+ * @since 1.0.0
129
+ * @category Constructors
130
+ */
131
+ export const fromPrompt = /*#__PURE__*/Effect.fnUntraced(function* (prompt) {
132
+ const languageModel = yield* LanguageModel.LanguageModel;
133
+ const context = yield* Effect.context();
134
+ const provideContext = effect => Effect.mapInputContext(effect, input => Context.merge(context, input));
135
+ const provideContextStream = stream => Stream.mapInputContext(stream, input => Context.merge(context, input));
136
+ const history = yield* Ref.make(Prompt.make(prompt));
137
+ const semaphore = yield* Effect.makeSemaphore(1);
138
+ return Chat.of({
139
+ history,
140
+ export: Ref.get(history).pipe(Effect.flatMap(Schema.encode(Prompt.Prompt)), Effect.withSpan("Chat.export"), Effect.orDie),
141
+ exportJson: Ref.get(history).pipe(Effect.flatMap(Schema.encode(Prompt.FromJson)), Effect.withSpan("Chat.exportJson"), Effect.orDie),
142
+ generateText: Effect.fnUntraced(function* (options) {
143
+ const newPrompt = Prompt.make(options.prompt);
144
+ const oldPrompt = yield* Ref.get(history);
145
+ const prompt = Prompt.merge(oldPrompt, newPrompt);
146
+ const response = yield* languageModel.generateText({
147
+ ...options,
148
+ prompt
149
+ });
150
+ const newHistory = Prompt.merge(prompt, Prompt.fromResponseParts(response.content));
151
+ yield* Ref.set(history, newHistory);
152
+ return response;
153
+ }, provideContext, semaphore.withPermits(1), Effect.withSpan("Chat.generateText", {
154
+ captureStackTrace: false
155
+ })),
156
+ streamText: Effect.fnUntraced(function* (options) {
157
+ let combined = Prompt.empty;
158
+ return Stream.fromChannel(Channel.acquireUseRelease(semaphore.take(1).pipe(Effect.zipRight(Ref.get(history)), Effect.map(history => Prompt.merge(history, Prompt.make(options.prompt)))), prompt => languageModel.streamText({
159
+ ...options,
160
+ prompt
161
+ }).pipe(Stream.mapChunksEffect(Effect.fnUntraced(function* (chunk) {
162
+ const parts = Array.from(chunk);
163
+ combined = Prompt.merge(combined, Prompt.fromResponseParts(parts));
164
+ return chunk;
165
+ })), Stream.toChannel), parts => Effect.zipRight(Ref.set(history, Prompt.merge(parts, combined)), semaphore.release(1)))).pipe(provideContextStream, Stream.withSpan("Chat.streamText", {
166
+ captureStackTrace: false
167
+ }));
168
+ }, Stream.unwrap),
169
+ generateObject: Effect.fnUntraced(function* (options) {
170
+ const newPrompt = Prompt.make(options.prompt);
171
+ const oldPrompt = yield* Ref.get(history);
172
+ const prompt = Prompt.merge(oldPrompt, newPrompt);
173
+ const response = yield* languageModel.generateObject({
174
+ ...options,
175
+ prompt
176
+ });
177
+ const newHistory = Prompt.merge(prompt, Prompt.fromResponseParts(response.content));
178
+ yield* Ref.set(history, newHistory);
179
+ return response;
180
+ }, provideContext, semaphore.withPermits(1), (effect, options) => Effect.withSpan(effect, "Chat.generateObject", {
181
+ attributes: {
182
+ objectName: "objectName" in options ? options.objectName : "_tag" in options.schema ? options.schema._tag : options.schema.identifier ?? "generateObject"
183
+ },
184
+ captureStackTrace: false
185
+ }))
186
+ });
187
+ });
188
+ /**
189
+ * Creates a new Chat service with empty conversation history.
190
+ *
191
+ * This is the most common way to start a fresh chat session without
192
+ * any initial context or system prompts.
193
+ *
194
+ * @example
195
+ * ```ts
196
+ * import { Chat } from "@effect/ai"
197
+ * import { Effect } from "effect"
198
+ *
199
+ * const freshChat = Effect.gen(function* () {
200
+ * const chat = yield* Chat.empty
201
+ *
202
+ * const response = yield* chat.generateText({
203
+ * prompt: "Hello! Can you introduce yourself?"
204
+ * })
205
+ *
206
+ * console.log(response.content)
207
+ *
208
+ * return chat
209
+ * })
210
+ * ```
211
+ *
212
+ * @since 1.0.0
213
+ * @category Constructors
214
+ */
215
+ export const empty = /*#__PURE__*/fromPrompt(Prompt.empty);
216
+ const decodeUnknown = /*#__PURE__*/Schema.decodeUnknown(Prompt.Prompt);
217
+ /**
218
+ * Creates a Chat service from previously exported chat data.
219
+ *
220
+ * Restores a chat session from structured data that was previously exported
221
+ * using the `export` method. Useful for persisting and restoring conversation
222
+ * state.
223
+ *
224
+ * @example
225
+ * ```ts
226
+ * import { Chat } from "@effect/ai"
227
+ * import { Effect } from "effect"
228
+ *
229
+ * declare const loadFromDatabase: (sessionId: string) => Effect.Effect<unknown>
230
+ *
231
+ * const restoreChat = Effect.gen(function* () {
232
+ * // Assume we have previously exported data
233
+ * const savedData = yield* loadFromDatabase("chat-session-123")
234
+ *
235
+ * const restoredChat = yield* Chat.fromExport(savedData)
236
+ *
237
+ * // Continue the conversation from where it left off
238
+ * const response = yield* restoredChat.generateText({
239
+ * prompt: "Let's continue our discussion"
240
+ * })
241
+ * }).pipe(
242
+ * Effect.catchTag("ParseError", (error) => {
243
+ * console.log("Failed to restore chat:", error.message)
244
+ * return Effect.void
245
+ * })
246
+ * )
247
+ * ```
248
+ *
249
+ * @since 1.0.0
250
+ * @category Constructors
251
+ */
252
+ export const fromExport = data => Effect.flatMap(decodeUnknown(data), fromPrompt);
253
+ const decodeJson = /*#__PURE__*/Schema.decode(Prompt.FromJson);
254
+ /**
255
+ * Creates a Chat service from previously exported JSON chat data.
256
+ *
257
+ * Restores a chat session from JSON string that was previously exported
258
+ * using the `exportJson` method. This is the most convenient way to
259
+ * persist and restore chat sessions to/from storage systems.
260
+ *
261
+ * @example
262
+ * ```ts
263
+ * import { Chat } from "@effect/ai"
264
+ * import { Effect } from "effect"
265
+ *
266
+ * const restoreFromJson = Effect.gen(function* () {
267
+ * // Load JSON from localStorage or file system
268
+ * const jsonData = localStorage.getItem("my-chat-backup")
269
+ * if (!jsonData) return yield* Chat.empty
270
+ *
271
+ * const restoredChat = yield* Chat.fromJson(jsonData)
272
+ *
273
+ * // Chat history is now restored
274
+ * const response = yield* restoredChat.generateText({
275
+ * prompt: "What were we talking about?"
276
+ * })
277
+ *
278
+ * return response
279
+ * }).pipe(
280
+ * Effect.catchTag("ParseError", (error) => {
281
+ * console.log("Invalid JSON format:", error.message)
282
+ * return Chat.empty // Fallback to empty chat
283
+ * })
284
+ * )
285
+ * ```
286
+ *
287
+ * @since 1.0.0
288
+ * @category Constructors
289
+ */
290
+ export const fromJson = data => Effect.flatMap(decodeJson(data), fromPrompt);
291
+ //# sourceMappingURL=Chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Chat.js","names":["Channel","Context","Effect","Ref","Schema","Stream","LanguageModel","Prompt","Chat","Tag","fromPrompt","fnUntraced","prompt","languageModel","context","provideContext","effect","mapInputContext","input","merge","provideContextStream","stream","history","make","semaphore","makeSemaphore","of","export","get","pipe","flatMap","encode","withSpan","orDie","exportJson","FromJson","generateText","options","newPrompt","oldPrompt","response","newHistory","fromResponseParts","content","set","withPermits","captureStackTrace","streamText","combined","empty","fromChannel","acquireUseRelease","take","zipRight","map","mapChunksEffect","chunk","parts","Array","from","toChannel","release","unwrap","generateObject","attributes","objectName","schema","_tag","identifier","decodeUnknown","fromExport","data","decodeJson","decode","fromJson"],"sources":["../../src/Chat.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC,OAAO,KAAKC,GAAG,MAAM,YAAY;AACjC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,MAAM,MAAM,eAAe;AAEvC,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AACnD,OAAO,KAAKC,MAAM,MAAM,aAAa;AAIrC;;;;;;;;;;;;;;;;;;;;;;;;AAwBA,OAAM,MAAOC,IAAK,sBAAQP,OAAO,CAACQ,GAAG,CAAC,iBAAiB,CAAC,EAGrD;AAsMH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDA,OAAO,MAAMC,UAAU,gBAAGR,MAAM,CAACS,UAAU,CAAC,WAC1CC,MAAuB;EAEvB,MAAMC,aAAa,GAAG,OAAOP,aAAa,CAACA,aAAa;EACxD,MAAMQ,OAAO,GAAG,OAAOZ,MAAM,CAACY,OAAO,EAAS;EAC9C,MAAMC,cAAc,GAAaC,MAA8B,IAC7Dd,MAAM,CAACe,eAAe,CAACD,MAAM,EAAGE,KAAK,IAAKjB,OAAO,CAACkB,KAAK,CAACL,OAAO,EAAEI,KAAK,CAAC,CAAC;EAC1E,MAAME,oBAAoB,GAAaC,MAA8B,IACnEhB,MAAM,CAACY,eAAe,CAACI,MAAM,EAAGH,KAAK,IAAKjB,OAAO,CAACkB,KAAK,CAACL,OAAO,EAAEI,KAAK,CAAC,CAAC;EAC1E,MAAMI,OAAO,GAAG,OAAOnB,GAAG,CAACoB,IAAI,CAAgBhB,MAAM,CAACgB,IAAI,CAACX,MAAM,CAAC,CAAC;EACnE,MAAMY,SAAS,GAAG,OAAOtB,MAAM,CAACuB,aAAa,CAAC,CAAC,CAAC;EAEhD,OAAOjB,IAAI,CAACkB,EAAE,CAAC;IACbJ,OAAO;IACPK,MAAM,EAAExB,GAAG,CAACyB,GAAG,CAACN,OAAO,CAAC,CAACO,IAAI,CAC3B3B,MAAM,CAAC4B,OAAO,CAAC1B,MAAM,CAAC2B,MAAM,CAACxB,MAAM,CAACA,MAAM,CAAC,CAAC,EAC5CL,MAAM,CAAC8B,QAAQ,CAAC,aAAa,CAAC,EAC9B9B,MAAM,CAAC+B,KAAK,CACb;IACDC,UAAU,EAAE/B,GAAG,CAACyB,GAAG,CAACN,OAAO,CAAC,CAACO,IAAI,CAC/B3B,MAAM,CAAC4B,OAAO,CAAC1B,MAAM,CAAC2B,MAAM,CAACxB,MAAM,CAAC4B,QAAQ,CAAC,CAAC,EAC9CjC,MAAM,CAAC8B,QAAQ,CAAC,iBAAiB,CAAC,EAClC9B,MAAM,CAAC+B,KAAK,CACb;IACDG,YAAY,EAAElC,MAAM,CAACS,UAAU,CAC7B,WAAU0B,OAAO;MACf,MAAMC,SAAS,GAAG/B,MAAM,CAACgB,IAAI,CAACc,OAAO,CAACzB,MAAM,CAAC;MAC7C,MAAM2B,SAAS,GAAG,OAAOpC,GAAG,CAACyB,GAAG,CAACN,OAAO,CAAC;MACzC,MAAMV,MAAM,GAAGL,MAAM,CAACY,KAAK,CAACoB,SAAS,EAAED,SAAS,CAAC;MAEjD,MAAME,QAAQ,GAAG,OAAO3B,aAAa,CAACuB,YAAY,CAAC;QAAE,GAAGC,OAAO;QAAEzB;MAAM,CAAE,CAAC;MAE1E,MAAM6B,UAAU,GAAGlC,MAAM,CAACY,KAAK,CAACP,MAAM,EAAEL,MAAM,CAACmC,iBAAiB,CAACF,QAAQ,CAACG,OAAO,CAAC,CAAC;MACnF,OAAOxC,GAAG,CAACyC,GAAG,CAACtB,OAAO,EAAEmB,UAAU,CAAC;MAEnC,OAAOD,QAAQ;IACjB,CAAC,EACDzB,cAAc,EACdS,SAAS,CAACqB,WAAW,CAAC,CAAC,CAAC,EACxB3C,MAAM,CAAC8B,QAAQ,CAAC,mBAAmB,EAAE;MAAEc,iBAAiB,EAAE;IAAK,CAAE,CAAC,CACnE;IACDC,UAAU,EAAE7C,MAAM,CAACS,UAAU,CAC3B,WAAU0B,OAAO;MACf,IAAIW,QAAQ,GAAkBzC,MAAM,CAAC0C,KAAK;MAC1C,OAAO5C,MAAM,CAAC6C,WAAW,CAAClD,OAAO,CAACmD,iBAAiB,CACjD3B,SAAS,CAAC4B,IAAI,CAAC,CAAC,CAAC,CAACvB,IAAI,CACpB3B,MAAM,CAACmD,QAAQ,CAAClD,GAAG,CAACyB,GAAG,CAACN,OAAO,CAAC,CAAC,EACjCpB,MAAM,CAACoD,GAAG,CAAEhC,OAAO,IAAKf,MAAM,CAACY,KAAK,CAACG,OAAO,EAAEf,MAAM,CAACgB,IAAI,CAACc,OAAO,CAACzB,MAAM,CAAC,CAAC,CAAC,CAC5E,EACAA,MAAM,IACLC,aAAa,CAACkC,UAAU,CAAC;QAAE,GAAGV,OAAO;QAAEzB;MAAM,CAAE,CAAC,CAACiB,IAAI,CACnDxB,MAAM,CAACkD,eAAe,CAACrD,MAAM,CAACS,UAAU,CAAC,WAAU6C,KAAK;QACtD,MAAMC,KAAK,GAAGC,KAAK,CAACC,IAAI,CAACH,KAAK,CAAC;QAC/BR,QAAQ,GAAGzC,MAAM,CAACY,KAAK,CAAC6B,QAAQ,EAAEzC,MAAM,CAACmC,iBAAiB,CAACe,KAAK,CAAC,CAAC;QAClE,OAAOD,KAAK;MACd,CAAC,CAAC,CAAC,EACHnD,MAAM,CAACuD,SAAS,CACjB,EACFH,KAAK,IACJvD,MAAM,CAACmD,QAAQ,CACblD,GAAG,CAACyC,GAAG,CAACtB,OAAO,EAAEf,MAAM,CAACY,KAAK,CAACsC,KAAK,EAAET,QAAQ,CAAC,CAAC,EAC/CxB,SAAS,CAACqC,OAAO,CAAC,CAAC,CAAC,CACrB,CACJ,CAAC,CAAChC,IAAI,CACLT,oBAAoB,EACpBf,MAAM,CAAC2B,QAAQ,CAAC,iBAAiB,EAAE;QACjCc,iBAAiB,EAAE;OACpB,CAAC,CACH;IACH,CAAC,EACDzC,MAAM,CAACyD,MAAM,CACd;IACDC,cAAc,EAAE7D,MAAM,CAACS,UAAU,CAC/B,WAAU0B,OAAO;MACf,MAAMC,SAAS,GAAG/B,MAAM,CAACgB,IAAI,CAACc,OAAO,CAACzB,MAAM,CAAC;MAC7C,MAAM2B,SAAS,GAAG,OAAOpC,GAAG,CAACyB,GAAG,CAACN,OAAO,CAAC;MACzC,MAAMV,MAAM,GAAGL,MAAM,CAACY,KAAK,CAACoB,SAAS,EAAED,SAAS,CAAC;MAEjD,MAAME,QAAQ,GAAG,OAAO3B,aAAa,CAACkD,cAAc,CAAC;QAAE,GAAG1B,OAAO;QAAEzB;MAAM,CAAE,CAAC;MAE5E,MAAM6B,UAAU,GAAGlC,MAAM,CAACY,KAAK,CAACP,MAAM,EAAEL,MAAM,CAACmC,iBAAiB,CAACF,QAAQ,CAACG,OAAO,CAAC,CAAC;MACnF,OAAOxC,GAAG,CAACyC,GAAG,CAACtB,OAAO,EAAEmB,UAAU,CAAC;MAEnC,OAAOD,QAAQ;IACjB,CAAC,EACDzB,cAAc,EACdS,SAAS,CAACqB,WAAW,CAAC,CAAC,CAAC,EACxB,CAAC7B,MAAM,EAAEqB,OAAO,KACdnC,MAAM,CAAC8B,QAAQ,CAAChB,MAAM,EAAE,qBAAqB,EAAE;MAC7CgD,UAAU,EAAE;QACVC,UAAU,EAAE,YAAY,IAAI5B,OAAO,GAC/BA,OAAO,CAAC4B,UAAU,GAClB,MAAM,IAAI5B,OAAO,CAAC6B,MAAM,GACxB7B,OAAO,CAAC6B,MAAM,CAACC,IAAI,GAClB9B,OAAO,CAAC6B,MAAc,CAACE,UAAU,IAAI;OAC3C;MACDtB,iBAAiB,EAAE;KACpB,CAAC;GAEP,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,OAAO,MAAMG,KAAK,gBAA+DvC,UAAU,CAACH,MAAM,CAAC0C,KAAK,CAAC;AAEzG,MAAMoB,aAAa,gBAAGjE,MAAM,CAACiE,aAAa,CAAC9D,MAAM,CAACA,MAAM,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,OAAO,MAAM+D,UAAU,GAAIC,IAAa,IACtCrE,MAAM,CAAC4B,OAAO,CAACuC,aAAa,CAACE,IAAI,CAAC,EAAE7D,UAAU,CAAC;AAEjD,MAAM8D,UAAU,gBAAGpE,MAAM,CAACqE,MAAM,CAAClE,MAAM,CAAC4B,QAAQ,CAAC;AAEjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,OAAO,MAAMuC,QAAQ,GAAIH,IAAY,IACnCrE,MAAM,CAAC4B,OAAO,CAAC0C,UAAU,CAACD,IAAI,CAAC,EAAE7D,UAAU,CAAC","ignoreList":[]}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * The `EmbeddingModel` module provides vector embeddings for text using AI
3
+ * models.
4
+ *
5
+ * This module enables efficient conversion of text into high-dimensional vector
6
+ * representations that capture semantic meaning. It supports batching, caching,
7
+ * and request optimization for production use cases like semantic search,
8
+ * document similarity, and clustering.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { EmbeddingModel } from "@effect/ai"
13
+ * import { Effect } from "effect"
14
+ *
15
+ * // Basic embedding usage
16
+ * const program = Effect.gen(function* () {
17
+ * const embedding = yield* EmbeddingModel.EmbeddingModel
18
+ *
19
+ * const vector = yield* embedding.embed("Hello world!")
20
+ * console.log(vector) // [0.123, -0.456, 0.789, ...]
21
+ *
22
+ * return vector
23
+ * })
24
+ * ```
25
+ *
26
+ * @example
27
+ * ```ts
28
+ * import { EmbeddingModel } from "@effect/ai"
29
+ * import { Effect, Duration } from "effect"
30
+ *
31
+ * declare const generateVectorFor: (text: string) => Array<number>
32
+ *
33
+ * // Create embedding service with batching and caching
34
+ * const embeddingService = EmbeddingModel.make({
35
+ * embedMany: (texts) => Effect.succeed(
36
+ * texts.map((text, index) => ({
37
+ * index,
38
+ * embeddings: generateVectorFor(text)
39
+ * }))
40
+ * ),
41
+ * maxBatchSize: 50,
42
+ * cache: {
43
+ * capacity: 1000,
44
+ * timeToLive: Duration.minutes(30)
45
+ * }
46
+ * })
47
+ * ```
48
+ *
49
+ * @since 1.0.0
50
+ */
51
+ import { dataLoader } from "@effect/experimental/RequestResolver";
52
+ import * as Context from "effect/Context";
53
+ import * as Effect from "effect/Effect";
54
+ import { identity } from "effect/Function";
55
+ import * as Option from "effect/Option";
56
+ import * as Request from "effect/Request";
57
+ import * as RequestResolver from "effect/RequestResolver";
58
+ import * as Schema from "effect/Schema";
59
+ import * as AiError from "./AiError.js";
60
+ /**
61
+ * The `EmbeddingModel` service tag for dependency injection.
62
+ *
63
+ * This tag provides access to vector embedding functionality throughout your application,
64
+ * enabling conversion of text to high-dimensional vectors for semantic analysis.
65
+ *
66
+ * @example
67
+ * ```ts
68
+ * import { EmbeddingModel } from "@effect/ai"
69
+ * import { Effect } from "effect"
70
+ *
71
+ * const useEmbeddings = Effect.gen(function* () {
72
+ * const embedder = yield* EmbeddingModel
73
+ *
74
+ * const documentVector = yield* embedder.embed("This is a sample document")
75
+ * const queryVector = yield* embedder.embed("sample query")
76
+ *
77
+ * const similarity = cosineSimilarity(documentVector, queryVector)
78
+ * return similarity
79
+ * })
80
+ * ```
81
+ *
82
+ * @since 1.0.0
83
+ * @category Context
84
+ */
85
+ export class EmbeddingModel extends /*#__PURE__*/Context.Tag("@effect/ai/EmbeddingModel")() {}
86
+ class EmbeddingRequest extends /*#__PURE__*/Schema.TaggedRequest("@effect/ai/EmbeddingModel/Request")("EmbeddingRequest", {
87
+ failure: AiError.AiError,
88
+ success: /*#__PURE__*/Schema.mutable(/*#__PURE__*/Schema.Array(Schema.Number)),
89
+ payload: {
90
+ input: Schema.String
91
+ }
92
+ }) {}
93
+ const makeBatchedResolver = embedMany => RequestResolver.makeBatched(requests => embedMany(requests.map(request => request.input)).pipe(Effect.flatMap(Effect.forEach(({
94
+ embeddings,
95
+ index
96
+ }) => Request.succeed(requests[index], embeddings), {
97
+ discard: true
98
+ })), Effect.catchAll(error => Effect.forEach(requests, request => Request.fail(request, error), {
99
+ discard: true
100
+ }))));
101
+ /**
102
+ * Creates an EmbeddingModel service with batching and caching capabilities.
103
+ *
104
+ * This is the primary constructor for creating embedding services. It supports
105
+ * automatic batching of requests for efficiency and optional caching to reduce
106
+ * redundant API calls.
107
+ *
108
+ * @since 1.0.0
109
+ * @category Constructors
110
+ */
111
+ export const make = options => Effect.gen(function* () {
112
+ const cache = yield* Option.fromNullable(options.cache).pipe(Effect.flatMap(config => Request.makeCache(config)), Effect.optionFromOptional);
113
+ const resolver = makeBatchedResolver(options.embedMany).pipe(options.maxBatchSize ? RequestResolver.batchN(options.maxBatchSize) : identity);
114
+ const embed = input => {
115
+ const request = Effect.request(new EmbeddingRequest({
116
+ input
117
+ }), resolver);
118
+ return Option.match(cache, {
119
+ onNone: () => request,
120
+ onSome: cache => request.pipe(Effect.withRequestCaching(true), Effect.withRequestCache(cache))
121
+ });
122
+ };
123
+ const embedMany = (inputs, options) => Effect.forEach(inputs, embed, {
124
+ batching: true,
125
+ concurrency: options?.concurrency
126
+ });
127
+ return EmbeddingModel.of({
128
+ embed: input => embed(input).pipe(Effect.withSpan("EmbeddingModel.embed", {
129
+ captureStackTrace: false
130
+ })),
131
+ embedMany: inputs => embedMany(inputs).pipe(Effect.withSpan("EmbeddingModel.embedMany", {
132
+ captureStackTrace: false
133
+ }))
134
+ });
135
+ });
136
+ /**
137
+ * Creates an EmbeddingModel service with time-window based batching.
138
+ *
139
+ * This constructor creates a service that uses a data loader pattern to batch
140
+ * embedding requests within a specified time window. This is optimal for
141
+ * high-throughput scenarios where you want to automatically batch requests that
142
+ * arrive within a short time period.
143
+ *
144
+ * @since 1.0.0
145
+ * @category Constructors
146
+ */
147
+ export const makeDataLoader = options => Effect.gen(function* () {
148
+ const resolver = makeBatchedResolver(options.embedMany);
149
+ const resolverDelayed = yield* dataLoader(resolver, {
150
+ window: options.window,
151
+ maxBatchSize: options.maxBatchSize
152
+ });
153
+ function embed(input) {
154
+ return Effect.request(new EmbeddingRequest({
155
+ input
156
+ }), resolverDelayed).pipe(Effect.withSpan("EmbeddingModel.embed", {
157
+ captureStackTrace: false
158
+ }));
159
+ }
160
+ function embedMany(inputs, options) {
161
+ return Effect.forEach(inputs, embed, {
162
+ batching: true,
163
+ concurrency: options?.concurrency
164
+ }).pipe(Effect.withSpan("EmbeddingModel.embedMany", {
165
+ captureStackTrace: false
166
+ }));
167
+ }
168
+ return EmbeddingModel.of({
169
+ embed,
170
+ embedMany
171
+ });
172
+ });
173
+ //# sourceMappingURL=EmbeddingModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbeddingModel.js","names":["dataLoader","Context","Effect","identity","Option","Request","RequestResolver","Schema","AiError","EmbeddingModel","Tag","EmbeddingRequest","TaggedRequest","failure","success","mutable","Array","Number","payload","input","String","makeBatchedResolver","embedMany","makeBatched","requests","map","request","pipe","flatMap","forEach","embeddings","index","succeed","discard","catchAll","error","fail","make","options","gen","cache","fromNullable","config","makeCache","optionFromOptional","resolver","maxBatchSize","batchN","embed","match","onNone","onSome","withRequestCaching","withRequestCache","inputs","batching","concurrency","of","withSpan","captureStackTrace","makeDataLoader","resolverDelayed","window"],"sources":["../../src/EmbeddingModel.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}