@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,876 @@
1
+ /**
2
+ * The `Tool` module provides functionality for defining and managing tools
3
+ * that language models can call to augment their capabilities.
4
+ *
5
+ * This module enables creation of both user-defined and provider-defined tools,
6
+ * with full schema validation, type safety, and handler support. Tools allow
7
+ * AI models to perform actions like searching databases, calling APIs, or
8
+ * executing code within your application context.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import { Tool } from "@effect/ai"
13
+ * import { Schema } from "effect"
14
+ *
15
+ * // Define a simple calculator tool
16
+ * const Calculator = Tool.make("Calculator", {
17
+ * description: "Performs basic arithmetic operations",
18
+ * parameters: {
19
+ * operation: Schema.Literal("add", "subtract", "multiply", "divide"),
20
+ * a: Schema.Number,
21
+ * b: Schema.Number
22
+ * },
23
+ * success: Schema.Number
24
+ * })
25
+ * ```
26
+ *
27
+ * @since 1.0.0
28
+ */
29
+ import * as Context from "effect/Context";
30
+ import * as Effect from "effect/Effect";
31
+ import * as JsonSchema from "effect/JSONSchema";
32
+ import type { Pipeable } from "effect/Pipeable";
33
+ import * as Schema from "effect/Schema";
34
+ import * as AST from "effect/SchemaAST";
35
+ import type { Covariant } from "effect/Types";
36
+ import * as AiError from "./AiError.js";
37
+ /**
38
+ * Unique identifier for user-defined tools.
39
+ *
40
+ * @since 1.0.0
41
+ * @category Type Ids
42
+ */
43
+ export declare const TypeId = "~@effect/ai/Tool";
44
+ /**
45
+ * Type-level representation of the user-defined tool identifier.
46
+ *
47
+ * @since 1.0.0
48
+ * @category Type Ids
49
+ */
50
+ export type TypeId = typeof TypeId;
51
+ /**
52
+ * Unique identifier for provider-defined tools.
53
+ *
54
+ * @since 1.0.0
55
+ * @category Type Ids
56
+ */
57
+ export declare const ProviderDefinedTypeId = "~@effect/ai/Tool/ProviderDefined";
58
+ /**
59
+ * Type-level representation of the provider-defined tool identifier.
60
+ *
61
+ * @since 1.0.0
62
+ * @category Type Ids
63
+ */
64
+ export type ProviderDefinedTypeId = typeof ProviderDefinedTypeId;
65
+ /**
66
+ * A user-defined tool that language models can call to perform actions.
67
+ *
68
+ * Tools represent actionable capabilities that large language models can invoke
69
+ * to extend their functionality beyond text generation. Each tool has a defined
70
+ * schema for parameters, results, and failures.
71
+ *
72
+ * @example
73
+ * ```ts
74
+ * import { Tool } from "@effect/ai"
75
+ * import { Schema } from "effect"
76
+ *
77
+ * // Create a weather lookup tool
78
+ * const GetWeather = Tool.make("GetWeather", {
79
+ * description: "Get current weather for a location",
80
+ * parameters: {
81
+ * location: Schema.String,
82
+ * units: Schema.Literal("celsius", "fahrenheit")
83
+ * },
84
+ * success: Schema.Struct({
85
+ * temperature: Schema.Number,
86
+ * condition: Schema.String,
87
+ * humidity: Schema.Number
88
+ * })
89
+ * })
90
+ * ```
91
+ *
92
+ * @since 1.0.0
93
+ * @category Models
94
+ */
95
+ export interface Tool<Name extends string, Config extends {
96
+ readonly parameters: AnyStructSchema;
97
+ readonly success: Schema.Schema.Any;
98
+ readonly failure: Schema.Schema.All;
99
+ } = {
100
+ readonly parameters: Schema.Struct<{}>;
101
+ readonly success: typeof Schema.Void;
102
+ readonly failure: typeof Schema.Never;
103
+ }, Requirements = never> extends Tool.Variance<Requirements> {
104
+ /**
105
+ * The tool identifier which is used to uniquely identify the tool. */
106
+ readonly id: string;
107
+ /**
108
+ * The name of the tool.
109
+ */
110
+ readonly name: Name;
111
+ /**
112
+ * The optional description of the tool.
113
+ */
114
+ readonly description?: string | undefined;
115
+ /**
116
+ * A `Schema` representing the parameters that a tool must be called with.
117
+ */
118
+ readonly parametersSchema: Config["parameters"];
119
+ /**
120
+ * A `Schema` representing the value that a tool must return when called if
121
+ * the tool call is successful.
122
+ */
123
+ readonly successSchema: Config["success"];
124
+ /**
125
+ * A `Schema` representing the value that a tool must return when called if
126
+ * it fails.
127
+ */
128
+ readonly failureSchema: Config["failure"];
129
+ /**
130
+ * A `Context` object containing tool annotations which can store metadata
131
+ * about the tool.
132
+ */
133
+ readonly annotations: Context.Context<never>;
134
+ /**
135
+ * Adds a _request-level_ dependency which must be provided before the tool
136
+ * call handler can be executed.
137
+ *
138
+ * This can be useful when you want to enforce that a particular dependency
139
+ * **MUST** be provided to each request to the large language model provider
140
+ * instead of being provided when creating the tool call handler layer.
141
+ */
142
+ addDependency<Identifier, Service>(tag: Context.Tag<Identifier, Service>): Tool<Name, Config, Identifier | Requirements>;
143
+ /**
144
+ * Set the schema to use to validate the result of a tool call when successful.
145
+ */
146
+ setParameters<ParametersSchema extends Schema.Struct<any> | Schema.Struct.Fields>(schema: ParametersSchema): Tool<Name, {
147
+ readonly parameters: ParametersSchema extends Schema.Struct<infer _> ? ParametersSchema : ParametersSchema extends Schema.Struct.Fields ? Schema.Struct<ParametersSchema> : never;
148
+ readonly success: Config["success"];
149
+ readonly failure: Config["failure"];
150
+ }, Requirements>;
151
+ /**
152
+ * Set the schema to use to validate the result of a tool call when successful.
153
+ */
154
+ setSuccess<SuccessSchema extends Schema.Schema.Any>(schema: SuccessSchema): Tool<Name, {
155
+ readonly parameters: Config["parameters"];
156
+ readonly success: SuccessSchema;
157
+ readonly failure: Config["failure"];
158
+ }, Requirements>;
159
+ /**
160
+ * Set the schema to use to validate the result of a tool call when it fails.
161
+ */
162
+ setFailure<FailureSchema extends Schema.Schema.Any>(schema: FailureSchema): Tool<Name, {
163
+ readonly parameters: Config["parameters"];
164
+ readonly success: Config["success"];
165
+ readonly failure: FailureSchema;
166
+ }, Requirements>;
167
+ /**
168
+ * Add an annotation to the tool.
169
+ */
170
+ annotate<I, S>(tag: Context.Tag<I, S>, value: S): Tool<Name, Config, Requirements>;
171
+ /**
172
+ * Add many annotations to the tool.
173
+ */
174
+ annotateContext<I>(context: Context.Context<I>): Tool<Name, Config, Requirements>;
175
+ }
176
+ /**
177
+ * A provider-defined tool is a tool which is built into a large language model
178
+ * provider (e.g. web search, code execution).
179
+ *
180
+ * These tools are executed by the large language model provider rather than
181
+ * by your application. However, they can optionally require custom handlers
182
+ * implemented in your application to process provider generated results.
183
+ *
184
+ * @example
185
+ * ```ts
186
+ * import { Tool } from "@effect/ai"
187
+ * import { Schema } from "effect"
188
+ *
189
+ * // Define a web search tool provided by OpenAI
190
+ * const WebSearch = Tool.providerDefined({
191
+ * id: "openai.web_search",
192
+ * toolkitName: "WebSearch",
193
+ * providerName: "web_search",
194
+ * args: {
195
+ * query: Schema.String
196
+ * },
197
+ * success: Schema.Struct({
198
+ * results: Schema.Array(Schema.Struct({
199
+ * title: Schema.String,
200
+ * url: Schema.String,
201
+ * snippet: Schema.String
202
+ * }))
203
+ * })
204
+ * })
205
+ * ```
206
+ *
207
+ * @since 1.0.0
208
+ * @category Models
209
+ */
210
+ export interface ProviderDefined<Name extends string, Config extends {
211
+ readonly args: AnyStructSchema;
212
+ readonly parameters: AnyStructSchema;
213
+ readonly success: Schema.Schema.Any;
214
+ readonly failure: Schema.Schema.All;
215
+ } = {
216
+ readonly args: Schema.Struct<{}>;
217
+ readonly parameters: Schema.Struct<{}>;
218
+ readonly success: typeof Schema.Void;
219
+ readonly failure: typeof Schema.Never;
220
+ }, RequiresHandler extends boolean = false> extends Tool<Name, {
221
+ readonly parameters: Config["parameters"];
222
+ success: RequiresHandler extends true ? Config["success"] : Schema.Either<Config["success"], Config["failure"]>;
223
+ failure: RequiresHandler extends true ? Config["failure"] : typeof Schema.Never;
224
+ }>, Tool.ProviderDefinedProto {
225
+ /**
226
+ * The arguments passed to the provider-defined tool.
227
+ */
228
+ readonly args: Config["args"]["Encoded"];
229
+ /**
230
+ * A `Schema` representing the arguments provided by the end-user which will
231
+ * be used to configure the behavior of the provider-defined tool.
232
+ */
233
+ readonly argsSchema: Config["args"];
234
+ /**
235
+ * Name of the tool as recognized by the large language model provider.
236
+ */
237
+ readonly providerName: string;
238
+ /**
239
+ * If set to `true`, this provider-defined tool will require a user-defined
240
+ * tool call handler to be provided when converting the `Toolkit` containing
241
+ * this tool into a `Layer`.
242
+ */
243
+ readonly requiresHandler: RequiresHandler;
244
+ /**
245
+ * Decodes the result received after the provider-defined tool is called.
246
+ */
247
+ decodeResult(args: unknown): Effect.Effect<Config["success"]["Type"], AiError.AiError>;
248
+ }
249
+ /**
250
+ * @since 1.0.0
251
+ */
252
+ export declare namespace Tool {
253
+ /**
254
+ * @since 1.0.0
255
+ * @category Models
256
+ */
257
+ interface Variance<out Requirements> extends Pipeable {
258
+ readonly [TypeId]: VarianceStruct<Requirements>;
259
+ }
260
+ /**
261
+ * @since 1.0.0
262
+ * @category Models
263
+ */
264
+ interface VarianceStruct<out Requirements> {
265
+ readonly _Requirements: Covariant<Requirements>;
266
+ }
267
+ /**
268
+ * @since 1.0.0
269
+ * @category Models
270
+ */
271
+ interface ProviderDefinedProto {
272
+ readonly [ProviderDefinedTypeId]: ProviderDefinedTypeId;
273
+ }
274
+ }
275
+ /**
276
+ * Type guard to check if a value is a user-defined tool.
277
+ *
278
+ * @example
279
+ * ```ts
280
+ * import { Tool } from "@effect/ai"
281
+ * import { Schema } from "effect"
282
+ *
283
+ * const UserDefinedTool = Tool.make("Calculator", {
284
+ * description: "Performs basic arithmetic operations",
285
+ * parameters: {
286
+ * operation: Schema.Literal("add", "subtract", "multiply", "divide"),
287
+ * a: Schema.Number,
288
+ * b: Schema.Number
289
+ * },
290
+ * success: Schema.Number
291
+ * })
292
+ *
293
+ * const ProviderDefinedTool = Tool.providerDefined({
294
+ * id: "openai.web_search",
295
+ * toolkitName: "WebSearch",
296
+ * providerName: "web_search",
297
+ * args: {
298
+ * query: Schema.String
299
+ * },
300
+ * success: Schema.Struct({
301
+ * results: Schema.Array(Schema.Struct({
302
+ * title: Schema.String,
303
+ * url: Schema.String,
304
+ * snippet: Schema.String
305
+ * }))
306
+ * })
307
+ * })
308
+ *
309
+ * console.log(Tool.isUserDefined(UserDefinedTool)) // true
310
+ * console.log(Tool.isUserDefined(ProviderDefinedTool)) // false
311
+ * ```
312
+ *
313
+ * @since 1.0.0
314
+ * @category Guards
315
+ */
316
+ export declare const isUserDefined: (u: unknown) => u is Tool<string, any, any>;
317
+ /**
318
+ * Type guard to check if a value is a provider-defined tool.
319
+ *
320
+ * @param u - The value to check
321
+ * @returns `true` if the value is a provider-defined `Tool`, `false` otherwise
322
+ *
323
+ * @example
324
+ * ```ts
325
+ * import { Tool } from "@effect/ai"
326
+ * import { Schema } from "effect"
327
+ *
328
+ * const UserDefinedTool = Tool.make("Calculator", {
329
+ * description: "Performs basic arithmetic operations",
330
+ * parameters: {
331
+ * operation: Schema.Literal("add", "subtract", "multiply", "divide"),
332
+ * a: Schema.Number,
333
+ * b: Schema.Number
334
+ * },
335
+ * success: Schema.Number
336
+ * })
337
+ *
338
+ * const ProviderDefinedTool = Tool.providerDefined({
339
+ * id: "openai.web_search",
340
+ * toolkitName: "WebSearch",
341
+ * providerName: "web_search",
342
+ * args: {
343
+ * query: Schema.String
344
+ * },
345
+ * success: Schema.Struct({
346
+ * results: Schema.Array(Schema.Struct({
347
+ * title: Schema.String,
348
+ * url: Schema.String,
349
+ * snippet: Schema.String
350
+ * }))
351
+ * })
352
+ * })
353
+ *
354
+ * console.log(Tool.isUserDefined(UserDefinedTool)) // false
355
+ * console.log(Tool.isUserDefined(ProviderDefinedTool)) // true
356
+ * ```
357
+ *
358
+ * @since 1.0.0
359
+ * @category Guards
360
+ */
361
+ export declare const isProviderDefined: (u: unknown) => u is ProviderDefined<string, any>;
362
+ /**
363
+ * A type which represents any `Tool`.
364
+ *
365
+ * @since 1.0.0
366
+ * @category Utility Types
367
+ */
368
+ export interface Any extends Pipeable {
369
+ readonly [TypeId]: {
370
+ readonly _Requirements: Covariant<any>;
371
+ };
372
+ readonly id: string;
373
+ readonly name: string;
374
+ readonly description?: string | undefined;
375
+ readonly parametersSchema: AnyStructSchema;
376
+ readonly successSchema: Schema.Schema.Any;
377
+ readonly failureSchema: Schema.Schema.All;
378
+ readonly annotations: Context.Context<never>;
379
+ }
380
+ /**
381
+ * A type which represents any provider-defined `Tool`.
382
+ *
383
+ * @since 1.0.0
384
+ * @category Utility Types
385
+ */
386
+ export interface AnyProviderDefined extends Any {
387
+ readonly args: any;
388
+ readonly argsSchema: AnyStructSchema;
389
+ readonly requiresHandler: boolean;
390
+ readonly providerName: string;
391
+ readonly decodeResult: (result: unknown) => Effect.Effect<any, AiError.AiError>;
392
+ }
393
+ /**
394
+ * @since 1.0.0
395
+ * @category Utility Types
396
+ */
397
+ export interface AnyStructSchema extends Pipeable {
398
+ readonly [Schema.TypeId]: any;
399
+ readonly make: any;
400
+ readonly Type: any;
401
+ readonly Encoded: any;
402
+ readonly Context: any;
403
+ readonly ast: AST.AST;
404
+ readonly fields: Schema.Struct.Fields;
405
+ readonly annotations: any;
406
+ }
407
+ /**
408
+ * @since 1.0.0
409
+ * @category Utility Types
410
+ */
411
+ export interface AnyTaggedRequestSchema extends AnyStructSchema {
412
+ readonly _tag: string;
413
+ readonly success: Schema.Schema.Any;
414
+ readonly failure: Schema.Schema.All;
415
+ }
416
+ /**
417
+ * A utility type to convert a `Schema.TaggedRequest` into an `Tool`.
418
+ *
419
+ * @since 1.0.0
420
+ * @category Utility Types
421
+ */
422
+ export interface FromTaggedRequest<S extends AnyTaggedRequestSchema> extends Tool<S["_tag"], {
423
+ readonly parameters: S;
424
+ readonly success: S["success"];
425
+ readonly failure: S["failure"];
426
+ }> {
427
+ }
428
+ /**
429
+ * A utility type to extract the `Name` type from an `Tool`.
430
+ *
431
+ * @since 1.0.0
432
+ * @category Utility Types
433
+ */
434
+ export type Name<T> = T extends Tool<infer _Name, infer _Config, infer _Requirements> ? _Name : never;
435
+ /**
436
+ * A utility type to extract the type of the tool call parameters.
437
+ *
438
+ * @since 1.0.0
439
+ * @category Utility Types
440
+ */
441
+ export type Parameters<T> = T extends Tool<infer _Name, infer _Config, infer _Requirements> ? Schema.Struct.Type<_Config["parameters"]["fields"]> : never;
442
+ /**
443
+ * A utility type to extract the encoded type of the tool call parameters.
444
+ *
445
+ * @since 1.0.0
446
+ * @category Utility Types
447
+ */
448
+ export type ParametersEncoded<T> = T extends Tool<infer _Name, infer _Config, infer _Requirements> ? Schema.Schema.Encoded<_Config["parameters"]> : never;
449
+ /**
450
+ * A utility type to extract the schema for the parameters which an `Tool`
451
+ * must be called with.
452
+ *
453
+ * @since 1.0.0
454
+ * @category Utility Types
455
+ */
456
+ export type ParametersSchema<T> = T extends Tool<infer _Name, infer _Config, infer _Requirements> ? _Config["parameters"] : never;
457
+ /**
458
+ * A utility type to extract the type of the tool call result when it succeeds.
459
+ *
460
+ * @since 1.0.0
461
+ * @category Utility Types
462
+ */
463
+ export type Success<T> = T extends Tool<infer _Name, infer _Config, infer _Requirements> ? Schema.Schema.Type<_Config["success"]> : never;
464
+ /**
465
+ * A utility type to extract the encoded type of the tool call result when
466
+ * it succeeds.
467
+ *
468
+ * @since 1.0.0
469
+ * @category Utility Types
470
+ */
471
+ export type SuccessEncoded<T> = T extends Tool<infer _Name, infer _Config, infer _Requirements> ? Schema.Schema.Encoded<_Config["success"]> : never;
472
+ /**
473
+ * A utility type to extract the schema for the return type of a tool call when
474
+ * the tool call succeeds.
475
+ *
476
+ * @since 1.0.0
477
+ * @category Utility Types
478
+ */
479
+ export type SuccessSchema<T> = T extends Tool<infer _Name, infer _Config, infer _Requirements> ? _Config["success"] : never;
480
+ /**
481
+ * A utility type to extract the type of the tool call result when it fails.
482
+ *
483
+ * @since 1.0.0
484
+ * @category Utility Types
485
+ */
486
+ export type Failure<T> = T extends Tool<infer _Name, infer _Config, infer _Requirements> ? Schema.Schema.Type<_Config["failure"]> : never;
487
+ /**
488
+ * A utility type to extract the encoded type of the tool call result when
489
+ * it fails.
490
+ *
491
+ * @since 1.0.0
492
+ * @category Utility Types
493
+ */
494
+ export type FailureEncoded<T> = T extends Tool<infer _Name, infer _Config, infer _Requirements> ? Schema.Schema.Encoded<_Config["failure"]> : never;
495
+ /**
496
+ * A utility type to extract the requirements of an `Tool`.
497
+ *
498
+ * @since 1.0.0
499
+ * @category Utility Types
500
+ */
501
+ export type Requirements<T> = T extends Tool<infer _Name, infer _Config, infer _Requirements> ? _Config["parameters"]["Context"] | _Config["success"]["Context"] | _Config["failure"]["Context"] | _Requirements : never;
502
+ /**
503
+ * Represents an `Tool` that has been implemented within the application.
504
+ *
505
+ * @since 1.0.0
506
+ * @category Models
507
+ */
508
+ export interface Handler<Name extends string> {
509
+ readonly _: unique symbol;
510
+ readonly name: Name;
511
+ readonly context: Context.Context<never>;
512
+ readonly handler: (params: any) => Effect.Effect<any, any>;
513
+ }
514
+ /**
515
+ * Represents the result of calling the handler for a particular `Tool`.
516
+ *
517
+ * @since 1.0.0
518
+ * @category Models
519
+ */
520
+ export interface HandlerResult<Tool extends Any> {
521
+ /**
522
+ * The result of executing the handler for a particular tool.
523
+ */
524
+ readonly result: Success<Tool>;
525
+ /**
526
+ * The pre-encoded tool call result of executing the handler for a particular
527
+ * tool as a JSON-serializable value. The encoded result can be incorporated
528
+ * into subsequent requests to the large language model.
529
+ */
530
+ readonly encodedResult: unknown;
531
+ }
532
+ /**
533
+ * A utility type to create a union of `Handler` types for all tools in a
534
+ * record.
535
+ *
536
+ * @since 1.0.0
537
+ * @category Utility Types
538
+ */
539
+ export type HandlersFor<Tools extends Record<string, Any>> = {
540
+ [K in keyof Tools]: Handler<Tools[K]["name"]>;
541
+ }[keyof Tools];
542
+ /**
543
+ * A utility type to determine if the specified tool requires a user-defined
544
+ * handler to be implemented.
545
+ *
546
+ * @since 1.0.0
547
+ * @category Utility Types
548
+ */
549
+ export type RequiresHandler<Tool extends Any> = Tool extends ProviderDefined<infer _Name, infer _Config, infer _RequiresHandler> ? _RequiresHandler : true;
550
+ /**
551
+ * Creates a user-defined tool with the specified name and configuration.
552
+ *
553
+ * This is the primary constructor for creating custom tools that AI models
554
+ * can call. The tool definition includes parameter validation, success/failure
555
+ * schemas, and optional service dependencies.
556
+ *
557
+ * @example
558
+ * ```ts
559
+ * import { Tool } from "@effect/ai"
560
+ * import { Schema } from "effect"
561
+ *
562
+ * // Simple tool with no parameters
563
+ * const GetCurrentTime = Tool.make("GetCurrentTime", {
564
+ * description: "Returns the current timestamp",
565
+ * success: Schema.Number
566
+ * })
567
+ * ```
568
+ *
569
+ * @since 1.0.0
570
+ * @category Constructors
571
+ */
572
+ export declare const make: <const Name extends string, Parameters extends Schema.Struct.Fields = {}, Success extends Schema.Schema.Any = typeof Schema.Void, Failure extends Schema.Schema.All = typeof Schema.Never, Dependencies extends Array<Context.Tag<any, any>> = []>(
573
+ /**
574
+ * The unique name identifier for this tool.
575
+ */
576
+ name: Name, options?: {
577
+ /**
578
+ * An optional description explaining what the tool does.
579
+ */
580
+ readonly description?: string | undefined;
581
+ /**
582
+ * Schema defining the parameters this tool accepts.
583
+ */
584
+ readonly parameters?: Parameters | undefined;
585
+ /**
586
+ * Schema for successful tool execution results.
587
+ */
588
+ readonly success?: Success | undefined;
589
+ /**
590
+ * Schema for tool execution failures.
591
+ */
592
+ readonly failure?: Failure | undefined;
593
+ /**
594
+ * Service dependencies required by the tool handler.
595
+ */
596
+ readonly dependencies?: Dependencies | undefined;
597
+ }) => Tool<Name, {
598
+ readonly parameters: Schema.Struct<Parameters>;
599
+ readonly success: Success;
600
+ readonly failure: Failure;
601
+ }, Context.Tag.Identifier<Dependencies[number]>>;
602
+ /**
603
+ * Creates a provider-defined tool which leverages functionality built into a
604
+ * large language model provider (e.g. web search, code execution).
605
+ *
606
+ * These tools are executed by the large language model provider rather than
607
+ * by your application. However, they can optionally require custom handlers
608
+ * implemented in your application to process provider generated results.
609
+ *
610
+ * @example
611
+ * ```ts
612
+ * import { Tool } from "@effect/ai"
613
+ * import { Schema } from "effect"
614
+ *
615
+ * // Web search tool provided by OpenAI
616
+ * const WebSearch = Tool.providerDefined({
617
+ * id: "openai.web_search",
618
+ * toolkitName: "WebSearch",
619
+ * providerName: "web_search",
620
+ * args: {
621
+ * query: Schema.String
622
+ * },
623
+ * success: Schema.Struct({
624
+ * results: Schema.Array(Schema.Struct({
625
+ * title: Schema.String,
626
+ * url: Schema.String,
627
+ * content: Schema.String
628
+ * }))
629
+ * })
630
+ * })
631
+ * ```
632
+ *
633
+ * @since 1.0.0
634
+ * @category Constructors
635
+ */
636
+ export declare const providerDefined: <const Name extends string, Args extends Schema.Struct.Fields = {}, Parameters extends Schema.Struct.Fields = {}, Success extends Schema.Schema.Any = typeof Schema.Void, Failure extends Schema.Schema.All = typeof Schema.Never, RequiresHandler extends boolean = false>(options: {
637
+ /**
638
+ * Unique identifier following format `<provider>.<tool-name>`.
639
+ */
640
+ readonly id: `${string}.${string}`;
641
+ /**
642
+ * Name used by the Toolkit to identify this tool.
643
+ */
644
+ readonly toolkitName: Name;
645
+ /**
646
+ * Name of the tool as recognized by the AI provider.
647
+ */
648
+ readonly providerName: string;
649
+ /**
650
+ * Schema for user-provided configuration arguments.
651
+ */
652
+ readonly args: Args;
653
+ /**
654
+ * Whether this tool requires a custom handler implementation.
655
+ */
656
+ readonly requiresHandler?: RequiresHandler | undefined;
657
+ /**
658
+ * Schema for parameters the provider sends when calling the tool.
659
+ */
660
+ readonly parameters?: Parameters | undefined;
661
+ /**
662
+ * Schema for successful tool execution results.
663
+ */
664
+ readonly success?: Success | undefined;
665
+ /**
666
+ * Schema for failed tool execution results.
667
+ */
668
+ readonly failure?: Failure | undefined;
669
+ }) => (args: Schema.Simplify<Schema.Struct.Encoded<Args>>) => ProviderDefined<Name, {
670
+ readonly args: Schema.Struct<Args>;
671
+ readonly parameters: Schema.Struct<Parameters>;
672
+ readonly success: Success;
673
+ readonly failure: Failure;
674
+ }, RequiresHandler>;
675
+ /**
676
+ * Creates a Tool from a Schema.TaggedRequest.
677
+ *
678
+ * This utility function converts Effect's TaggedRequest schemas into Tool
679
+ * definitions, automatically mapping the request parameters, success, and
680
+ * failure schemas.
681
+ *
682
+ * @example
683
+ * ```ts
684
+ * import { Tool } from "@effect/ai"
685
+ * import { Schema } from "effect"
686
+ *
687
+ * // Define a tagged request for user operations
688
+ * class GetUser extends Schema.TaggedRequest<GetUser>()("GetUser", {
689
+ * success: Schema.Struct({
690
+ * id: Schema.Number,
691
+ * name: Schema.String,
692
+ * email: Schema.String
693
+ * }),
694
+ * failure: Schema.Struct({
695
+ * error: Schema.Literal("UserNotFound", "DatabaseError"),
696
+ * message: Schema.String
697
+ * }),
698
+ * payload: {
699
+ * userId: Schema.Number
700
+ * }
701
+ * }) {}
702
+ *
703
+ * // Convert to a Tool
704
+ * const getUserTool = Tool.fromTaggedRequest(GetUser)
705
+ * ```
706
+ *
707
+ * @since 1.0.0
708
+ * @category Constructors
709
+ */
710
+ export declare const fromTaggedRequest: <S extends AnyTaggedRequestSchema>(schema: S) => FromTaggedRequest<S>;
711
+ /**
712
+ * Extracts the description from a tool's metadata.
713
+ *
714
+ * Returns the tool's description if explicitly set, otherwise attempts to
715
+ * extract it from the parameter schema's AST annotations.
716
+ *
717
+ * @example
718
+ * ```ts
719
+ * import { Tool } from "@effect/ai"
720
+ *
721
+ * const myTool = Tool.make("example", {
722
+ * description: "This is an example tool"
723
+ * })
724
+ *
725
+ * const description = Tool.getDescription(myTool)
726
+ * console.log(description) // "This is an example tool"
727
+ * ```
728
+ *
729
+ * @since 1.0.0
730
+ * @category Utilities
731
+ */
732
+ export declare const getDescription: <Name extends string, Config extends {
733
+ readonly parameters: AnyStructSchema;
734
+ readonly success: Schema.Schema.Any;
735
+ readonly failure: Schema.Schema.All;
736
+ }>(
737
+ /**
738
+ * The tool to get the description from.
739
+ */
740
+ tool: Tool<Name, Config>) => string | undefined;
741
+ /**
742
+ * @since 1.0.0
743
+ * @category Utilities
744
+ */
745
+ export declare const getDescriptionFromSchemaAst: (ast: AST.AST) => string | undefined;
746
+ /**
747
+ * Generates a JSON Schema for a tool.
748
+ *
749
+ * This function creates a JSON Schema representation that can be used by
750
+ * large language models to indicate the structure and type of the parameters
751
+ * that a given tool call should receive.
752
+ *
753
+ * @example
754
+ * ```ts
755
+ * import { Tool } from "@effect/ai"
756
+ * import { Schema } from "effect"
757
+ *
758
+ * const weatherTool = Tool.make("get_weather", {
759
+ * parameters: {
760
+ * location: Schema.String,
761
+ * units: Schema.optional(Schema.Literal("celsius", "fahrenheit"))
762
+ * }
763
+ * })
764
+ *
765
+ * const jsonSchema = Tool.getJsonSchema(weatherTool)
766
+ * console.log(jsonSchema)
767
+ * // {
768
+ * // type: "object",
769
+ * // properties: {
770
+ * // location: { type: "string" },
771
+ * // units: { type: "string", enum: ["celsius", "fahrenheit"] }
772
+ * // },
773
+ * // required: ["location"]
774
+ * // }
775
+ * ```
776
+ *
777
+ * @since 1.0.0
778
+ * @category Utilities
779
+ */
780
+ export declare const getJsonSchema: <Name extends string, Config extends {
781
+ readonly parameters: AnyStructSchema;
782
+ readonly success: Schema.Schema.Any;
783
+ readonly failure: Schema.Schema.All;
784
+ }>(tool: Tool<Name, Config>) => JsonSchema.JsonSchema7;
785
+ /**
786
+ * @since 1.0.0
787
+ * @category Utilities
788
+ */
789
+ export declare const getJsonSchemaFromSchemaAst: (ast: AST.AST) => JsonSchema.JsonSchema7;
790
+ declare const Title_base: Context.TagClass<Title, "@effect/ai/Tool/Title", string>;
791
+ /**
792
+ * Annotation for providing a human-readable title for tools.
793
+ *
794
+ * @example
795
+ * ```ts
796
+ * import { Tool } from "@effect/ai"
797
+ *
798
+ * const myTool = Tool.make("calculate_tip")
799
+ * .annotate(Tool.Title, "Tip Calculator")
800
+ * ```
801
+ *
802
+ * @since 1.0.0
803
+ * @category Annotations
804
+ */
805
+ export declare class Title extends Title_base {
806
+ }
807
+ declare const Readonly_base: Context.ReferenceClass<Readonly, "@effect/ai/Tool/Readonly", boolean>;
808
+ /**
809
+ * Annotation indicating whether a tool only reads data without making changes.
810
+ *
811
+ * @example
812
+ * ```ts
813
+ * import { Tool } from "@effect/ai"
814
+ *
815
+ * const readOnlyTool = Tool.make("get_user_info")
816
+ * .annotate(Tool.Readonly, true)
817
+ * ```
818
+ *
819
+ * @since 1.0.0
820
+ * @category Annotations
821
+ */
822
+ export declare class Readonly extends Readonly_base {
823
+ }
824
+ declare const Destructive_base: Context.ReferenceClass<Destructive, "@effect/ai/Tool/Destructive", boolean>;
825
+ /**
826
+ * Annotation indicating whether a tool performs destructive operations.
827
+ *
828
+ * @example
829
+ * ```ts
830
+ * import { Tool } from "@effect/ai"
831
+ *
832
+ * const safeTool = Tool.make("search_database")
833
+ * .annotate(Tool.Destructive, false)
834
+ * ```
835
+ *
836
+ * @since 1.0.0
837
+ * @category Annotations
838
+ */
839
+ export declare class Destructive extends Destructive_base {
840
+ }
841
+ declare const Idempotent_base: Context.ReferenceClass<Idempotent, "@effect/ai/Tool/Idempotent", boolean>;
842
+ /**
843
+ * Annotation indicating whether a tool can be called multiple times safely.
844
+ *
845
+ * @example
846
+ * ```ts
847
+ * import { Tool } from "@effect/ai"
848
+ *
849
+ * const idempotentTool = Tool.make("get_current_time")
850
+ * .annotate(Tool.Idempotent, true)
851
+ * ```
852
+ *
853
+ * @since 1.0.0
854
+ * @category Annotations
855
+ */
856
+ export declare class Idempotent extends Idempotent_base {
857
+ }
858
+ declare const OpenWorld_base: Context.ReferenceClass<OpenWorld, "@effect/ai/Tool/OpenWorld", boolean>;
859
+ /**
860
+ * Annotation indicating whether a tool can handle arbitrary external data.
861
+ *
862
+ * @example
863
+ * ```ts
864
+ * import { Tool } from "@effect/ai"
865
+ *
866
+ * const restrictedTool = Tool.make("internal_operation")
867
+ * .annotate(Tool.OpenWorld, false)
868
+ * ```
869
+ *
870
+ * @since 1.0.0
871
+ * @category Annotations
872
+ */
873
+ export declare class OpenWorld extends OpenWorld_base {
874
+ }
875
+ export {};
876
+ //# sourceMappingURL=Tool.d.ts.map