@effect/ai 0.26.0 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Chat/package.json +6 -0
- package/EmbeddingModel/package.json +6 -0
- package/IdGenerator/package.json +6 -0
- package/LanguageModel/package.json +6 -0
- package/Model/package.json +6 -0
- package/Prompt/package.json +6 -0
- package/Response/package.json +6 -0
- package/Telemetry/package.json +6 -0
- package/Tool/package.json +6 -0
- package/Toolkit/package.json +6 -0
- package/dist/cjs/AiError.js +575 -11
- package/dist/cjs/AiError.js.map +1 -1
- package/dist/cjs/Chat.js +302 -0
- package/dist/cjs/Chat.js.map +1 -0
- package/dist/cjs/EmbeddingModel.js +184 -0
- package/dist/cjs/EmbeddingModel.js.map +1 -0
- package/dist/cjs/IdGenerator.js +255 -0
- package/dist/cjs/IdGenerator.js.map +1 -0
- package/dist/cjs/LanguageModel.js +584 -0
- package/dist/cjs/LanguageModel.js.map +1 -0
- package/dist/cjs/McpServer.js +12 -4
- package/dist/cjs/McpServer.js.map +1 -1
- package/dist/cjs/Model.js +118 -0
- package/dist/cjs/Model.js.map +1 -0
- package/dist/cjs/Prompt.js +649 -0
- package/dist/cjs/Prompt.js.map +1 -0
- package/dist/cjs/Response.js +635 -0
- package/dist/cjs/Response.js.map +1 -0
- package/dist/cjs/Telemetry.js +176 -0
- package/dist/cjs/Telemetry.js.map +1 -0
- package/dist/cjs/Tokenizer.js +87 -8
- package/dist/cjs/Tokenizer.js.map +1 -1
- package/dist/cjs/Tool.js +556 -0
- package/dist/cjs/Tool.js.map +1 -0
- package/dist/cjs/Toolkit.js +279 -0
- package/dist/cjs/Toolkit.js.map +1 -0
- package/dist/cjs/index.js +21 -19
- package/dist/dts/AiError.d.ts +577 -9
- package/dist/dts/AiError.d.ts.map +1 -1
- package/dist/dts/Chat.d.ts +356 -0
- package/dist/dts/Chat.d.ts.map +1 -0
- package/dist/dts/EmbeddingModel.d.ts +153 -0
- package/dist/dts/EmbeddingModel.d.ts.map +1 -0
- package/dist/dts/IdGenerator.d.ts +272 -0
- package/dist/dts/IdGenerator.d.ts.map +1 -0
- package/dist/dts/LanguageModel.d.ts +458 -0
- package/dist/dts/LanguageModel.d.ts.map +1 -0
- package/dist/dts/McpSchema.d.ts +25 -25
- package/dist/dts/McpServer.d.ts +6 -4
- package/dist/dts/McpServer.d.ts.map +1 -1
- package/dist/dts/Model.d.ts +124 -0
- package/dist/dts/Model.d.ts.map +1 -0
- package/dist/dts/Prompt.d.ts +1119 -0
- package/dist/dts/Prompt.d.ts.map +1 -0
- package/dist/dts/Response.d.ts +1519 -0
- package/dist/dts/Response.d.ts.map +1 -0
- package/dist/dts/Telemetry.d.ts +520 -0
- package/dist/dts/Telemetry.d.ts.map +1 -0
- package/dist/dts/Tokenizer.d.ts +131 -13
- package/dist/dts/Tokenizer.d.ts.map +1 -1
- package/dist/dts/Tool.d.ts +876 -0
- package/dist/dts/Tool.d.ts.map +1 -0
- package/dist/dts/Toolkit.d.ts +310 -0
- package/dist/dts/Toolkit.d.ts.map +1 -0
- package/dist/dts/index.d.ts +498 -13
- package/dist/dts/index.d.ts.map +1 -1
- package/dist/esm/AiError.js +570 -10
- package/dist/esm/AiError.js.map +1 -1
- package/dist/esm/Chat.js +291 -0
- package/dist/esm/Chat.js.map +1 -0
- package/dist/esm/EmbeddingModel.js +173 -0
- package/dist/esm/EmbeddingModel.js.map +1 -0
- package/dist/esm/IdGenerator.js +245 -0
- package/dist/esm/IdGenerator.js.map +1 -0
- package/dist/esm/LanguageModel.js +572 -0
- package/dist/esm/LanguageModel.js.map +1 -0
- package/dist/esm/McpServer.js +12 -4
- package/dist/esm/McpServer.js.map +1 -1
- package/dist/esm/Model.js +108 -0
- package/dist/esm/Model.js.map +1 -0
- package/dist/esm/Prompt.js +633 -0
- package/dist/esm/Prompt.js.map +1 -0
- package/dist/esm/Response.js +619 -0
- package/dist/esm/Response.js.map +1 -0
- package/dist/esm/Telemetry.js +166 -0
- package/dist/esm/Telemetry.js.map +1 -0
- package/dist/esm/Tokenizer.js +87 -8
- package/dist/esm/Tokenizer.js.map +1 -1
- package/dist/esm/Tool.js +534 -0
- package/dist/esm/Tool.js.map +1 -0
- package/dist/esm/Toolkit.js +269 -0
- package/dist/esm/Toolkit.js.map +1 -0
- package/dist/esm/index.js +498 -13
- package/dist/esm/index.js.map +1 -1
- package/package.json +76 -68
- package/src/AiError.ts +739 -9
- package/src/Chat.ts +546 -0
- package/src/EmbeddingModel.ts +311 -0
- package/src/IdGenerator.ts +320 -0
- package/src/LanguageModel.ts +1074 -0
- package/src/McpServer.ts +337 -194
- package/src/Model.ts +155 -0
- package/src/Prompt.ts +1616 -0
- package/src/Response.ts +2131 -0
- package/src/Telemetry.ts +655 -0
- package/src/Tokenizer.ts +145 -24
- package/src/Tool.ts +1267 -0
- package/src/Toolkit.ts +516 -0
- package/src/index.ts +499 -13
- package/AiChat/package.json +0 -6
- package/AiEmbeddingModel/package.json +0 -6
- package/AiInput/package.json +0 -6
- package/AiLanguageModel/package.json +0 -6
- package/AiModel/package.json +0 -6
- package/AiResponse/package.json +0 -6
- package/AiTelemetry/package.json +0 -6
- package/AiTool/package.json +0 -6
- package/AiToolkit/package.json +0 -6
- package/dist/cjs/AiChat.js +0 -122
- package/dist/cjs/AiChat.js.map +0 -1
- package/dist/cjs/AiEmbeddingModel.js +0 -109
- package/dist/cjs/AiEmbeddingModel.js.map +0 -1
- package/dist/cjs/AiInput.js +0 -458
- package/dist/cjs/AiInput.js.map +0 -1
- package/dist/cjs/AiLanguageModel.js +0 -351
- package/dist/cjs/AiLanguageModel.js.map +0 -1
- package/dist/cjs/AiModel.js +0 -37
- package/dist/cjs/AiModel.js.map +0 -1
- package/dist/cjs/AiResponse.js +0 -681
- package/dist/cjs/AiResponse.js.map +0 -1
- package/dist/cjs/AiTelemetry.js +0 -58
- package/dist/cjs/AiTelemetry.js.map +0 -1
- package/dist/cjs/AiTool.js +0 -150
- package/dist/cjs/AiTool.js.map +0 -1
- package/dist/cjs/AiToolkit.js +0 -157
- package/dist/cjs/AiToolkit.js.map +0 -1
- package/dist/cjs/internal/common.js +0 -21
- package/dist/cjs/internal/common.js.map +0 -1
- package/dist/dts/AiChat.d.ts +0 -101
- package/dist/dts/AiChat.d.ts.map +0 -1
- package/dist/dts/AiEmbeddingModel.d.ts +0 -65
- package/dist/dts/AiEmbeddingModel.d.ts.map +0 -1
- package/dist/dts/AiInput.d.ts +0 -590
- package/dist/dts/AiInput.d.ts.map +0 -1
- package/dist/dts/AiLanguageModel.d.ts +0 -302
- package/dist/dts/AiLanguageModel.d.ts.map +0 -1
- package/dist/dts/AiModel.d.ts +0 -25
- package/dist/dts/AiModel.d.ts.map +0 -1
- package/dist/dts/AiResponse.d.ts +0 -863
- package/dist/dts/AiResponse.d.ts.map +0 -1
- package/dist/dts/AiTelemetry.d.ts +0 -242
- package/dist/dts/AiTelemetry.d.ts.map +0 -1
- package/dist/dts/AiTool.d.ts +0 -334
- package/dist/dts/AiTool.d.ts.map +0 -1
- package/dist/dts/AiToolkit.d.ts +0 -96
- package/dist/dts/AiToolkit.d.ts.map +0 -1
- package/dist/dts/internal/common.d.ts +0 -2
- package/dist/dts/internal/common.d.ts.map +0 -1
- package/dist/esm/AiChat.js +0 -111
- package/dist/esm/AiChat.js.map +0 -1
- package/dist/esm/AiEmbeddingModel.js +0 -98
- package/dist/esm/AiEmbeddingModel.js.map +0 -1
- package/dist/esm/AiInput.js +0 -433
- package/dist/esm/AiInput.js.map +0 -1
- package/dist/esm/AiLanguageModel.js +0 -340
- package/dist/esm/AiLanguageModel.js.map +0 -1
- package/dist/esm/AiModel.js +0 -29
- package/dist/esm/AiModel.js.map +0 -1
- package/dist/esm/AiResponse.js +0 -657
- package/dist/esm/AiResponse.js.map +0 -1
- package/dist/esm/AiTelemetry.js +0 -48
- package/dist/esm/AiTelemetry.js.map +0 -1
- package/dist/esm/AiTool.js +0 -134
- package/dist/esm/AiTool.js.map +0 -1
- package/dist/esm/AiToolkit.js +0 -147
- package/dist/esm/AiToolkit.js.map +0 -1
- package/dist/esm/internal/common.js +0 -14
- package/dist/esm/internal/common.js.map +0 -1
- package/src/AiChat.ts +0 -251
- package/src/AiEmbeddingModel.ts +0 -169
- package/src/AiInput.ts +0 -602
- package/src/AiLanguageModel.ts +0 -685
- package/src/AiModel.ts +0 -53
- package/src/AiResponse.ts +0 -986
- package/src/AiTelemetry.ts +0 -333
- package/src/AiTool.ts +0 -579
- package/src/AiToolkit.ts +0 -265
- package/src/internal/common.ts +0 -12
package/src/index.ts
CHANGED
|
@@ -1,64 +1,550 @@
|
|
|
1
1
|
/**
|
|
2
|
+
* The `AiError` module provides comprehensive error handling for AI operations.
|
|
3
|
+
*
|
|
4
|
+
* This module defines a hierarchy of error types that can occur when working
|
|
5
|
+
* with AI services, including HTTP request/response errors, input/output
|
|
6
|
+
* validation errors, and general runtime errors. All errors follow Effect's
|
|
7
|
+
* structured error patterns and provide detailed context for debugging.
|
|
8
|
+
*
|
|
9
|
+
* ## Error Types
|
|
10
|
+
*
|
|
11
|
+
* - **HttpRequestError**: Errors occurring during HTTP request processing
|
|
12
|
+
* - **HttpResponseError**: Errors occurring during HTTP response processing
|
|
13
|
+
* - **MalformedInput**: Errors when input data doesn't match expected format
|
|
14
|
+
* - **MalformedOutput**: Errors when output data can't be parsed or validated
|
|
15
|
+
* - **UnknownError**: Catch-all for unexpected runtime errors
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```ts
|
|
19
|
+
* import { AiError } from "@effect/ai"
|
|
20
|
+
* import { Effect, Match } from "effect"
|
|
21
|
+
*
|
|
22
|
+
* const handleAiError = Match.type<AiError.AiError>().pipe(
|
|
23
|
+
* Match.tag("HttpRequestError", (err) =>
|
|
24
|
+
* Effect.logError(`Request failed: ${err.message}`)
|
|
25
|
+
* ),
|
|
26
|
+
* Match.tag("HttpResponseError", (err) =>
|
|
27
|
+
* Effect.logError(`Response error (${err.response.status}): ${err.message}`)
|
|
28
|
+
* ),
|
|
29
|
+
* Match.tag("MalformedInput", (err) =>
|
|
30
|
+
* Effect.logError(`Invalid input: ${err.message}`)
|
|
31
|
+
* ),
|
|
32
|
+
* Match.tag("MalformedOutput", (err) =>
|
|
33
|
+
* Effect.logError(`Invalid output: ${err.message}`)
|
|
34
|
+
* ),
|
|
35
|
+
* Match.orElse((err) =>
|
|
36
|
+
* Effect.logError(`Unknown error: ${err.message}`)
|
|
37
|
+
* )
|
|
38
|
+
* )
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* import { AiError } from "@effect/ai"
|
|
44
|
+
* import { Effect, Option } from "effect"
|
|
45
|
+
*
|
|
46
|
+
* const aiOperation = Effect.gen(function* () {
|
|
47
|
+
* // Some AI operation that might fail
|
|
48
|
+
* return yield* new AiError.HttpRequestError({
|
|
49
|
+
* module: "OpenAI",
|
|
50
|
+
* method: "completion",
|
|
51
|
+
* reason: "Transport",
|
|
52
|
+
* request: {
|
|
53
|
+
* method: "POST",
|
|
54
|
+
* url: "https://api.openai.com/v1/completions",
|
|
55
|
+
* urlParams: [],
|
|
56
|
+
* hash: Option.none(),
|
|
57
|
+
* headers: { "Authorization": "Bearer ***" }
|
|
58
|
+
* }
|
|
59
|
+
* })
|
|
60
|
+
* })
|
|
61
|
+
*
|
|
62
|
+
* const program = aiOperation.pipe(
|
|
63
|
+
* Effect.catchTag("HttpRequestError", (error) => {
|
|
64
|
+
* console.log("Request failed:", error.message)
|
|
65
|
+
* return Effect.succeed("fallback response")
|
|
66
|
+
* })
|
|
67
|
+
* )
|
|
68
|
+
* ```
|
|
69
|
+
*
|
|
2
70
|
* @since 1.0.0
|
|
3
71
|
*/
|
|
4
|
-
export * as
|
|
72
|
+
export * as AiError from "./AiError.js"
|
|
5
73
|
|
|
6
74
|
/**
|
|
75
|
+
* The `Chat` module provides a stateful conversation interface for AI language
|
|
76
|
+
* models.
|
|
77
|
+
*
|
|
78
|
+
* This module enables persistent chat sessions that maintain conversation
|
|
79
|
+
* history, support tool calling, and offer both streaming and non-streaming
|
|
80
|
+
* text generation. It integrates seamlessly with the Effect AI ecosystem,
|
|
81
|
+
* providing type-safe conversational AI capabilities.
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```ts
|
|
85
|
+
* import { Chat, LanguageModel } from "@effect/ai"
|
|
86
|
+
* import { Effect, Layer } from "effect"
|
|
87
|
+
*
|
|
88
|
+
* // Create a new chat session
|
|
89
|
+
* const program = Effect.gen(function* () {
|
|
90
|
+
* const chat = yield* Chat.empty
|
|
91
|
+
*
|
|
92
|
+
* // Send a message and get response
|
|
93
|
+
* const response = yield* chat.generateText({
|
|
94
|
+
* prompt: "Hello! What can you help me with?"
|
|
95
|
+
* })
|
|
96
|
+
*
|
|
97
|
+
* console.log(response.content)
|
|
98
|
+
*
|
|
99
|
+
* return response
|
|
100
|
+
* })
|
|
101
|
+
* ```
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```ts
|
|
105
|
+
* import { Chat, LanguageModel } from "@effect/ai"
|
|
106
|
+
* import { Effect, Stream } from "effect"
|
|
107
|
+
*
|
|
108
|
+
* // Streaming chat with tool support
|
|
109
|
+
* const streamingChat = Effect.gen(function* () {
|
|
110
|
+
* const chat = yield* Chat.empty
|
|
111
|
+
*
|
|
112
|
+
* yield* chat.streamText({
|
|
113
|
+
* prompt: "Generate a creative story"
|
|
114
|
+
* }).pipe(Stream.runForEach((part) =>
|
|
115
|
+
* Effect.sync(() => console.log(part))
|
|
116
|
+
* ))
|
|
117
|
+
* })
|
|
118
|
+
* ```
|
|
119
|
+
*
|
|
7
120
|
* @since 1.0.0
|
|
8
121
|
*/
|
|
9
|
-
export * as
|
|
122
|
+
export * as Chat from "./Chat.js"
|
|
10
123
|
|
|
11
124
|
/**
|
|
125
|
+
* The `EmbeddingModel` module provides vector embeddings for text using AI
|
|
126
|
+
* models.
|
|
127
|
+
*
|
|
128
|
+
* This module enables efficient conversion of text into high-dimensional vector
|
|
129
|
+
* representations that capture semantic meaning. It supports batching, caching,
|
|
130
|
+
* and request optimization for production use cases like semantic search,
|
|
131
|
+
* document similarity, and clustering.
|
|
132
|
+
*
|
|
133
|
+
* @example
|
|
134
|
+
* ```ts
|
|
135
|
+
* import { EmbeddingModel } from "@effect/ai"
|
|
136
|
+
* import { Effect } from "effect"
|
|
137
|
+
*
|
|
138
|
+
* // Basic embedding usage
|
|
139
|
+
* const program = Effect.gen(function* () {
|
|
140
|
+
* const embedding = yield* EmbeddingModel.EmbeddingModel
|
|
141
|
+
*
|
|
142
|
+
* const vector = yield* embedding.embed("Hello world!")
|
|
143
|
+
* console.log(vector) // [0.123, -0.456, 0.789, ...]
|
|
144
|
+
*
|
|
145
|
+
* return vector
|
|
146
|
+
* })
|
|
147
|
+
* ```
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* ```ts
|
|
151
|
+
* import { EmbeddingModel } from "@effect/ai"
|
|
152
|
+
* import { Effect, Duration } from "effect"
|
|
153
|
+
*
|
|
154
|
+
* declare const generateVectorFor: (text: string) => Array<number>
|
|
155
|
+
*
|
|
156
|
+
* // Create embedding service with batching and caching
|
|
157
|
+
* const embeddingService = EmbeddingModel.make({
|
|
158
|
+
* embedMany: (texts) => Effect.succeed(
|
|
159
|
+
* texts.map((text, index) => ({
|
|
160
|
+
* index,
|
|
161
|
+
* embeddings: generateVectorFor(text)
|
|
162
|
+
* }))
|
|
163
|
+
* ),
|
|
164
|
+
* maxBatchSize: 50,
|
|
165
|
+
* cache: {
|
|
166
|
+
* capacity: 1000,
|
|
167
|
+
* timeToLive: Duration.minutes(30)
|
|
168
|
+
* }
|
|
169
|
+
* })
|
|
170
|
+
* ```
|
|
171
|
+
*
|
|
12
172
|
* @since 1.0.0
|
|
13
173
|
*/
|
|
14
|
-
export * as
|
|
174
|
+
export * as EmbeddingModel from "./EmbeddingModel.js"
|
|
15
175
|
|
|
16
176
|
/**
|
|
177
|
+
* The `IdGenerator` module provides a pluggable system for generating unique identifiers
|
|
178
|
+
* for tool calls and other items in the Effect AI SDKs.
|
|
179
|
+
*
|
|
180
|
+
* This module offers a flexible and configurable approach to ID generation, supporting
|
|
181
|
+
* custom alphabets, prefixes, separators, and sizes.
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```ts
|
|
185
|
+
* import { IdGenerator } from "@effect/ai"
|
|
186
|
+
* import { Effect, Layer } from "effect"
|
|
187
|
+
*
|
|
188
|
+
* // Using the default ID generator
|
|
189
|
+
* const program = Effect.gen(function* () {
|
|
190
|
+
* const idGen = yield* IdGenerator.IdGenerator
|
|
191
|
+
* const toolCallId = yield* idGen.generateId()
|
|
192
|
+
* console.log(toolCallId) // "id_A7xK9mP2qR5tY8uV"
|
|
193
|
+
* return toolCallId
|
|
194
|
+
* }).pipe(
|
|
195
|
+
* Effect.provide(Layer.succeed(
|
|
196
|
+
* IdGenerator.IdGenerator,
|
|
197
|
+
* IdGenerator.defaultIdGenerator
|
|
198
|
+
* ))
|
|
199
|
+
* )
|
|
200
|
+
* ```
|
|
201
|
+
*
|
|
202
|
+
* @example
|
|
203
|
+
* ```ts
|
|
204
|
+
* import { IdGenerator } from "@effect/ai"
|
|
205
|
+
* import { Effect, Layer } from "effect"
|
|
206
|
+
*
|
|
207
|
+
* // Creating a custom ID generator for AI tool calls
|
|
208
|
+
* const customLayer = IdGenerator.layer({
|
|
209
|
+
* alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",
|
|
210
|
+
* prefix: "tool_call",
|
|
211
|
+
* separator: "-",
|
|
212
|
+
* size: 12
|
|
213
|
+
* })
|
|
214
|
+
*
|
|
215
|
+
* const program = Effect.gen(function* () {
|
|
216
|
+
* const idGen = yield* IdGenerator.IdGenerator
|
|
217
|
+
* const id = yield* idGen.generateId()
|
|
218
|
+
* console.log(id) // "tool_call-A7XK9MP2QR5T"
|
|
219
|
+
* return id
|
|
220
|
+
* }).pipe(
|
|
221
|
+
* Effect.provide(customLayer)
|
|
222
|
+
* )
|
|
223
|
+
* ```
|
|
224
|
+
*
|
|
17
225
|
* @since 1.0.0
|
|
18
226
|
*/
|
|
19
|
-
export * as
|
|
227
|
+
export * as IdGenerator from "./IdGenerator.js"
|
|
20
228
|
|
|
21
229
|
/**
|
|
230
|
+
* The `LanguageModel` module provides AI text generation capabilities with tool
|
|
231
|
+
* calling support.
|
|
232
|
+
*
|
|
233
|
+
* This module offers a comprehensive interface for interacting with large
|
|
234
|
+
* language models, supporting both streaming and non-streaming text generation,
|
|
235
|
+
* structured output generation, and tool calling functionality. It provides a
|
|
236
|
+
* unified API that can be implemented by different AI providers while
|
|
237
|
+
* maintaining type safety and effect management.
|
|
238
|
+
*
|
|
239
|
+
* @example
|
|
240
|
+
* ```ts
|
|
241
|
+
* import { LanguageModel } from "@effect/ai"
|
|
242
|
+
* import { Effect } from "effect"
|
|
243
|
+
*
|
|
244
|
+
* // Basic text generation
|
|
245
|
+
* const program = Effect.gen(function* () {
|
|
246
|
+
* const response = yield* LanguageModel.generateText({
|
|
247
|
+
* prompt: "Explain quantum computing"
|
|
248
|
+
* })
|
|
249
|
+
*
|
|
250
|
+
* console.log(response.text)
|
|
251
|
+
*
|
|
252
|
+
* return response
|
|
253
|
+
* })
|
|
254
|
+
* ```
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* ```ts
|
|
258
|
+
* import { LanguageModel } from "@effect/ai"
|
|
259
|
+
* import { Effect, Schema } from "effect"
|
|
260
|
+
*
|
|
261
|
+
* // Structured output generation
|
|
262
|
+
* const ContactSchema = Schema.Struct({
|
|
263
|
+
* name: Schema.String,
|
|
264
|
+
* email: Schema.String
|
|
265
|
+
* })
|
|
266
|
+
*
|
|
267
|
+
* const extractContact = Effect.gen(function* () {
|
|
268
|
+
* const response = yield* LanguageModel.generateObject({
|
|
269
|
+
* prompt: "Extract contact: John Doe, john@example.com",
|
|
270
|
+
* schema: ContactSchema
|
|
271
|
+
* })
|
|
272
|
+
*
|
|
273
|
+
* return response.value
|
|
274
|
+
* })
|
|
275
|
+
* ```
|
|
276
|
+
*
|
|
22
277
|
* @since 1.0.0
|
|
23
278
|
*/
|
|
24
|
-
export * as
|
|
279
|
+
export * as LanguageModel from "./LanguageModel.js"
|
|
25
280
|
|
|
26
281
|
/**
|
|
27
282
|
* @since 1.0.0
|
|
28
283
|
*/
|
|
29
|
-
export * as
|
|
284
|
+
export * as McpSchema from "./McpSchema.js"
|
|
30
285
|
|
|
31
286
|
/**
|
|
32
287
|
* @since 1.0.0
|
|
33
288
|
*/
|
|
34
|
-
export * as
|
|
289
|
+
export * as McpServer from "./McpServer.js"
|
|
35
290
|
|
|
36
291
|
/**
|
|
292
|
+
* The `Model` module provides a unified interface for AI service providers.
|
|
293
|
+
*
|
|
294
|
+
* This module enables creation of provider-specific AI models that can be used
|
|
295
|
+
* interchangeably within the Effect AI ecosystem. It combines Layer
|
|
296
|
+
* functionality with provider identification, allowing for seamless switching
|
|
297
|
+
* between different AI service providers while maintaining type safety.
|
|
298
|
+
*
|
|
299
|
+
* @example
|
|
300
|
+
* ```ts
|
|
301
|
+
* import { Model, LanguageModel } from "@effect/ai"
|
|
302
|
+
* import { Effect, Layer } from "effect"
|
|
303
|
+
*
|
|
304
|
+
* declare const myAnthropicLayer: Layer.Layer<LanguageModel.LanguageModel>
|
|
305
|
+
*
|
|
306
|
+
* const anthropicModel = Model.make("anthropic", myAnthropicLayer)
|
|
307
|
+
*
|
|
308
|
+
* const program = Effect.gen(function* () {
|
|
309
|
+
* const response = yield* LanguageModel.generateText({
|
|
310
|
+
* prompt: "Hello, world!"
|
|
311
|
+
* })
|
|
312
|
+
* return response.text
|
|
313
|
+
* }).pipe(
|
|
314
|
+
* Effect.provide(anthropicModel)
|
|
315
|
+
* )
|
|
316
|
+
* ```
|
|
317
|
+
*
|
|
37
318
|
* @since 1.0.0
|
|
38
319
|
*/
|
|
39
|
-
export * as
|
|
320
|
+
export * as Model from "./Model.js"
|
|
40
321
|
|
|
41
322
|
/**
|
|
323
|
+
* The `Prompt` module provides several data structures to simplify creating and
|
|
324
|
+
* combining prompts.
|
|
325
|
+
*
|
|
326
|
+
* This module defines the complete structure of a conversation with a large
|
|
327
|
+
* language model, including messages, content parts, and provider-specific
|
|
328
|
+
* options. It supports rich content types like text, files, tool calls, and
|
|
329
|
+
* reasoning.
|
|
330
|
+
*
|
|
331
|
+
* @example
|
|
332
|
+
* ```ts
|
|
333
|
+
* import { Prompt } from "@effect/ai"
|
|
334
|
+
*
|
|
335
|
+
* // Create a structured conversation
|
|
336
|
+
* const conversation = Prompt.make([
|
|
337
|
+
* {
|
|
338
|
+
* role: "system",
|
|
339
|
+
* content: "You are a helpful assistant specialized in mathematics."
|
|
340
|
+
* },
|
|
341
|
+
* {
|
|
342
|
+
* role: "user",
|
|
343
|
+
* content: [{
|
|
344
|
+
* type: "text",
|
|
345
|
+
* text: "What is the derivative of x²?"
|
|
346
|
+
* }]
|
|
347
|
+
* },
|
|
348
|
+
* {
|
|
349
|
+
* role: "assistant",
|
|
350
|
+
* content: [{
|
|
351
|
+
* type: "text",
|
|
352
|
+
* text: "The derivative of x² is 2x."
|
|
353
|
+
* }]
|
|
354
|
+
* }
|
|
355
|
+
* ])
|
|
356
|
+
* ```
|
|
357
|
+
*
|
|
358
|
+
* @example
|
|
359
|
+
* ```ts
|
|
360
|
+
* import { Prompt } from "@effect/ai"
|
|
361
|
+
*
|
|
362
|
+
* // Merge multiple prompts
|
|
363
|
+
* const systemPrompt = Prompt.make([{
|
|
364
|
+
* role: "system",
|
|
365
|
+
* content: "You are a coding assistant."
|
|
366
|
+
* }])
|
|
367
|
+
*
|
|
368
|
+
* const userPrompt = Prompt.make("Help me write a function")
|
|
369
|
+
*
|
|
370
|
+
* const combined = Prompt.merge(systemPrompt, userPrompt)
|
|
371
|
+
* ```
|
|
372
|
+
*
|
|
42
373
|
* @since 1.0.0
|
|
43
374
|
*/
|
|
44
|
-
export * as
|
|
375
|
+
export * as Prompt from "./Prompt.js"
|
|
45
376
|
|
|
46
377
|
/**
|
|
378
|
+
* The `Response` module provides data structures to represent responses from
|
|
379
|
+
* large language models.
|
|
380
|
+
*
|
|
381
|
+
* This module defines the complete structure of AI model responses, including
|
|
382
|
+
* various content parts for text, reasoning, tool calls, files, and metadata,
|
|
383
|
+
* supporting both streaming and non-streaming responses.
|
|
384
|
+
*
|
|
385
|
+
* @example
|
|
386
|
+
* ```ts
|
|
387
|
+
* import { Response } from "@effect/ai"
|
|
388
|
+
*
|
|
389
|
+
* // Create a simple text response part
|
|
390
|
+
* const textResponse = Response.makePart("text", {
|
|
391
|
+
* text: "The weather is sunny today!"
|
|
392
|
+
* })
|
|
393
|
+
*
|
|
394
|
+
* // Create a tool call response part
|
|
395
|
+
* const toolCallResponse = Response.makePart("tool-call", {
|
|
396
|
+
* id: "call_123",
|
|
397
|
+
* name: "get_weather",
|
|
398
|
+
* params: { city: "San Francisco" },
|
|
399
|
+
* providerExecuted: false
|
|
400
|
+
* })
|
|
401
|
+
* ```
|
|
402
|
+
*
|
|
47
403
|
* @since 1.0.0
|
|
48
404
|
*/
|
|
49
|
-
export * as
|
|
405
|
+
export * as Response from "./Response.js"
|
|
50
406
|
|
|
51
407
|
/**
|
|
408
|
+
* The `Telemetry` module provides OpenTelemetry integration for operations
|
|
409
|
+
* performed against a large language model provider by defining telemetry
|
|
410
|
+
* attributes and utilities that follow the OpenTelemetry GenAI semantic
|
|
411
|
+
* conventions.
|
|
412
|
+
*
|
|
413
|
+
* @example
|
|
414
|
+
* ```ts
|
|
415
|
+
* import { Telemetry } from "@effect/ai"
|
|
416
|
+
* import { Effect } from "effect"
|
|
417
|
+
*
|
|
418
|
+
* // Add telemetry attributes to a span
|
|
419
|
+
* const addTelemetry = Effect.gen(function* () {
|
|
420
|
+
* const span = yield* Effect.currentSpan
|
|
421
|
+
*
|
|
422
|
+
* Telemetry.addGenAIAnnotations(span, {
|
|
423
|
+
* system: "openai",
|
|
424
|
+
* operation: { name: "chat" },
|
|
425
|
+
* request: {
|
|
426
|
+
* model: "gpt-4",
|
|
427
|
+
* temperature: 0.7,
|
|
428
|
+
* maxTokens: 1000
|
|
429
|
+
* },
|
|
430
|
+
* usage: {
|
|
431
|
+
* inputTokens: 100,
|
|
432
|
+
* outputTokens: 50
|
|
433
|
+
* }
|
|
434
|
+
* })
|
|
435
|
+
* })
|
|
436
|
+
* ```
|
|
437
|
+
*
|
|
52
438
|
* @since 1.0.0
|
|
53
439
|
*/
|
|
54
|
-
export * as
|
|
440
|
+
export * as Telemetry from "./Telemetry.js"
|
|
55
441
|
|
|
56
442
|
/**
|
|
443
|
+
* The `Tokenizer` module provides tokenization and text truncation capabilities
|
|
444
|
+
* for large language model text processing workflows.
|
|
445
|
+
*
|
|
446
|
+
* This module offers services for converting text into tokens and truncating
|
|
447
|
+
* prompts based on token limits, essential for managing context length
|
|
448
|
+
* constraints in large language models.
|
|
449
|
+
*
|
|
450
|
+
* @example
|
|
451
|
+
* ```ts
|
|
452
|
+
* import { Tokenizer, Prompt } from "@effect/ai"
|
|
453
|
+
* import { Effect } from "effect"
|
|
454
|
+
*
|
|
455
|
+
* const tokenizeText = Effect.gen(function* () {
|
|
456
|
+
* const tokenizer = yield* Tokenizer.Tokenizer
|
|
457
|
+
* const tokens = yield* tokenizer.tokenize("Hello, world!")
|
|
458
|
+
* console.log(`Token count: ${tokens.length}`)
|
|
459
|
+
* return tokens
|
|
460
|
+
* })
|
|
461
|
+
* ```
|
|
462
|
+
*
|
|
463
|
+
* @example
|
|
464
|
+
* ```ts
|
|
465
|
+
* import { Tokenizer, Prompt } from "@effect/ai"
|
|
466
|
+
* import { Effect } from "effect"
|
|
467
|
+
*
|
|
468
|
+
* // Truncate a prompt to fit within token limits
|
|
469
|
+
* const truncatePrompt = Effect.gen(function* () {
|
|
470
|
+
* const tokenizer = yield* Tokenizer.Tokenizer
|
|
471
|
+
* const longPrompt = "This is a very long prompt..."
|
|
472
|
+
* const truncated = yield* tokenizer.truncate(longPrompt, 100)
|
|
473
|
+
* return truncated
|
|
474
|
+
* })
|
|
475
|
+
* ```
|
|
476
|
+
*
|
|
57
477
|
* @since 1.0.0
|
|
58
478
|
*/
|
|
59
|
-
export * as
|
|
479
|
+
export * as Tokenizer from "./Tokenizer.js"
|
|
60
480
|
|
|
61
481
|
/**
|
|
482
|
+
* The `Tool` module provides functionality for defining and managing tools
|
|
483
|
+
* that language models can call to augment their capabilities.
|
|
484
|
+
*
|
|
485
|
+
* This module enables creation of both user-defined and provider-defined tools,
|
|
486
|
+
* with full schema validation, type safety, and handler support. Tools allow
|
|
487
|
+
* AI models to perform actions like searching databases, calling APIs, or
|
|
488
|
+
* executing code within your application context.
|
|
489
|
+
*
|
|
490
|
+
* @example
|
|
491
|
+
* ```ts
|
|
492
|
+
* import { Tool } from "@effect/ai"
|
|
493
|
+
* import { Schema } from "effect"
|
|
494
|
+
*
|
|
495
|
+
* // Define a simple calculator tool
|
|
496
|
+
* const Calculator = Tool.make("Calculator", {
|
|
497
|
+
* description: "Performs basic arithmetic operations",
|
|
498
|
+
* parameters: {
|
|
499
|
+
* operation: Schema.Literal("add", "subtract", "multiply", "divide"),
|
|
500
|
+
* a: Schema.Number,
|
|
501
|
+
* b: Schema.Number
|
|
502
|
+
* },
|
|
503
|
+
* success: Schema.Number
|
|
504
|
+
* })
|
|
505
|
+
* ```
|
|
506
|
+
*
|
|
62
507
|
* @since 1.0.0
|
|
63
508
|
*/
|
|
64
|
-
export * as
|
|
509
|
+
export * as Tool from "./Tool.js"
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* The `Toolkit` module allows for creating and implementing a collection of
|
|
513
|
+
* `Tool`s which can be used to enhance the capabilities of a large language
|
|
514
|
+
* model beyond simple text generation.
|
|
515
|
+
*
|
|
516
|
+
* @example
|
|
517
|
+
* ```ts
|
|
518
|
+
* import { Toolkit, Tool } from "@effect/ai"
|
|
519
|
+
* import { Effect, Schema } from "effect"
|
|
520
|
+
*
|
|
521
|
+
* // Create individual tools
|
|
522
|
+
* const GetCurrentTime = Tool.make("GetCurrentTime", {
|
|
523
|
+
* description: "Get the current timestamp",
|
|
524
|
+
* success: Schema.Number
|
|
525
|
+
* })
|
|
526
|
+
*
|
|
527
|
+
* const GetWeather = Tool.make("GetWeather", {
|
|
528
|
+
* description: "Get weather for a location",
|
|
529
|
+
* parameters: { location: Schema.String },
|
|
530
|
+
* success: Schema.Struct({
|
|
531
|
+
* temperature: Schema.Number,
|
|
532
|
+
* condition: Schema.String
|
|
533
|
+
* })
|
|
534
|
+
* })
|
|
535
|
+
*
|
|
536
|
+
* // Create a toolkit with multiple tools
|
|
537
|
+
* const MyToolkit = Toolkit.make(GetCurrentTime, GetWeather)
|
|
538
|
+
*
|
|
539
|
+
* const MyToolkitLayer = MyToolkit.toLayer({
|
|
540
|
+
* GetCurrentTime: () => Effect.succeed(Date.now()),
|
|
541
|
+
* GetWeather: ({ location }) => Effect.succeed({
|
|
542
|
+
* temperature: 72,
|
|
543
|
+
* condition: "sunny"
|
|
544
|
+
* })
|
|
545
|
+
* })
|
|
546
|
+
* ```
|
|
547
|
+
*
|
|
548
|
+
* @since 1.0.0
|
|
549
|
+
*/
|
|
550
|
+
export * as Toolkit from "./Toolkit.js"
|
package/AiChat/package.json
DELETED
package/AiInput/package.json
DELETED
package/AiModel/package.json
DELETED
package/AiResponse/package.json
DELETED
package/AiTelemetry/package.json
DELETED
package/AiTool/package.json
DELETED