@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,584 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.streamText = exports.make = exports.generateText = exports.generateObject = exports.LanguageModel = exports.GenerateTextResponse = exports.GenerateObjectResponse = void 0;
7
+ var Chunk = _interopRequireWildcard(require("effect/Chunk"));
8
+ var Context = _interopRequireWildcard(require("effect/Context"));
9
+ var Effect = _interopRequireWildcard(require("effect/Effect"));
10
+ var Option = _interopRequireWildcard(require("effect/Option"));
11
+ var ParseResult = _interopRequireWildcard(require("effect/ParseResult"));
12
+ var Predicate = _interopRequireWildcard(require("effect/Predicate"));
13
+ var Schema = _interopRequireWildcard(require("effect/Schema"));
14
+ var Stream = _interopRequireWildcard(require("effect/Stream"));
15
+ var AiError = _interopRequireWildcard(require("./AiError.js"));
16
+ var _IdGenerator = require("./IdGenerator.js");
17
+ var Prompt = _interopRequireWildcard(require("./Prompt.js"));
18
+ var Response = _interopRequireWildcard(require("./Response.js"));
19
+ var _Telemetry = require("./Telemetry.js");
20
+ var Toolkit = _interopRequireWildcard(require("./Toolkit.js"));
21
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
22
+ /**
23
+ * The `LanguageModel` module provides AI text generation capabilities with tool
24
+ * calling support.
25
+ *
26
+ * This module offers a comprehensive interface for interacting with large
27
+ * language models, supporting both streaming and non-streaming text generation,
28
+ * structured output generation, and tool calling functionality. It provides a
29
+ * unified API that can be implemented by different AI providers while
30
+ * maintaining type safety and effect management.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * import { LanguageModel } from "@effect/ai"
35
+ * import { Effect } from "effect"
36
+ *
37
+ * // Basic text generation
38
+ * const program = Effect.gen(function* () {
39
+ * const response = yield* LanguageModel.generateText({
40
+ * prompt: "Explain quantum computing"
41
+ * })
42
+ *
43
+ * console.log(response.text)
44
+ *
45
+ * return response
46
+ * })
47
+ * ```
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * import { LanguageModel } from "@effect/ai"
52
+ * import { Effect, Schema } from "effect"
53
+ *
54
+ * // Structured output generation
55
+ * const ContactSchema = Schema.Struct({
56
+ * name: Schema.String,
57
+ * email: Schema.String
58
+ * })
59
+ *
60
+ * const extractContact = Effect.gen(function* () {
61
+ * const response = yield* LanguageModel.generateObject({
62
+ * prompt: "Extract contact: John Doe, john@example.com",
63
+ * schema: ContactSchema
64
+ * })
65
+ *
66
+ * return response.value
67
+ * })
68
+ * ```
69
+ *
70
+ * @since 1.0.0
71
+ */
72
+
73
+ // =============================================================================
74
+ // Service Definition
75
+ // =============================================================================
76
+ /**
77
+ * The `LanguageModel` service tag for dependency injection.
78
+ *
79
+ * This tag provides access to language model functionality throughout your
80
+ * application, enabling text generation, streaming, and structured output
81
+ * capabilities.
82
+ *
83
+ * @example
84
+ * ```ts
85
+ * import { LanguageModel } from "@effect/ai"
86
+ * import { Effect } from "effect"
87
+ *
88
+ * const useLanguageModel = Effect.gen(function* () {
89
+ * const model = yield* LanguageModel
90
+ * const response = yield* model.generateText({
91
+ * prompt: "What is machine learning?"
92
+ * })
93
+ * return response.text
94
+ * })
95
+ * ```
96
+ *
97
+ * @since 1.0.0
98
+ * @category Context
99
+ */
100
+ class LanguageModel extends /*#__PURE__*/Context.Tag("@effect/ai/LanguageModel")() {}
101
+ /**
102
+ * Response class for text generation operations.
103
+ *
104
+ * Contains the generated content and provides convenient accessors for
105
+ * extracting different types of response parts like text, tool calls, and usage
106
+ * information.
107
+ *
108
+ * @example
109
+ * ```ts
110
+ * import { LanguageModel } from "@effect/ai"
111
+ * import { Effect } from "effect"
112
+ *
113
+ * const program = Effect.gen(function* () {
114
+ * const response = yield* LanguageModel.generateText({
115
+ * prompt: "Explain photosynthesis"
116
+ * })
117
+ *
118
+ * console.log(response.text) // Generated text content
119
+ * console.log(response.finishReason) // "stop", "length", etc.
120
+ * console.log(response.usage) // Usage information
121
+ *
122
+ * return response
123
+ * })
124
+ * ```
125
+ *
126
+ * @since 1.0.0
127
+ * @category Models
128
+ */
129
+ exports.LanguageModel = LanguageModel;
130
+ class GenerateTextResponse {
131
+ content;
132
+ constructor(content) {
133
+ this.content = content;
134
+ }
135
+ /**
136
+ * Extracts and concatenates all text parts from the response.
137
+ */
138
+ get text() {
139
+ const text = [];
140
+ for (const part of this.content) {
141
+ if (part.type === "text") {
142
+ text.push(part.text);
143
+ }
144
+ }
145
+ return text.join("");
146
+ }
147
+ /**
148
+ * Returns all reasoning parts from the response.
149
+ */
150
+ get reasoning() {
151
+ return this.content.filter(part => part.type === "reasoning");
152
+ }
153
+ /**
154
+ * Extracts and concatenates all reasoning text, or undefined if none exists.
155
+ */
156
+ get reasoningText() {
157
+ const text = [];
158
+ for (const part of this.content) {
159
+ if (part.type === "reasoning") {
160
+ text.push(part.text);
161
+ }
162
+ }
163
+ return text.length === 0 ? undefined : text.join("");
164
+ }
165
+ /**
166
+ * Returns all tool call parts from the response.
167
+ */
168
+ get toolCalls() {
169
+ return this.content.filter(part => part.type === "tool-call");
170
+ }
171
+ /**
172
+ * Returns all tool result parts from the response.
173
+ */
174
+ get toolResults() {
175
+ return this.content.filter(part => part.type === "tool-result");
176
+ }
177
+ /**
178
+ * The reason why text generation finished.
179
+ */
180
+ get finishReason() {
181
+ const finishPart = this.content.find(part => part.type === "finish");
182
+ return Predicate.isUndefined(finishPart) ? "unknown" : finishPart.reason;
183
+ }
184
+ /**
185
+ * Token usage statistics for the generation request.
186
+ */
187
+ get usage() {
188
+ const finishPart = this.content.find(part => part.type === "finish");
189
+ if (Predicate.isUndefined(finishPart)) {
190
+ return new Response.Usage({
191
+ inputTokens: undefined,
192
+ outputTokens: undefined,
193
+ totalTokens: undefined,
194
+ reasoningTokens: undefined,
195
+ cachedInputTokens: undefined
196
+ });
197
+ }
198
+ return finishPart.usage;
199
+ }
200
+ }
201
+ /**
202
+ * Response class for structured object generation operations.
203
+ *
204
+ * @example
205
+ * ```ts
206
+ * import { LanguageModel } from "@effect/ai"
207
+ * import { Effect, Schema } from "effect"
208
+ *
209
+ * const UserSchema = Schema.Struct({
210
+ * name: Schema.String,
211
+ * email: Schema.String
212
+ * })
213
+ *
214
+ * const program = Effect.gen(function* () {
215
+ * const response = yield* LanguageModel.generateObject({
216
+ * prompt: "Create user: John Doe, john@example.com",
217
+ * schema: UserSchema
218
+ * })
219
+ *
220
+ * console.log(response.value) // { name: "John Doe", email: "john@example.com" }
221
+ * console.log(response.text) // Raw generated text
222
+ *
223
+ * return response.value
224
+ * })
225
+ * ```
226
+ *
227
+ * @since 1.0.0
228
+ * @category Models
229
+ */
230
+ exports.GenerateTextResponse = GenerateTextResponse;
231
+ class GenerateObjectResponse extends GenerateTextResponse {
232
+ /**
233
+ * The parsed structured object that conforms to the provided schema.
234
+ */
235
+ value;
236
+ constructor(value, content) {
237
+ super(content);
238
+ this.value = value;
239
+ }
240
+ }
241
+ /**
242
+ * Creates a LanguageModel service from provider-specific implementations.
243
+ *
244
+ * This constructor takes provider-specific implementations for text generation
245
+ * and streaming text generation and returns a LanguageModel service.
246
+ *
247
+ * @since 1.0.0
248
+ * @category Constructors
249
+ */
250
+ exports.GenerateObjectResponse = GenerateObjectResponse;
251
+ const make = exports.make = /*#__PURE__*/Effect.fnUntraced(function* (params) {
252
+ const parentSpanTransformer = yield* Effect.serviceOption(_Telemetry.CurrentSpanTransformer);
253
+ const getSpanTransformer = Effect.serviceOption(_Telemetry.CurrentSpanTransformer).pipe(Effect.map(Option.orElse(() => parentSpanTransformer)));
254
+ const idGenerator = yield* Effect.serviceOption(_IdGenerator.IdGenerator).pipe(Effect.map(Option.getOrElse(() => _IdGenerator.defaultIdGenerator)));
255
+ const generateText = options => Effect.useSpan("LanguageModel.generateText", {
256
+ captureStackTrace: false,
257
+ attributes: {
258
+ concurrency: options.concurrency,
259
+ toolChoice: options.toolChoice
260
+ }
261
+ }, Effect.fnUntraced(function* (span) {
262
+ const spanTransformer = yield* getSpanTransformer;
263
+ const providerOptions = {
264
+ prompt: Prompt.make(options.prompt),
265
+ tools: [],
266
+ toolChoice: "none",
267
+ responseFormat: {
268
+ type: "text"
269
+ },
270
+ span
271
+ };
272
+ const content = yield* generateContent(options, providerOptions);
273
+ applySpanTransformer(spanTransformer, content, providerOptions);
274
+ return new GenerateTextResponse(content);
275
+ }, Effect.catchTag("ParseError", error => AiError.MalformedOutput.fromParseError({
276
+ module: "LanguageModel",
277
+ method: "generateText",
278
+ error
279
+ })), (effect, span) => Effect.withParentSpan(effect, span), Effect.provideService(_IdGenerator.IdGenerator, idGenerator)));
280
+ const generateObject = options => {
281
+ const schema = options.schema;
282
+ const objectName = getObjectName(options.objectName, schema);
283
+ return Effect.useSpan("LanguageModel.generateObject", {
284
+ captureStackTrace: false,
285
+ attributes: {
286
+ objectName,
287
+ concurrency: options.concurrency,
288
+ toolChoice: options.toolChoice
289
+ }
290
+ }, Effect.fnUntraced(function* (span) {
291
+ const spanTransformer = yield* getSpanTransformer;
292
+ const providerOptions = {
293
+ prompt: Prompt.make(options.prompt),
294
+ tools: [],
295
+ toolChoice: "none",
296
+ responseFormat: {
297
+ type: "json",
298
+ objectName,
299
+ schema
300
+ },
301
+ span
302
+ };
303
+ const content = yield* generateContent(options, providerOptions);
304
+ applySpanTransformer(spanTransformer, content, providerOptions);
305
+ const value = yield* resolveStructuredOutput(content, schema);
306
+ return new GenerateObjectResponse(value, content);
307
+ }, Effect.catchTag("ParseError", error => AiError.MalformedOutput.fromParseError({
308
+ module: "LanguageModel",
309
+ method: "generateText",
310
+ error
311
+ })), (effect, span) => Effect.withParentSpan(effect, span), Effect.provideService(_IdGenerator.IdGenerator, idGenerator)));
312
+ };
313
+ const streamText = Effect.fnUntraced(function* (options) {
314
+ const span = yield* Effect.makeSpanScoped("LanguageModel.streamText", {
315
+ captureStackTrace: false,
316
+ attributes: {
317
+ concurrency: options.concurrency,
318
+ toolChoice: options.toolChoice
319
+ }
320
+ });
321
+ const providerOptions = {
322
+ prompt: Prompt.make(options.prompt),
323
+ tools: [],
324
+ toolChoice: "none",
325
+ responseFormat: {
326
+ type: "text"
327
+ },
328
+ span
329
+ };
330
+ // Resolve the content stream for the request
331
+ const stream = yield* streamContent(options, providerOptions);
332
+ // Return the stream immediately if there is no span transformer
333
+ const spanTransformer = yield* getSpanTransformer;
334
+ if (Option.isNone(spanTransformer)) {
335
+ return stream;
336
+ }
337
+ // Otherwise aggregate generated content and apply the span transformer
338
+ // when the stream is finished
339
+ let content = [];
340
+ return stream.pipe(Stream.mapChunks(chunk => {
341
+ content = [...content, ...chunk];
342
+ return chunk;
343
+ }), Stream.ensuring(Effect.sync(() => {
344
+ spanTransformer.value({
345
+ ...providerOptions,
346
+ response: content
347
+ });
348
+ })));
349
+ }, Stream.unwrapScoped, Stream.mapError(error => ParseResult.isParseError(error) ? AiError.MalformedOutput.fromParseError({
350
+ module: "LanguageModel",
351
+ method: "streamText",
352
+ error
353
+ }) : error), Stream.provideService(_IdGenerator.IdGenerator, idGenerator));
354
+ const generateContent = Effect.fnUntraced(function* (options, providerOptions) {
355
+ const toolChoice = options.toolChoice ?? "auto";
356
+ // If there is no toolkit, the generated content can be returned immediately
357
+ if (Predicate.isUndefined(options.toolkit)) {
358
+ const ResponseSchema = Schema.mutable(Schema.Array(Response.Part(Toolkit.empty)));
359
+ const rawContent = yield* params.generateText(providerOptions);
360
+ const content = yield* Schema.decodeUnknown(ResponseSchema)(rawContent);
361
+ return content;
362
+ }
363
+ // If there is a toolkit resolve and apply it to the provider options
364
+ const toolkit = yield* resolveToolkit(options.toolkit);
365
+ // If the resolved toolkit is empty, return the generated content immediately
366
+ if (Object.values(toolkit.tools).length === 0) {
367
+ const ResponseSchema = Schema.mutable(Schema.Array(Response.Part(Toolkit.empty)));
368
+ const rawContent = yield* params.generateText(providerOptions);
369
+ const content = yield* Schema.decodeUnknown(ResponseSchema)(rawContent);
370
+ return content;
371
+ }
372
+ const tools = typeof toolChoice === "object" && "oneOf" in toolChoice ? Object.values(toolkit.tools).filter(tool => toolChoice.oneOf.includes(tool.name)) : Object.values(toolkit.tools);
373
+ providerOptions.tools = tools;
374
+ providerOptions.toolChoice = toolChoice;
375
+ // If tool call resolution is disabled, return the response without
376
+ // resolving the tool calls that were generated
377
+ if (options.disableToolCallResolution === true) {
378
+ const ResponseSchema = Schema.mutable(Schema.Array(Response.Part(Toolkit.empty)));
379
+ const rawContent = yield* params.generateText(providerOptions);
380
+ const content = yield* Schema.decodeUnknown(ResponseSchema)(rawContent);
381
+ return content;
382
+ }
383
+ const rawContent = yield* params.generateText(providerOptions);
384
+ // Resolve the generated tool calls
385
+ const toolResults = yield* resolveToolCalls(rawContent, toolkit, options.concurrency);
386
+ const ResponseSchema = Schema.mutable(Schema.Array(Response.Part(toolkit)));
387
+ const content = yield* Schema.decodeUnknown(ResponseSchema)(rawContent);
388
+ // Return the content merged with the tool call results
389
+ return [...content, ...toolResults];
390
+ });
391
+ const streamContent = Effect.fnUntraced(function* (options, providerOptions) {
392
+ const toolChoice = options.toolChoice ?? "auto";
393
+ // If there is no toolkit, return immediately
394
+ if (Predicate.isUndefined(options.toolkit)) {
395
+ const schema = Schema.ChunkFromSelf(Response.StreamPart(Toolkit.empty));
396
+ const decode = Schema.decode(schema);
397
+ return params.streamText(providerOptions).pipe(Stream.mapChunksEffect(decode));
398
+ }
399
+ // If there is a toolkit resolve and apply it to the provider options
400
+ const toolkit = Effect.isEffect(options.toolkit) ? yield* options.toolkit : options.toolkit;
401
+ // If the toolkit is empty, return immediately
402
+ if (Object.values(toolkit.tools).length === 0) {
403
+ const schema = Schema.ChunkFromSelf(Response.StreamPart(Toolkit.empty));
404
+ const decode = Schema.decode(schema);
405
+ return params.streamText(providerOptions).pipe(Stream.mapChunksEffect(decode));
406
+ }
407
+ const tools = typeof toolChoice === "object" && "oneOf" in toolChoice ? Object.values(toolkit.tools).filter(tool => toolChoice.oneOf.includes(tool.name)) : Object.values(toolkit.tools);
408
+ providerOptions.tools = tools;
409
+ providerOptions.toolChoice = toolChoice;
410
+ // If tool call resolution is disabled, return the response without
411
+ // resolving the tool calls that were generated
412
+ if (options.disableToolCallResolution === true) {
413
+ const schema = Schema.ChunkFromSelf(Response.StreamPart(toolkit));
414
+ const decode = Schema.decode(schema);
415
+ return params.streamText(providerOptions).pipe(Stream.mapChunksEffect(decode));
416
+ }
417
+ const ResponseSchema = Schema.Chunk(Response.StreamPart(toolkit));
418
+ const decode = Schema.decode(ResponseSchema);
419
+ return params.streamText(providerOptions).pipe(Stream.mapChunksEffect(Effect.fnUntraced(function* (chunk) {
420
+ const rawContent = Chunk.toArray(chunk);
421
+ const toolResults = yield* resolveToolCalls(rawContent, toolkit, options.concurrency);
422
+ const content = yield* decode(rawContent);
423
+ return Chunk.unsafeFromArray([...content, ...toolResults]);
424
+ })));
425
+ });
426
+ return {
427
+ generateText,
428
+ generateObject,
429
+ streamText
430
+ };
431
+ });
432
+ // =============================================================================
433
+ // Accessors
434
+ // =============================================================================
435
+ /**
436
+ * Generate text using a language model.
437
+ *
438
+ * @example
439
+ * ```ts
440
+ * import { LanguageModel } from "@effect/ai"
441
+ * import { Effect } from "effect"
442
+ *
443
+ * const program = Effect.gen(function* () {
444
+ * const response = yield* LanguageModel.generateText({
445
+ * prompt: "Write a haiku about programming",
446
+ * toolChoice: "none"
447
+ * })
448
+ *
449
+ * console.log(response.text)
450
+ * console.log(response.usage.totalTokens)
451
+ *
452
+ * return response
453
+ * })
454
+ * ```
455
+ *
456
+ * @since 1.0.0
457
+ * @category Functions
458
+ */
459
+ const generateText = exports.generateText = /*#__PURE__*/Effect.serviceFunctionEffect(LanguageModel, model => model.generateText);
460
+ /**
461
+ * Generate a structured object from a schema using a language model.
462
+ *
463
+ * @example
464
+ * ```ts
465
+ * import { LanguageModel } from "@effect/ai"
466
+ * import { Effect, Schema } from "effect"
467
+ *
468
+ * const EventSchema = Schema.Struct({
469
+ * title: Schema.String,
470
+ * date: Schema.String,
471
+ * location: Schema.String
472
+ * })
473
+ *
474
+ * const program = Effect.gen(function* () {
475
+ * const response = yield* LanguageModel.generateObject({
476
+ * prompt: "Extract event info: Tech Conference on March 15th in San Francisco",
477
+ * schema: EventSchema,
478
+ * objectName: "event"
479
+ * })
480
+ *
481
+ * console.log(response.value)
482
+ * // { title: "Tech Conference", date: "March 15th", location: "San Francisco" }
483
+ *
484
+ * return response.value
485
+ * })
486
+ * ```
487
+ *
488
+ * @since 1.0.0
489
+ * @category Functions
490
+ */
491
+ const generateObject = exports.generateObject = /*#__PURE__*/Effect.serviceFunctionEffect(LanguageModel, model => model.generateObject);
492
+ /**
493
+ * Generate text using a language model with streaming output.
494
+ *
495
+ * Returns a stream of response parts that are emitted as soon as they are
496
+ * available from the model, enabling real-time text generation experiences.
497
+ *
498
+ * @example
499
+ * ```ts
500
+ * import { LanguageModel } from "@effect/ai"
501
+ * import { Effect, Stream, Console } from "effect"
502
+ *
503
+ * const program = LanguageModel.streamText({
504
+ * prompt: "Write a story about a space explorer"
505
+ * }).pipe(Stream.runForEach((part) => {
506
+ * if (part.type === "text-delta") {
507
+ * return Console.log(part.delta)
508
+ * }
509
+ * return Effect.void
510
+ * }))
511
+ * ```
512
+ *
513
+ * @since 1.0.0
514
+ * @category Functions
515
+ */
516
+ const streamText = options => Stream.unwrap(LanguageModel.pipe(Effect.map(model => model.streamText(options))));
517
+ // =============================================================================
518
+ // Tool Call Resolution
519
+ // =============================================================================
520
+ exports.streamText = streamText;
521
+ const resolveToolCalls = (content, toolkit, concurrency) => {
522
+ const toolNames = [];
523
+ const toolCalls = [];
524
+ for (const part of content) {
525
+ if (part.type === "tool-call") {
526
+ toolNames.push(part.name);
527
+ if (part.providerExecuted === true) {
528
+ continue;
529
+ }
530
+ toolCalls.push(part);
531
+ }
532
+ }
533
+ return Effect.forEach(toolCalls, toolCall => {
534
+ return toolkit.handle(toolCall.name, toolCall.params).pipe(Effect.map(({
535
+ encodedResult,
536
+ result
537
+ }) => Response.makePart("tool-result", {
538
+ id: toolCall.id,
539
+ name: toolCall.name,
540
+ result,
541
+ encodedResult,
542
+ providerName: toolCall.providerName,
543
+ providerExecuted: false
544
+ })));
545
+ }, {
546
+ concurrency
547
+ });
548
+ };
549
+ // =============================================================================
550
+ // Utilities
551
+ // =============================================================================
552
+ const resolveToolkit = toolkit => Effect.isEffect(toolkit) ? toolkit : Effect.succeed(toolkit);
553
+ const getObjectName = (objectName, schema) => Predicate.isNotUndefined(objectName) ? objectName : "_tag" in schema ? schema._tag : "identifier" in schema ? schema.identifier : "generateObject";
554
+ const resolveStructuredOutput = /*#__PURE__*/Effect.fnUntraced(function* (response, ResultSchema) {
555
+ const text = [];
556
+ for (const part of response) {
557
+ if (part.type === "text") {
558
+ text.push(part.text);
559
+ }
560
+ }
561
+ if (text.length === 0) {
562
+ return yield* new AiError.MalformedOutput({
563
+ module: "LanguageModel",
564
+ method: "generateObject",
565
+ description: "No object was generated by the large language model"
566
+ });
567
+ }
568
+ const decode = Schema.decode(Schema.parseJson(ResultSchema));
569
+ return yield* Effect.mapError(decode(text.join("")), cause => new AiError.MalformedOutput({
570
+ module: "LanguageModel",
571
+ method: "generateObject",
572
+ description: "Generated object failed to conform to provided schema",
573
+ cause
574
+ }));
575
+ });
576
+ const applySpanTransformer = (transformer, response, options) => {
577
+ if (Option.isSome(transformer)) {
578
+ transformer.value({
579
+ ...options,
580
+ response: response
581
+ });
582
+ }
583
+ };
584
+ //# sourceMappingURL=LanguageModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LanguageModel.js","names":["Chunk","_interopRequireWildcard","require","Context","Effect","Option","ParseResult","Predicate","Schema","Stream","AiError","_IdGenerator","Prompt","Response","_Telemetry","Toolkit","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","LanguageModel","Tag","exports","GenerateTextResponse","content","constructor","text","part","type","push","join","reasoning","filter","reasoningText","length","undefined","toolCalls","toolResults","finishReason","finishPart","find","isUndefined","reason","usage","Usage","inputTokens","outputTokens","totalTokens","reasoningTokens","cachedInputTokens","GenerateObjectResponse","value","make","fnUntraced","params","parentSpanTransformer","serviceOption","CurrentSpanTransformer","getSpanTransformer","pipe","map","orElse","idGenerator","IdGenerator","getOrElse","defaultIdGenerator","generateText","options","useSpan","captureStackTrace","attributes","concurrency","toolChoice","span","spanTransformer","providerOptions","prompt","tools","responseFormat","generateContent","applySpanTransformer","catchTag","error","MalformedOutput","fromParseError","module","method","effect","withParentSpan","provideService","generateObject","schema","objectName","getObjectName","resolveStructuredOutput","streamText","makeSpanScoped","stream","streamContent","isNone","mapChunks","chunk","ensuring","sync","response","unwrapScoped","mapError","isParseError","toolkit","ResponseSchema","mutable","Array","Part","empty","rawContent","decodeUnknown","resolveToolkit","values","tool","oneOf","includes","name","disableToolCallResolution","resolveToolCalls","ChunkFromSelf","StreamPart","decode","mapChunksEffect","isEffect","toArray","unsafeFromArray","serviceFunctionEffect","model","unwrap","toolNames","providerExecuted","forEach","toolCall","handle","encodedResult","result","makePart","id","providerName","succeed","isNotUndefined","_tag","identifier","ResultSchema","description","parseJson","cause","transformer","isSome"],"sources":["../../src/LanguageModel.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -22,8 +22,8 @@ var RcMap = _interopRequireWildcard(require("effect/RcMap"));
22
22
  var Schema = _interopRequireWildcard(require("effect/Schema"));
23
23
  var AST = _interopRequireWildcard(require("effect/SchemaAST"));
24
24
  var FindMyWay = _interopRequireWildcard(require("find-my-way-ts"));
25
- var AiTool = _interopRequireWildcard(require("./AiTool.js"));
26
25
  var _McpSchema = require("./McpSchema.js");
26
+ var AiTool = _interopRequireWildcard(require("./Tool.js"));
27
27
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
28
28
  /**
29
29
  * @since 1.0.0
@@ -76,6 +76,7 @@ class McpServer extends /*#__PURE__*/Context.Tag("@effect/ai/McpServer")() {
76
76
  return McpServer.of({
77
77
  notifications: notifications.client,
78
78
  notificationsMailbox,
79
+ initializedClients: new Set(),
79
80
  get tools() {
80
81
  return tools;
81
82
  },
@@ -268,7 +269,11 @@ const run = exports.run = /*#__PURE__*/Effect.fnUntraced(function* (options) {
268
269
  payload: encoded
269
270
  };
270
271
  const clientIds = yield* patchedProtocol.clientIds;
271
- for (const clientId of clientIds) {
272
+ for (const clientId of server.initializedClients) {
273
+ if (!clientIds.has(clientId)) {
274
+ server.initializedClients.delete(clientId);
275
+ continue;
276
+ }
272
277
  yield* patchedProtocol.send(clientId, message);
273
278
  }
274
279
  })), Effect.catchAllCause(() => Effect.void), Effect.forever, Effect.forkScoped);
@@ -427,7 +432,7 @@ const registerToolkit = exports.registerToolkit = /*#__PURE__*/Effect.fnUntraced
427
432
  const registry = yield* McpServer;
428
433
  const built = yield* toolkit;
429
434
  const context = yield* Effect.context();
430
- for (const tool of built.tools) {
435
+ for (const tool of Object.values(built.tools)) {
431
436
  const mcpTool = new _McpSchema.Tool({
432
437
  name: tool.name,
433
438
  description: tool.description,
@@ -718,7 +723,9 @@ const layerHandlers = serverInfo => _McpSchema.ClientRpcs.toLayer(Effect.gen(fun
718
723
  return {
719
724
  // Requests
720
725
  ping: () => Effect.succeed({}),
721
- initialize(params) {
726
+ initialize(params, {
727
+ clientId
728
+ }) {
722
729
  const requestedVersion = params.protocolVersion;
723
730
  const capabilities = {
724
731
  completions: {}
@@ -739,6 +746,7 @@ const layerHandlers = serverInfo => _McpSchema.ClientRpcs.toLayer(Effect.gen(fun
739
746
  listChanged: true
740
747
  };
741
748
  }
749
+ server.initializedClients.add(clientId);
742
750
  return Effect.succeed({
743
751
  capabilities,
744
752
  serverInfo,