@effect/ai
0.37.0
Patch Changes
- Updated dependencies [
fffdee0]:- effect@3.22.0
- @effect/experimental@0.61.0
- @effect/platform@0.97.0
- @effect/rpc@0.76.0
0.36.0
Minor Changes
Patch Changes
0.35.0
Patch Changes
- Updated dependencies [
f7bb09b,bd7552a,ad1a7eb,0d32048,0d32048]:- effect@3.21.0
- @effect/experimental@0.60.0
- @effect/platform@0.96.0
- @effect/rpc@0.75.0
0.34.0
Patch Changes
-
#6094
88a5260Thanks @IMax153! - Remove superfluous / defensive check from tool call json schema generation -
#6101
cf74940Thanks @IMax153! - Prevent schema validation when directly constructing anAiError.HttpRequestError/AiError.HttpResponseError -
Updated dependencies [
fc82e81,82996bc,4d97a61,f6b0960,8798a84]:- effect@3.20.0
- @effect/experimental@0.59.0
- @effect/platform@0.95.0
- @effect/rpc@0.74.0
0.33.2
Patch Changes
- #5944
f21f034Thanks @IMax153! - Fix Prompt.fromResponseParts when input contains a provider executed tool
0.33.1
Patch Changes
-
#5931
ba9e790Thanks @IMax153! - Fix the accumulation logic for response parts in the AIChatmodule -
Updated dependencies [
65e9e35,ee69cd7,488d6e8]:- @effect/platform@0.94.1
- effect@3.19.14
0.33.0
Patch Changes
- Updated dependencies [
77eeb86,ff7053f,287c32c]:- effect@3.19.13
- @effect/platform@0.94.0
- @effect/experimental@0.58.0
- @effect/rpc@0.73.0
0.32.1
Patch Changes
-
#5685
fb53370Thanks @janglad! - Fix Response.Part, AllParts, StreamPart not inferring Schema properly if toolkit is WithHandler -
Updated dependencies [
7d28a90]:- effect@3.19.3
0.32.0
Patch Changes
- Updated dependencies [
3c15d5f,3863fa8,2a03c76,24a1685]:- effect@3.19.0
- @effect/rpc@0.72.0
- @effect/platform@0.93.0
- @effect/experimental@0.57.0
0.31.1
Patch Changes
- #5634
a5d0f2bThanks @IMax153! - Ensure that tool calls are emitted as soon as possible when streaming
0.31.0
Minor Changes
-
#5621
4c3bdfbThanks @IMax153! - RemoveEither/EitherEncodedfrom tool call results.Specifically, the encoding of tool call results as an
Either/EitherEncodedhas been removed and is replaced by encoding the tool call success / failure directly into theresultproperty.To allow type-safe discrimination between a tool call result which was a success vs. one that was a failure, an
isFailureproperty has also been added to the"tool-result"part. IfisFailureistrue, then the tool call handler result was an error.import * as AnthropicClient from "@effect/ai-anthropic/AnthropicClient"import * as AnthropicLanguageModel from "@effect/ai-anthropic/AnthropicLanguageModel"import * as LanguageModel from "@effect/ai/LanguageModel"import * as Tool from "@effect/ai/Tool"import * as Toolkit from "@effect/ai/Toolkit"import * as NodeHttpClient from "@effect/platform-node/NodeHttpClient"import { Config, Effect, Layer, Schema, Stream } from "effect"const Claude = AnthropicLanguageModel.model("claude-4-sonnet-20250514")const MyTool = Tool.make("MyTool", {description: "An example of a tool with success and failure types",failureMode: "return", // Return errors in the responseparameters: { bar: Schema.Number },success: Schema.Number,failure: Schema.Struct({ reason: Schema.Literal("reason-1", "reason-2") })})const MyToolkit = Toolkit.make(MyTool)const MyToolkitLayer = MyToolkit.toLayer({MyTool: () => Effect.succeed(42)})const program = LanguageModel.streamText({prompt: "Tell me about the meaning of life",toolkit: MyToolkit}).pipe(Stream.runForEach((part) => {if (part.type === "tool-result" && part.name === "MyTool") {// The `isFailure` property can be used to discriminate whether the result// of a tool call is a success or a failureif (part.isFailure) {part.result// ^? { readonly reason: "reason-1" | "reason-2"; }} else {part.result// ^? number}}return Effect.void}),Effect.provide(Claude))const Anthropic = AnthropicClient.layerConfig({apiKey: Config.redacted("ANTHROPIC_API_KEY")}).pipe(Layer.provide(NodeHttpClient.layerUndici))program.pipe(Effect.provide([Anthropic, MyToolkitLayer]), Effect.runPromise)
0.30.0
Minor Changes
-
#5614
c63e658Thanks @IMax153! - Previously, tool call handler errors were always raised as an expected error in the EffectEchannel at the point of execution of the tool call handler (i.e. when agenerate*method is invoked on aLanguageModel).With this PR, the end user now has control over whether tool call handler errors should be raised as an Effect error, or returned by the SDK to allow, for example, sending that error information to another application.
Tool Call Specification
The
Tool.makeandTool.providerDefinedconstructors now take an extra optional parameter calledfailureMode, which can be set to either"error"or"return".import { Tool } from "@effect/ai"import { Schema } from "effect"const MyTool = Tool.make("MyTool", {description: "My special tool",failureMode: "return" // "error" (default) or "return"parameters: {myParam: Schema.String},success: Schema.Struct({mySuccess: Schema.String}),failure: Schema.Struct({myFailure: Schema.String})})The semantics of
failureModeare as follows:- If set to
"error"(the default), errors that occur during tool call handler execution will be returned in the error channel of the calling effect - If set to
"return", errors that occur during tool call handler execution will be captured and returned as part of the tool call result
Response - Tool Result Parts
The
resultfield of a"tool-result"part of a large language model provider response is now represented as anEither.- If the
resultis aLeft, theresultwill be thefailurespecified in the tool call specification - If the
resultis aRight, theresultwill be thesuccessspecified in the tool call specification
This is only relevant if the end user sets
failureModeto"return". If set to"error"(the default), then theresultproperty will always be aRightwith the successful result of the tool call handler.Similarly the
encodedResultfield of a"tool-result"part will be represented as anEitherEncoded, where:{ _tag: "Left", left: <failure> }represents a tool call handler failure{ _tag: "Right", right: <success> }represents a tool call handler success
Prompt - Tool Result Parts
The
resultfield of a"tool-result"part of a prompt will now only accept anEitherEncodedas specified above. - If set to
Patch Changes
- Updated dependencies [
6ae2f5d]:- effect@3.18.4
0.29.1
Patch Changes
- #5587
d628c15Thanks @IMax153! - Ensure response schema includes toolkit tools even when tool call resolution is disabled
0.29.0
Minor Changes
- #5302
f8b93acThanks @timurrakhimzhan! - Added “oneOf” property for generateText and streamText “toolChoice” to be able to pick a subset of tools, which are going to be passed to LLM
Patch Changes
- Updated dependencies [
1c6ab74,70fe803,c296e32,a098ddf]:- effect@3.18.0
- @effect/platform@0.92.0
- @effect/experimental@0.56.0
- @effect/rpc@0.71.0
0.28.4
Patch Changes
-
#5570
bc83015Thanks @IMax153! - Redact headers where possible in AiError -
#5570
bc83015Thanks @IMax153! - Fix return type ofResponse.AllParts -
#5568
6c2d586Thanks @IMax153! - Support expiration of persisted chats via time to live
0.28.3
Patch Changes
-
#5566
ab57b7aThanks @IMax153! - Support generation of persistence identifiers for ai chat -
#5540
5b13482Thanks @IMax153! - ensure decoded response metadata is always set -
#5566
ab57b7aThanks @IMax153! - fix prompt construction from response parts
0.28.2
Patch Changes
-
#5554
800ab2eThanks @IMax153! - AcceptPrompt.RawInputinPrompt.merge -
#5554
800ab2eThanks @IMax153! - AddPrompt.setSystem,Prompt.prependSystem, andPrompt.appendSystemmethods -
#5554
800ab2eThanks @IMax153! - Improve the information available to the user following a model response error -
#5554
800ab2eThanks @IMax153! - Allow raw user and assistant prompt messages to accept plain strings -
#5554
800ab2eThanks @IMax153! - Fix leakage of provider-defined tool handler requirements
0.28.1
Patch Changes
0.28.0
Patch Changes
- Updated dependencies [
d4d86a8]:- @effect/platform@0.91.0
- @effect/rpc@0.70.0
- @effect/experimental@0.55.0
0.27.1
Patch Changes
0.27.0
Minor Changes
-
#5469
42b914aThanks @IMax153! - Refactor the Effect AI SDK and associated provider packagesThis pull request contains a complete refactor of the base Effect AI SDK package as well as the associated provider integration packages to improve flexibility and enhance ergonomics. Major changes are outlined below.
Modules
All modules in the base Effect AI SDK have had the leading
Aiprefix dropped from their name (except for theAiErrormodule).For example, the
AiLanguageModelmodule is now theLanguageModelmodule.In addition, the
AiInputmodule has been renamed to thePromptmodule.Prompts
The
Promptmodule has been completely redesigned with flexibility in mind.The
Promptmodule now supports building a prompt using either the constructors exposed from thePromptmodule, or using raw prompt content parts / messages, which should be familiar to those coming from other AI SDKs.In addition, the
systemoption has been removed from allLanguageModelmethods and must now be provided as part of the prompt.Prompt Constructors
import { LanguageModel, Prompt } from "@effect/ai"const textPart = Prompt.makePart("text", {text: "What is machine learning?"})const userMessage = Prompt.makeMessage("user", {content: [textPart]})const systemMessage = Prompt.makeMessage("system", {content: "You are an expert in machine learning"})const program = LanguageModel.generateText({prompt: Prompt.fromMessages([systemMessage, userMessage])})Raw Prompt Input
import { LanguageModel } from "@effect/ai"const program = LanguageModel.generateText({prompt: [{ role: "system", content: "You are an expert in machine learning" },{role: "user",content: [{ type: "text", text: "What is machine learning?" }]}]})NOTE: Providing a plain string as a prompt is still supported, and will be converted internally into a user message with a single text content part.
Provider-Specific Options
To support specification of provider-specific options when interacting with large language model providers, support has been added for adding provider-specific options to the parts of a
Prompt.import { LanguageModel } from "@effect/ai"import { AnthropicLanguageModel } from "@effect/ai-anthropic"const Claude = AnthropicLanguageModel.model("claude-sonnet-4-20250514")const program = LanguageModel.generateText({prompt: [{role: "user",content: [{ type: "text", text: "What is machine learning?" }],options: {anthropic: { cacheControl: { type: "ephemeral", ttl: "1h" } }}}]}).pipe(Effect.provide(Claude))Responses
The
Responsemodule has also been completely redesigned to support a wider variety of response parts, particularly when streaming.Streaming Responses
When streaming text via the
LanguageModel.streamTextmethod, you will now receive a stream of content parts instead of a stream of responses, which should make it much simpler to filter down the stream to the parts you are interested in.In addition, additional content parts will be present in the stream to allow you to track, for example, when a text content part starts / ends.
Tool Calls / Tool Call Results
The decoded parts of a
Response(as returned by the methods ofLanguageModel) are now fully type-safe on tool calls / tool call results. Filtering the content parts of a response to tool calls will narrow the type of the tool callparamsbased on the toolname. Similarly, filtering the response to tool call results will narrow the type of the tool callresultbased on the toolname.import { LanguageModel, Tool, Toolkit } from "@effect/ai"import { Effect, Schema } from "effect"const DadJokeTool = Tool.make("DadJokeTool", {parameters: { topic: Schema.String },success: Schema.Struct({ joke: Schema.String })})const FooTool = Tool.make("FooTool", {parameters: { foo: Schema.Number },success: Schema.Struct({ bar: Schema.Boolean })})const MyToolkit = Toolkit.make(DadJokeTool, FooTool)const program = Effect.gen(function* () {const response = yield* LanguageModel.generateText({prompt: "Tell me a dad joke",toolkit: MyToolkit})for (const toolCall of response.toolCalls) {if (toolCall.name === "DadJokeTool") {// ^? "DadJokeTool" | "FooTool"toolCall.params// ^? { readonly topic: string }}}for (const toolResult of response.toolResults) {if (toolResult.name === "DadJokeTool") {// ^? "DadJokeTool" | "FooTool"toolResult.result// ^? { readonly joke: string }}}})Provider Metadata
As with provider-specific options, provider-specific metadata is now returned as part of the response from the large language model provider.
import { LanguageModel } from "@effect/ai"import { AnthropicLanguageModel } from "@effect/ai-anthropic"import { Effect } from "effect"const Claude = AnthropicLanguageModel.model("claude-4-sonnet-20250514")const program = Effect.gen(function* () {const response = yield* LanguageModel.generateText({prompt: "What is the meaning of life?"})for (const part of response.content) {// When metadata **is not** defined for a content part, accessing the// provider's key on the part's metadata will return an untyped recordif (part.type === "text") {const metadata = part.metadata.anthropic// ^? { readonly [x: string]: unknown } | undefined}// When metadata **is** defined for a content part, accessing the// provider's key on the part's metadata will return typed metadataif (part.type === "reasoning") {const metadata = part.metadata.anthropic// ^? AnthropicReasoningInfo | undefined}}}).pipe(Effect.provide(Claude))Tool Calls
The
Toolmodule has been enhanced to support provider-defined tools (e.g. web search, computer use, etc.). Large language model providers which support calling their own tools now have a separate module present in their provider integration packages which contain definitions for their tools.These provider-defined tools can be included alongside user-defined tools in existing
Toolkits. Provider-defined tools that require a user-space handler will be raise a type error in the associatedToolkitlayer if no such handler is defined.import { LanguageModel, Tool, Toolkit } from "@effect/ai"import { AnthropicTool } from "@effect/ai-anthropic"import { Schema } from "effect"const DadJokeTool = Tool.make("DadJokeTool", {parameters: { topic: Schema.String },success: Schema.Struct({ joke: Schema.String })})const MyToolkit = Toolkit.make(DadJokeTool,AnthropicTool.WebSearch_20250305({ max_uses: 1 }))const program = LanguageModel.generateText({prompt: "Search the web for a dad joke",toolkit: MyToolkit})AiError
The
AiErrortype has been refactored into a union of different error types which can be raised by the Effect AI SDK. The goal of defining separate error types is to allow providing the end-user with more granular information about the error that occurred.For now, the following errors have been defined. More error types may be added over time based upon necessity / use case.
type AiError =| HttpRequestError,| HttpResponseError,| MalformedInput,| MalformedOutput,| UnknownError
0.26.1
Patch Changes
-
#5453
d6887d5Thanks @tim-smart! - wait for client to initialize before sending notifications -
Updated dependencies [
d6887d5]:- @effect/rpc@0.69.2
0.26.0
Patch Changes
- Updated dependencies [
3e163b2]:- @effect/rpc@0.69.0
- @effect/experimental@0.54.6
0.25.2
Patch Changes
0.25.1
Patch Changes
-
#5351
fd86f93Thanks @richburdon! - fixes bug where stream currently ignores disableToolCallResolution flag -
Updated dependencies [
a949539]:- effect@3.17.7
- @effect/experimental@0.54.4
0.25.0
Patch Changes
- Updated dependencies [
5a0f4f1,e9cbd26]:- effect@3.17.1
- @effect/rpc@0.68.0
- @effect/experimental@0.54.0
0.24.0
Patch Changes
- Updated dependencies [
7813640]:- @effect/platform@0.90.0
- @effect/experimental@0.54.0
- @effect/rpc@0.67.0
0.23.0
Patch Changes
- Updated dependencies [
40c3c87,ed2c74a,073a1b8,f382e99,e8c7ba5,7e10415,e9bdece,8d95eb0]:- effect@3.17.0
- @effect/experimental@0.53.0
- @effect/platform@0.89.0
- @effect/rpc@0.66.0
0.22.2
Patch Changes
0.22.1
Patch Changes
- Updated dependencies [
f5dfabf,17a5ea8,d25f22b]:- effect@3.16.14
- @effect/platform@0.88.1
- @effect/experimental@0.52.1
- @effect/rpc@0.65.1
0.22.0
Patch Changes
- Updated dependencies [
27206d7,dbabf5e]:- @effect/platform@0.88.0
- @effect/experimental@0.52.0
- @effect/rpc@0.65.0
0.21.17
Patch Changes
- Updated dependencies [
c1c05a8,5b7cd92,81fe4a2]:- effect@3.16.13
- @effect/rpc@0.64.14
- @effect/experimental@0.51.14
- @effect/platform@0.87.13
0.21.16
Patch Changes
- Updated dependencies [
32ba77a,d5e25b2]:- @effect/platform@0.87.12
- @effect/experimental@0.51.13
- @effect/rpc@0.64.13
0.21.15
Patch Changes
- Updated dependencies [
79a1947,001392b,7bfb099]:- @effect/rpc@0.64.12
- @effect/platform@0.87.11
- @effect/experimental@0.51.12
0.21.14
Patch Changes
- Updated dependencies [
678318d,678318d]:- @effect/platform@0.87.10
- @effect/experimental@0.51.11
- @effect/rpc@0.64.11
0.21.13
Patch Changes
- Updated dependencies [
54514a2]:- @effect/platform@0.87.9
- @effect/experimental@0.51.10
- @effect/rpc@0.64.10
0.21.12
Patch Changes
- Updated dependencies [
4ce4f82]:- @effect/platform@0.87.8
- @effect/experimental@0.51.9
- @effect/rpc@0.64.9
0.21.11
Patch Changes
-
#5029
d92d12aThanks @IMax153! - Add support for generating tool call identifiers when none are returned by the LLM provider -
#5165
25ca0cfThanks @IMax153! - Ensure that tool call parts are properly merged when combiningAiResponses -
#5029
d92d12aThanks @IMax153! - Cleanup AiLanguageModel construction and finish basic support for gemini
0.21.10
Patch Changes
- Updated dependencies [
a9b617f,7e26e86]:- @effect/platform@0.87.7
- @effect/experimental@0.51.8
- @effect/rpc@0.64.8
0.21.9
Patch Changes
-
#5154
030ac21Thanks @IMax153! - Support disabling tool call resolution to give users more control over resolver execution -
#5133
aaae9b1Thanks @IMax153! - Support extracting tool call results fromAiResponse.WithToolCallResults -
Updated dependencies [
905da99]:- effect@3.16.12
- @effect/experimental@0.51.7
- @effect/platform@0.87.6
- @effect/rpc@0.64.7
0.21.8
Patch Changes
- Updated dependencies [
96c1292]:- @effect/experimental@0.51.6
0.21.7
Patch Changes
- Updated dependencies [
2fd8676]:- @effect/platform@0.87.5
- @effect/experimental@0.51.5
- @effect/rpc@0.64.6
0.21.6
Patch Changes
- Updated dependencies [
e82a4fd]:- @effect/platform@0.87.4
- @effect/experimental@0.51.4
- @effect/rpc@0.64.5
0.21.5
Patch Changes
- Updated dependencies [
1b6e396]:- @effect/platform@0.87.3
- @effect/experimental@0.51.3
- @effect/rpc@0.64.4
0.21.4
Patch Changes
- Updated dependencies [
4fea68c,b927954,99590a6,6c3e24c]:- @effect/platform@0.87.2
- effect@3.16.11
- @effect/experimental@0.51.2
- @effect/rpc@0.64.3
0.21.3
Patch Changes
- Updated dependencies [
faad30e]:- effect@3.16.10
- @effect/experimental@0.51.1
- @effect/platform@0.87.1
- @effect/rpc@0.64.2
0.21.2
Patch Changes
- Updated dependencies [
112a93a]:- @effect/rpc@0.64.1
- @effect/experimental@0.51.0
0.21.1
Patch Changes
-
#5088
f667373Thanks @tim-smart! - expose system option in AiChat constructors -
Updated dependencies []:
- @effect/experimental@0.51.0
0.21.0
Patch Changes
- Updated dependencies [
b5bac9a]:- @effect/rpc@0.64.0
- @effect/platform@0.87.0
- @effect/experimental@0.51.0
0.20.0
Patch Changes
- Updated dependencies [
5137c70,c23d25c,5137c70,5137c70]:- effect@3.16.9
- @effect/platform@0.86.0
- @effect/experimental@0.50.0
- @effect/rpc@0.63.0
0.19.4
Patch Changes
-
#5056
a8d99b2Thanks @tim-smart! - add support for mcp 2025-06-18 -
Updated dependencies [
a8d99b2]:- @effect/rpc@0.62.4
- @effect/experimental@0.49.2
0.19.3
Patch Changes
- Updated dependencies [
914a191]:- @effect/platform@0.85.2
- @effect/experimental@0.49.2
- @effect/rpc@0.62.3
0.19.2
Patch Changes
- Updated dependencies [
ddfd1e4]:- @effect/rpc@0.62.2
- @effect/experimental@0.49.1
0.19.1
Patch Changes
- Updated dependencies [
8cb98d5,db2dd3c]:- effect@3.16.8
- @effect/experimental@0.49.1
- @effect/platform@0.85.1
- @effect/rpc@0.62.1
0.19.0
Patch Changes
- Updated dependencies [
93687dd,93687dd,93687dd]:- @effect/platform@0.85.0
- @effect/experimental@0.49.0
- @effect/rpc@0.62.0
0.18.16
Patch Changes
0.18.15
Patch Changes
0.18.14
Patch Changes
-
#5036
cbac1acThanks @tim-smart! - add .of helpers to RpcGroup, Entity and AiToolkit -
#5037
dd4d380Thanks @tim-smart! - eliminate McpServer requirement from resource layers -
Updated dependencies [
1bb0d8a,cbac1ac]:- effect@3.16.7
- @effect/rpc@0.61.15
- @effect/experimental@0.48.12
- @effect/platform@0.84.11
0.18.13
Patch Changes
-
#4961
aa3a819Thanks @IMax153! - add McpServer moduleThe McpServer module provides a way to implement a MCP server using Effect.
Here’s an example of how to use the McpServer module to create a simple MCP server with a resource template and a test prompt:
import { McpSchema, McpServer } from "@effect/ai"import { NodeRuntime, NodeSink, NodeStream } from "@effect/platform-node"import { Effect, Layer, Logger, Schema } from "effect"const idParam = McpSchema.param("id", Schema.NumberFromString)// Define a resource template for a README fileconst ReadmeTemplate = McpServer.resource`file://readme/${idParam}`({name: "README Template",// You can add auto-completion for the ID parametercompletion: {id: (_) => Effect.succeed([1, 2, 3, 4, 5])},content: Effect.fn(function* (_uri, id) {return `# MCP Server Demo - ID: ${id}`})})// Define a test prompt with parametersconst TestPrompt = McpServer.prompt({name: "Test Prompt",description: "A test prompt to demonstrate MCP server capabilities",parameters: Schema.Struct({flightNumber: Schema.String}),completion: {flightNumber: () => Effect.succeed(["FL123", "FL456", "FL789"])},content: ({ flightNumber }) =>Effect.succeed(`Get the booking details for flight number: ${flightNumber}`)})// Merge all the resources and prompts into a single server layerconst ServerLayer = Layer.mergeAll(ReadmeTemplate, TestPrompt).pipe(// Provide the MCP server implementationLayer.provide(McpServer.layerStdio({name: "Demo Server",version: "1.0.0",stdin: NodeStream.stdin,stdout: NodeSink.stdout})),// add a stderr loggerLayer.provide(Logger.add(Logger.prettyLogger({ stderr: true }))))Layer.launch(ServerLayer).pipe(NodeRuntime.runMain) -
Updated dependencies [
a5f7595,a02470c,bf369b2,f891d45]:- effect@3.16.6
- @effect/platform@0.84.10
- @effect/experimental@0.48.11
- @effect/rpc@0.61.14
0.18.12
Patch Changes
- Updated dependencies [
bf418ef]:- effect@3.16.5
- @effect/experimental@0.48.10
- @effect/platform@0.84.9
0.18.11
Patch Changes
-
#5011
2dc5f93Thanks @IMax153! - disallow excess options inAiLanguageModel.generateText/AiLanguageModel.streamText -
Updated dependencies []:
- @effect/experimental@0.48.9
0.18.10
Patch Changes
- Updated dependencies [
8b9db77]:- @effect/platform@0.84.8
- @effect/experimental@0.48.9
0.18.9
Patch Changes
- Updated dependencies [
74ab9a0,770008e]:- effect@3.16.4
- @effect/experimental@0.48.8
- @effect/platform@0.84.7
0.18.8
Patch Changes
- Updated dependencies [
a2d57c9]:- @effect/experimental@0.48.7
0.18.7
Patch Changes
- Updated dependencies [
ceea77a]:- @effect/platform@0.84.6
- @effect/experimental@0.48.6
0.18.6
Patch Changes
-
#4968
85f54edThanks @IMax153! - fix the type ofAiToolkit.Any -
Updated dependencies [
ec52c6a]:- @effect/platform@0.84.5
- @effect/experimental@0.48.5
0.18.5
Patch Changes
0.18.4
Patch Changes
- Updated dependencies [
87722fc,36217ee]:- effect@3.16.3
- @effect/experimental@0.48.4
- @effect/platform@0.84.4
0.18.3
Patch Changes
-
#4947
52c88c4Thanks @tim-smart! - fix AiToolkit handlers type extraction -
Updated dependencies [
ab7684f]:- @effect/platform@0.84.3
- @effect/experimental@0.48.3
0.18.2
Patch Changes
- Updated dependencies [
0ddf148]:- effect@3.16.2
- @effect/experimental@0.48.2
- @effect/platform@0.84.2
0.18.1
Patch Changes
- Updated dependencies [
71174d0,d615e6e]:- @effect/platform@0.84.1
- effect@3.16.1
- @effect/experimental@0.48.1
0.18.0
Minor Changes
-
#4891
0552674Thanks @IMax153! - MakeAiModela plainLayerand removeAiPlanin favor ofExecutionPlanThis release substantially simplifies and improves the ergonomics of using
AiModelfor various providers. With these changes, anAiModelnow returns a plainLayerwhich can be used to provide services to a program that interacts with large language models.Before
import { AiLanguageModel } from "@effect/ai"import { OpenAiClient, OpenAiLanguageModel } from "@effect/ai-openai"import { NodeHttpClient } from "@effect/platform-node"import { Config, Console, Effect, Layer } from "effect"// Produces an `AiModel<AiLanguageModel, OpenAiClient>`const Gpt4o = OpenAiLanguageModel.model("gpt-4o")// Generate a dad jokeconst getDadJoke = AiLanguageModel.generateText({prompt: "Tell me a dad joke"})const program = Effect.gen(function* () {// Build the `AiModel` into a `Provider`const gpt4o = yield* Gpt4o// Use the built `AiModel` to run the programconst response = yield* gpt4o.use(getDadJoke)// Log the responseyield* Console.log(response.text)})const OpenAi = OpenAiClient.layerConfig({apiKey: Config.redacted("OPENAI_API_KEY")}).pipe(Layer.provide(NodeHttpClient.layerUndici))program.pipe(Effect.provide(OpenAi), Effect.runPromise)After
import { AiLanguageModel } from "@effect/ai"import { OpenAiClient, OpenAiLanguageModel } from "@effect/ai-openai"import { NodeHttpClient } from "@effect/platform-node"import { Config, Console, Effect, Layer } from "effect"// Produces a `Layer<AiLanguageModel, never, OpenAiClient>`const Gpt4o = OpenAiLanguageModel.model("gpt-4o")const program = Effect.gen(function*() {// Generate a dad jokeconst response = yield* AiLanguageModel.generateText({prompt: "Tell me a dad joke"})// Log the responseyield* Console.log(response.text)).pipe(Effect.provide(Gpt4o))const OpenAi = OpenAiClient.layerConfig({apiKey: Config.redacted("OPENAI_API_KEY")}).pipe(Layer.provide(NodeHttpClient.layerUndici))program.pipe(Effect.provide(OpenAi),Effect.runPromise)In addition,
AiModelcan beyield*’ed to produce a layer with no requirements.This shifts the requirements of building the layer into the calling effect, which is particularly useful for creating AI-powered services.
import { AiLanguageModel } from "@effect/ai"import { OpenAiLanguageModel } from "@effect/ai-openai"import { Effect } from "effect"class DadJokes extends Effect.Service<DadJokes>()("DadJokes", {effect: Effect.gen(function* () {// Yielding the model will return a layer with no requirements//// ┌─── Layer<AiLanguageModel>// ▼const model = yield* OpenAiLanguageModel.model("gpt-4o")const getDadJoke = AiLanguageModel.generateText({prompt: "Generate a dad joke"}).pipe(Effect.provide(model))return { getDadJoke } as const})}) {}// The requirements are lifted into the service constructor//// ┌─── Layer<DadJokes, never, OpenAiClient>// ▼DadJokes.Default
Patch Changes
- Updated dependencies [
ee0bd5d,5189800,58bfeaa,194d748,918c9ea,9198e6f,2a370bf,58ccb91,fd47834]:- effect@3.16.0
- @effect/experimental@0.48.0
- @effect/platform@0.84.0
0.17.0
Patch Changes
- Updated dependencies [
5522520,cc5bb2b]:- @effect/platform@0.83.0
- effect@3.15.5
- @effect/experimental@0.47.0
0.16.9
Patch Changes
- Updated dependencies [
0617b9d]:- @effect/platform@0.82.8
- @effect/experimental@0.46.8
0.16.8
Patch Changes
- Updated dependencies [
f570554,78047e8,c20b95a,94ada43]:- effect@3.15.4
- @effect/platform@0.82.7
- @effect/experimental@0.46.7
0.16.7
Patch Changes
- Updated dependencies [
618903b]:- @effect/platform@0.82.6
- @effect/experimental@0.46.6
0.16.6
Patch Changes
- Updated dependencies [
7764a07,4577f54,30a0d9c]:- @effect/platform@0.82.5
- effect@3.15.3
- @effect/experimental@0.46.5
0.16.5
Patch Changes
0.16.4
Patch Changes
- Updated dependencies [
b8722b8,a328f4b]:- effect@3.15.2
- @effect/platform@0.82.3
- @effect/experimental@0.46.3
0.16.3
Patch Changes
- Updated dependencies [
739a3d4]:- @effect/platform@0.82.2
- @effect/experimental@0.46.2
0.16.2
Patch Changes
- Updated dependencies [
787ce70,1269641,1269641]:- effect@3.15.1
- @effect/experimental@0.46.1
- @effect/platform@0.82.1
0.16.1
Patch Changes
-
#4866
cb3c30fThanks @tim-smart! - preserve tool call results in AiResponse.merge -
Updated dependencies []:
- @effect/experimental@0.46.0
0.16.0
Patch Changes
- Updated dependencies [
c654595,d9f5dea,49aa723,74c14d0,e4f49b6,6f02224,1dcfd41,b21ab16,fcf1822,0061dd1,8421e6e,a9b3fb7,fa10f56]:- effect@3.15.0
- @effect/platform@0.82.0
- @effect/experimental@0.46.0
0.15.0
Minor Changes
-
#4766
a4d42c5Thanks @IMax153! - This release includes a complete refactor of the internals of the base@effect/ailibrary, with a focus on flexibility for the end user and incorporation of more information from model providers.Notable Changes
AiLanguageModelandAiEmbeddingModelThe
Completionsservice from@effect/aihas been renamed toAiLanguageModel, and theEmbeddingsservice has similarly been renamed toAiEmbeddingModel. In addition,Completions.createandCompletions.toolkithave been unified intoAiLanguageModel.generateText. Similarly,Completions.streamandCompletions.toolkitStreamhave been unified intoAiLanguageModel.streamText.Structured Outputs
Completions.structuredhas been renamed toAiLanguageModel.generateObject, and this method now returns a specializedAiResponse.WithStructuredOutputtype, which contains avalueproperty with the result of the structured output call. This enhancement prevents the end user from having to unnecessarily unwrap anOption.AiModelandAiPlanThe
.providemethod on a builtAiModel/AiPlanhas been renamed to.useto improve clarity given that a user is using the services provided by the model / plan to run a particular piece of code.In addition, the
AiPlan.fromModelconstructor has been simplified intoAiPlan.make, which allows you to create an initialAiPlanwith multiple steps incorporated.For example:
import { AiPlan } from "@effect/ai"import { OpenAiLanguageModel } from "@effect/ai-openai"import { AnthropicLanguageModel } from "@effect/ai-anthropic"import { Effect } from "effect"const main = Effect.gen(function* () {const plan = yield* AiPlan.make({model: OpenAiLanguageModel.model("gpt-4"),attempts: 1},{model: AnthropicLanguageModel.model("claude-3-7-sonnet-latest"),attempts: 1},{model: AnthropicLanguageModel.model("claude-3-5-sonnet-latest"),attempts: 1})yield* plan.use(program)})AiInputandAiResponseThe
AiInputandAiResponsetypes have been refactored to allow inclusion of more information and metadata from model providers where possible, such as reasoning output and prompt cache token utilization.In addition, for an
AiResponseyou can now access metadata that is specific to a given provider. For example, when using OpenAi to generate audio, you can check the input and output audio tokens used:import { OpenAiLanguageModel } from "@effect/ai-openai"import { Effect, Option } from "effect"const getDadJoke = OpenAiLanguageModel.generateText({prompt: "Generate a hilarious dad joke"})Effect.gen(function* () {const model = yield* OpenAiLanguageModel.model("gpt-4o")const response = yield* model.use(getDadJoke)const metadata = response.getProviderMetadata(OpenAiLanguageModel.ProviderMetadata)if (Option.isSome(metadata)) {console.log(metadata.value)}})AiToolandAiToolkitThe
AiToolkithas been completely refactored to simplify creating a collection of tools and using those tools in requests to model providers. A newAiTooldata type has also been introduced to simplify defining tools for a toolkit.AiToolkit.implementhas been renamed toAiToolkit.toLayerfor clarity, and defining handlers is now very similar to the way handlers are defined in the@effect/rpclibrary.A complete example of an
AiToolkitimplementation and usage can be found below:import { AiLanguageModel, AiTool, AiToolkit } from "@effect/ai"import { OpenAiClient, OpenAiLanguageModel } from "@effect/ai-openai"import {FetchHttpClient,HttpClient,HttpClientRequest,HttpClientResponse} from "@effect/platform"import { NodeHttpClient, NodeRuntime } from "@effect/platform-node"import { Array, Config, Console, Effect, Layer, Schema } from "effect"// =============================================================================// Domain Models// =============================================================================const DadJoke = Schema.Struct({id: Schema.String,joke: Schema.String})const SearchResponse = Schema.Struct({current_page: Schema.Int,limit: Schema.Int,next_page: Schema.Int,previous_page: Schema.Int,search_term: Schema.String,results: Schema.Array(DadJoke),status: Schema.Int,total_jokes: Schema.Int,total_pages: Schema.Int})// =============================================================================// Service Definitions// =============================================================================export class ICanHazDadJoke extends Effect.Service<ICanHazDadJoke>()("ICanHazDadJoke",{dependencies: [FetchHttpClient.layer],effect: Effect.gen(function* () {const httpClient = (yield* HttpClient.HttpClient).pipe(HttpClient.mapRequest(HttpClientRequest.prependUrl("https://icanhazdadjoke.com")))const httpClientOk = HttpClient.filterStatusOk(httpClient)const search = Effect.fn("ICanHazDadJoke.search")(function (term: string) {return httpClientOk.get("/search", {acceptJson: true,urlParams: { term }}).pipe(Effect.flatMap(HttpClientResponse.schemaBodyJson(SearchResponse)),Effect.orDie)})return {search} as const})}) {}// =============================================================================// Toolkit Definition// =============================================================================export class DadJokeTools extends AiToolkit.make(AiTool.make("GetDadJoke", {description:"Fetch a dad joke based on a search term from the ICanHazDadJoke API",success: DadJoke,parameters: Schema.Struct({searchTerm: Schema.String})})) {}// =============================================================================// Toolkit Handlers// =============================================================================export const DadJokeToolHandlers = DadJokeTools.toLayer(Effect.gen(function* () {const icanhazdadjoke = yield* ICanHazDadJokereturn {GetDadJoke: (params) =>icanhazdadjoke.search(params.searchTerm).pipe(Effect.flatMap((response) => Array.head(response.results)),Effect.orDie)}})).pipe(Layer.provide(ICanHazDadJoke.Default))// =============================================================================// Toolkit Usage// =============================================================================const makeDadJoke = Effect.gen(function* () {const languageModel = yield* AiLanguageModel.AiLanguageModelconst toolkit = yield* DadJokeToolsconst response = yield* languageModel.generateText({prompt: "Come up with a dad joke about pirates",toolkit})return yield* languageModel.generateText({prompt: response})})const program = Effect.gen(function* () {const model = yield* OpenAiLanguageModel.model("gpt-4o")const result = yield* model.provide(makeDadJoke)yield* Console.log(result.text)})const OpenAi = OpenAiClient.layerConfig({apiKey: Config.redacted("OPENAI_API_KEY")}).pipe(Layer.provide(NodeHttpClient.layerUndici))program.pipe(Effect.provide([OpenAi, DadJokeToolHandlers]),Effect.tapErrorCause(Effect.logError),NodeRuntime.runMain)
Patch Changes
- Updated dependencies []:
- @effect/experimental@0.45.1
0.14.1
Patch Changes
- Updated dependencies [
24a9ebb]:- effect@3.14.22
- @effect/experimental@0.45.1
- @effect/platform@0.81.1
0.14.0
Patch Changes
- Updated dependencies [
672920f]:- @effect/platform@0.81.0
- @effect/experimental@0.45.0
0.13.21
Patch Changes
- Updated dependencies [
2f3b7d4]:- effect@3.14.21
- @effect/experimental@0.44.21
- @effect/platform@0.80.21
0.13.20
Patch Changes
- Updated dependencies [
17e2f30]:- effect@3.14.20
- @effect/experimental@0.44.20
- @effect/platform@0.80.20
0.13.19
Patch Changes
- Updated dependencies [
056a910,e25e7bb,3273d57]:- effect@3.14.19
- @effect/platform@0.80.19
- @effect/experimental@0.44.19
0.13.18
Patch Changes
- Updated dependencies [
b1164d4]:- effect@3.14.18
- @effect/experimental@0.44.18
- @effect/platform@0.80.18
0.13.17
Patch Changes
- Updated dependencies [
0b54681,41a59d5]:- effect@3.14.17
- @effect/experimental@0.44.17
- @effect/platform@0.80.17
0.13.16
Patch Changes
- Updated dependencies [
ee14444,f1c8583]:- effect@3.14.16
- @effect/platform@0.80.16
- @effect/experimental@0.44.16
0.13.15
Patch Changes
- Updated dependencies [
239cc99,8b6c947,c50a63b]:- effect@3.14.15
- @effect/experimental@0.44.15
- @effect/platform@0.80.15
0.13.14
Patch Changes
- Updated dependencies [
6ed8d15]:- effect@3.14.14
- @effect/experimental@0.44.14
- @effect/platform@0.80.14
0.13.13
Patch Changes
- Updated dependencies [
ee77788,5fce6ba,570e45f]:- effect@3.14.13
- @effect/experimental@0.44.13
- @effect/platform@0.80.13
0.13.12
Patch Changes
- Updated dependencies [
c2ad9ee,9c68654]:- effect@3.14.12
- @effect/experimental@0.44.12
- @effect/platform@0.80.12
0.13.11
Patch Changes
- Updated dependencies [
e536127]:- effect@3.14.11
- @effect/experimental@0.44.11
- @effect/platform@0.80.11
0.13.10
Patch Changes
- Updated dependencies [
bc7efa3]:- effect@3.14.10
- @effect/experimental@0.44.10
- @effect/platform@0.80.10
0.13.9
Patch Changes
- Updated dependencies [
d78249f]:- effect@3.14.9
- @effect/experimental@0.44.9
- @effect/platform@0.80.9
0.13.8
Patch Changes
- Updated dependencies [
b3a2d32]:- effect@3.14.8
- @effect/experimental@0.44.8
- @effect/platform@0.80.8
0.13.7
Patch Changes
- Updated dependencies [
b542a4b]:- effect@3.14.7
- @effect/experimental@0.44.7
- @effect/platform@0.80.7
0.13.6
Patch Changes
- Updated dependencies [
47618c1,6077882]:- effect@3.14.6
- @effect/experimental@0.44.6
- @effect/platform@0.80.6
0.13.5
Patch Changes
- Updated dependencies [
40dbfef,85fba81,5a5ebdd]:- effect@3.14.5
- @effect/platform@0.80.5
- @effect/experimental@0.44.5
0.13.4
Patch Changes
- Updated dependencies [
e4ba2c6]:- effect@3.14.4
- @effect/experimental@0.44.4
- @effect/platform@0.80.4
0.13.3
Patch Changes
- Updated dependencies [
37aa8e1,34f03d6]:- effect@3.14.3
- @effect/experimental@0.44.3
- @effect/platform@0.80.3
0.13.2
Patch Changes
- Updated dependencies [
f87991b,f87991b,0a3e3e1]:- effect@3.14.2
- @effect/experimental@0.44.2
- @effect/platform@0.80.2
0.13.1
Patch Changes
- Updated dependencies [
4a274fe]:- effect@3.14.1
- @effect/experimental@0.44.1
- @effect/platform@0.80.1
0.13.0
Patch Changes
- Updated dependencies [
1f47e4e,26dd75f,aba2d1d,3131f8f,aba2d1d,04dff2d,aba2d1d,c7fac0c,aba2d1d,ffaa3f3,ab957c1,35db9ce,aba2d1d,cf77ea9,26dd75f,baaab60]:- effect@3.14.0
- @effect/experimental@0.44.0
- @effect/platform@0.80.0
0.12.4
Patch Changes
- Updated dependencies [
5662363,5f1fd15,8bb1460]:- @effect/platform@0.79.4
- @effect/experimental@0.43.4
0.12.3
Patch Changes
- Updated dependencies [
0c4803f,6f65ac4]:- effect@3.13.12
- @effect/experimental@0.43.3
- @effect/platform@0.79.3
0.12.2
Patch Changes
- Updated dependencies [
fad8cca,4296293,9c241ab,082b0c1,be12983,de88127]:- effect@3.13.11
- @effect/experimental@0.43.2
- @effect/platform@0.79.2
0.12.1
Patch Changes
- Updated dependencies [
527c964]:- effect@3.13.10
- @effect/experimental@0.43.1
- @effect/platform@0.79.1
0.12.0
Patch Changes
- Updated dependencies [
88fe129,d630249,2976e52]:- @effect/platform@0.79.0
- effect@3.13.9
- @effect/experimental@0.43.0
0.11.1
Patch Changes
- Updated dependencies [
c65d336,22d2ebb]:- effect@3.13.8
- @effect/experimental@0.42.1
- @effect/platform@0.78.1
0.11.0
Patch Changes
- Updated dependencies [
c5bcf53]:- @effect/platform@0.78.0
- @effect/experimental@0.42.0
0.10.7
Patch Changes
-
#4545
a95108aThanks @IMax153! - Avoid inclusion of_tagin tool call JSONSchema -
Updated dependencies [
840cc73,9bf8a74,87ba23c,f910880,0d01480]:- @effect/platform@0.77.7
- effect@3.13.7
- @effect/experimental@0.41.7
0.10.6
Patch Changes
- Updated dependencies [
3154ce4]:- effect@3.13.6
- @effect/experimental@0.41.6
- @effect/platform@0.77.6
0.10.5
Patch Changes
-
#4549
3d6d323Thanks @IMax153! - FixAiPlanbuilder to return correct shape -
#4537
975c20eThanks @IMax153! - Allow defects to pass through predicates inAiPlan -
Updated dependencies [
367bb35,6cf11c3,a0acec8]:- effect@3.13.5
- @effect/experimental@0.41.5
- @effect/platform@0.77.5
0.10.4
Patch Changes
- Updated dependencies [
e0746f9,17d9e89]:- @effect/platform@0.77.4
- effect@3.13.4
- @effect/experimental@0.41.4
0.10.3
Patch Changes
-
#4504
a67a8a1Thanks @IMax153! - IntroduceAiModelandAiPlanfor describing retry / fallback logic between models and providersFor example, the following program builds an
AiPlanwhich will attempt to use OpenAi’s chat completions API, and if after three attempts the operation is still failing, the plan will fallback to utilizing Anthropic’s messages API to resolve the request.import { AiPlan, Completions } from "@effect/ai"import { AnthropicClient, AnthropicCompletions } from "@effect/ai-anthropic"import { OpenAiClient, OpenAiCompletions } from "@effect/ai-openai"import { NodeHttpClient, NodeRuntime } from "@effect/platform-node"import { Config, Console, Effect, Layer } from "effect"// Create Anthropic clientconst Anthropic = AnthropicClient.layerConfig({apiKey: Config.redacted("ANTHROPIC_API_KEY")}).pipe(Layer.provide(NodeHttpClient.layerUndici))// Create OpenAi clientconst OpenAi = OpenAiClient.layerConfig({apiKey: Config.redacted("OPENAI_API_KEY")}).pipe(Layer.provide(NodeHttpClient.layerUndici))// Create a plan of request executionconst Plan = AiPlan.fromModel(OpenAiCompletions.model("gpt-4o-mini"), {attempts: 3}).pipe(AiPlan.withFallback({model: AnthropicCompletions.model("claude-3-5-haiku-latest")}))const program = Effect.gen(function* () {// Build the plan of executionconst plan = yield* Plan// Create a program which uses the services provided by the planconst getDadJoke = Effect.gen(function* () {const completions = yield* Completions.Completionsconst response = yield* completions.create("Tell me a dad joke")yield* Console.log(response.text)})// Provide the plan to whichever programs need ityield* plan.provide(getDadJoke)})program.pipe(Effect.provide([Anthropic, OpenAi]), NodeRuntime.runMain) -
Updated dependencies [
cc5588d,623c8cd,00b4eb1,f2aee98,fb798eb,2251b15,2e15c1e,a4979db,b74255a,d7f6a5c,9dd8979,477b488,10932cb,9f6c784,2c639ec,886aaa8]:- effect@3.13.3
- @effect/experimental@0.41.3
- @effect/platform@0.77.3
0.10.2
Patch Changes
- Updated dependencies [
31be72a,3e7ce97,31be72a]:- effect@3.13.2
- @effect/platform@0.77.2
- @effect/experimental@0.41.2
0.10.1
Patch Changes
-
#4446
9375c28Thanks @IMax153! - Add Anthropic AI provider integration -
Updated dependencies [
b56a211]:- effect@3.13.1
- @effect/experimental@0.41.1
- @effect/platform@0.77.1
0.10.0
Patch Changes
- Updated dependencies [
8baef83,655bfe2,d90cbc2,75632bd,c874a2e,bf865e5,f98b2b7,de8ce92,cf8b2dd,db426a5,6862444,5fc8a90,546a492,65c4796,9760fdc,5b471e7,4f810cc]:- effect@3.13.0
- @effect/experimental@0.41.0
- @effect/platform@0.77.0
0.9.1
Patch Changes
- Updated dependencies [
4018eae,543d36d,c407726,f70a65a,ba409f6,3d2e356]:- effect@3.12.12
- @effect/platform@0.76.1
- @effect/experimental@0.40.1
0.9.0
Patch Changes
- Updated dependencies [
b6a032f,42ddd5f,2fe447c,2473ad5]:- effect@3.12.11
- @effect/platform@0.76.0
- @effect/experimental@0.40.0
0.8.4
Patch Changes
- Updated dependencies [
e30f132,33fa667,87f5f28,7d57ecd,4dbd170]:- effect@3.12.10
- @effect/platform@0.75.4
- @effect/experimental@0.39.4
0.8.3
Patch Changes
- Updated dependencies [
1b4a4e9]:- effect@3.12.9
- @effect/experimental@0.39.3
- @effect/platform@0.75.3
0.8.2
Patch Changes
-
#4378
f5e3b1bThanks @IMax153! - Support non-identified schemas inAiChat.structuredandCompletions.structured.Instead of requiring a
Schemawith either anidentifieror_tagproperty for AI APIs that allow for returning structured outputs, you can now optionally pass acorrelationIdtoAiChat.structuredandCompletions.structuredwhen you want to either use a simple schema or inline the schema.Example:
import { Completions } from "@effect/ai"import { OpenAiClient, OpenAiCompletions } from "@effect/ai-openai"import { NodeHttpClient } from "@effect/platform-node"import { Config, Effect, Layer, Schema, String } from "effect"const OpenAi = OpenAiClient.layerConfig({apiKey: Config.redacted("OPENAI_API_KEY")}).pipe(Layer.provide(NodeHttpClient.layerUndici))const Gpt4oCompletions = OpenAiCompletions.layer({model: "gpt-4o"}).pipe(Layer.provide(OpenAi))const program = Effect.gen(function* () {const completions = yield* Completions.Completionsconst CalendarEvent = Schema.Struct({name: Schema.String,date: Schema.DateFromString,participants: Schema.Array(Schema.String)})yield* completions.structured({correlationId: "CalendarEvent",schema: CalendarEvent,input: String.stripMargin(`|Extract event information from the following prose:||Alice and Bob are going to a science fair on Friday.`)})})program.pipe(Effect.provide(Gpt4oCompletions), Effect.runPromise) -
#4388
fcf3b7cThanks @IMax153! - Rename correlationId to toolCallId -
#4389
f089470Thanks @IMax153! - Add support for GenAI telemetry annotations. -
#4368
a0c85e6Thanks @IMax153! - Support creation of embeddings from the AI integration packages.For example, the following program will create an OpenAI
Embeddingsservice that will aggregate all embedding requests received within a500millisecond window into a single batch.import { Embeddings } from "@effect/ai"import { OpenAiClient, OpenAiEmbeddings } from "@effect/ai-openai"import { NodeHttpClient } from "@effect/platform-node"import { Config, Effect, Layer } from "effect"// Create the OpenAI clientconst OpenAi = OpenAiClient.layerConfig({apiKey: Config.redacted("OPENAI_API_KEY")}).pipe(Layer.provide(NodeHttpClient.layerUndici))// Create an embeddings service for the `text-embedding-3-large` modelconst TextEmbeddingsLarge = OpenAiEmbeddings.layerDataLoader({model: "text-embedding-3-large",window: "500 millis",maxBatchSize: 2048}).pipe(Layer.provide(OpenAi))// Use the generic `Embeddings` service interface in your programconst program = Effect.gen(function* () {const embeddings = yield* Embeddings.Embeddingsconst result = yield* embeddings.embed("The input to embed")})// Provide the specific implementation to useprogram.pipe(Effect.provide(TextEmbeddingsLarge), Effect.runPromise) -
Updated dependencies [
59b3cfb,766113c,bb05fb8,712277f,f269122,8f6006a,c45b559,430c846,7b03057,a9c94c8,107e6f0,c9175ae,65c11b9,e386d2f,9172efb]:- @effect/platform@0.75.2
- effect@3.12.8
- @effect/experimental@0.39.2
0.8.1
Patch Changes
- Updated dependencies [
8dff1d1]:- effect@3.12.7
- @effect/platform@0.75.1
0.8.0
Minor Changes
Patch Changes
- Updated dependencies [
5e43ce5,289c13b,76eb7d0,8b4e75d,fc5e0f0,004fd2b,b2a31be,5514d05,bf5f0ae,3b19bcf,b064b3b,eb264ed,289c13b,f474678,ee187d0]:- @effect/platform@0.75.0
- effect@3.12.6
0.7.0
Patch Changes
- Updated dependencies [
a8b0ddb,8653072,507d546,a8b0ddb,8db239b,84a0911,84a0911,3179a9f,6cb9b76,1fcbe55,d9a63d9,6cb9b76]:- effect@3.12.5
- @effect/platform@0.74.0
0.6.1
Patch Changes
- Updated dependencies [
5b50ea4,c170a68,a66c2eb,c9e5e1b,7b3d58d]:- effect@3.12.4
- @effect/platform@0.73.1
0.6.0
Patch Changes
- Updated dependencies [
d7dac48,c110032,1d7fd2b,1d7fd2b,23ac740,8cd7319]:- effect@3.12.3
- @effect/platform@0.73.0
0.5.2
Patch Changes
- Updated dependencies [
734af82,b63c780,212e784,f852cb0,7276ae2,212e784,212e784,212e784,c640d77,0def088]:- effect@3.12.2
- @effect/platform@0.72.2
0.5.1
Patch Changes
- Updated dependencies [
302b57d,0988083,8b46be6,bfe8027,16dd657,39db211]:- effect@3.12.1
- @effect/platform@0.72.1
0.5.0
Patch Changes
- Updated dependencies [
abb22a4,f369a89,642376c,3d2b7a7,ef64c6f,73f9c6f,17cb451,d801820,e1eeb2d,c11f3a6,618f7e0,c0ba834,e1eeb2d]:- effect@3.12.0
- @effect/platform@0.72.0
0.4.8
Patch Changes
0.4.7
Patch Changes
0.4.6
Patch Changes
0.4.5
Patch Changes
0.4.4
Patch Changes
0.4.3
Patch Changes
0.4.2
Patch Changes
- Updated dependencies [
2408616,cec0b4d,cec0b4d,8d978c5,cec0b4d,cec0b4d]:- effect@3.11.7
- @effect/platform@0.71.2
0.4.1
Patch Changes
- Updated dependencies [
1d3df5b]:- @effect/platform@0.71.1
0.4.0
Patch Changes
- Updated dependencies [
662d1ce,c99a0f3,11fc401,c99a0f3,31c62d8]:- effect@3.11.6
- @effect/platform@0.71.0
0.3.7
Patch Changes
- Updated dependencies [
9f5a6f7,22905cf,9f5a6f7,1e59e4f,9f5a6f7,8d914e5,03bb00f,9f5a6f7,14e1149,9f5a6f7,9f5a6f7]:- effect@3.11.5
- @effect/platform@0.70.7
0.3.6
Patch Changes
- Updated dependencies [
9a5b8e3]:- @effect/platform@0.70.6
0.3.5
Patch Changes
- Updated dependencies [
415f4c9,518b258,6e323a3,518b258,6e323a3]:- @effect/platform@0.70.5
- effect@3.11.4
0.3.4
Patch Changes
- Updated dependencies [
90906f7,3862cd3,3862cd3,343b6aa,afba339]:- effect@3.11.3
- @effect/platform@0.70.4
0.3.3
Patch Changes
-
#4071
da3a607Thanks @tim-smart! - use openai response_format for structured completions -
Updated dependencies [
7044730]:- @effect/platform@0.70.3
0.3.2
Patch Changes
0.3.1
Patch Changes
0.3.0
Patch Changes
- Updated dependencies [
147434b,6e69493,147434b,5eff3f6,d9fe79b,251d189,5a259f3,b4ce4ea,15fcc5a,9bc9a47,aadb8a4,1e2747c,9264162,e0b9b09,c36f3b9,672bde5,aadb8a4]:- effect@3.11.0
- @effect/platform@0.70.0
0.2.32
Patch Changes
0.2.31
Patch Changes
- Updated dependencies [
e6d4a37]:- @effect/platform@0.69.31
0.2.30
Patch Changes
- Updated dependencies [
270f199]:- @effect/platform@0.69.30
0.2.29
Patch Changes
- Updated dependencies [
24cc35e]:- @effect/platform@0.69.29
0.2.28
Patch Changes
- Updated dependencies [
edd72be,a3e2771,944025b,54addee,a9e00e4]:- @effect/platform@0.69.28
- effect@3.10.19
0.2.27
Patch Changes
0.2.26
Patch Changes
0.2.25
Patch Changes
- Updated dependencies [
320557a,4dca30c,1d99867,6dae414,6b0d737,d8356aa,7b93dd6]:- @effect/platform@0.69.25
- effect@3.10.16
0.2.24
Patch Changes
- Updated dependencies [
3cc6514]:- @effect/platform@0.69.24
0.2.23
Patch Changes
- Updated dependencies [
3aff4d3]:- @effect/platform@0.69.23
0.2.22
Patch Changes
0.2.21
Patch Changes
0.2.20
Patch Changes
-
#3916
72b0272Thanks @tim-smart! - use effect/JSONSchema for effect/ai & allow http client transforms -
Updated dependencies [
995bbdf]:- effect@3.10.13
- @effect/platform@0.69.20
0.2.19
Patch Changes
- Updated dependencies [
eb8c52d]:- @effect/platform@0.69.19
0.2.18
Patch Changes
0.2.17
Patch Changes
0.2.16
Patch Changes
- Updated dependencies [
cd720ae,cd720ae,cd720ae,b631f40,7d89650]:- effect@3.10.10
- @effect/platform@0.69.16
0.2.15
Patch Changes
- Updated dependencies [
8a30e1d]:- @effect/platform@0.69.15
0.2.14
Patch Changes
- Updated dependencies [
a123e80,bd5fcd3,0289d3b,7386b71,07c493a,257ab1b,4211a23]:- effect@3.10.9
- @effect/platform@0.69.14
0.2.13
Patch Changes
0.2.12
Patch Changes
0.2.11
Patch Changes
0.2.10
Patch Changes
0.2.9
Patch Changes
- Updated dependencies [
2367708]:- @effect/platform@0.69.9
- effect@3.10.4
0.2.8
Patch Changes
- Updated dependencies [
522f7c5]:- @effect/platform@0.69.8
0.2.7
Patch Changes
0.2.6
Patch Changes
0.2.5
Patch Changes
- Updated dependencies [
9604d6b]:- effect@3.10.1
- @effect/platform@0.69.5
0.2.4
Patch Changes
- Updated dependencies [
c86b1d7]:- @effect/platform@0.69.4
0.2.3
Patch Changes
0.2.2
Patch Changes
- Updated dependencies [
e7afc47]:- @effect/platform@0.69.2
0.2.1
Patch Changes
0.2.0
Patch Changes
- Updated dependencies [
4a01828,6d9de6b,4a01828,c79c4c1,38d30f0,5821ce3]:- effect@3.10.0
- @effect/platform@0.69.0
0.1.4
Patch Changes
0.1.3
Patch Changes
- Updated dependencies [
2036402]:- @effect/platform@0.68.5
0.1.2
Patch Changes
- Updated dependencies [
1b1ef29]:- @effect/platform@0.68.4
0.1.1
Patch Changes
0.1.0
Minor Changes
-
#3631
bd160a4Thanks @tim-smart! - add @effect/ai packagesExperimental modules for working with LLMs, currently only from OpenAI.
Patch Changes
- Updated dependencies [
360ec14]:- @effect/schema@0.75.3
- @effect/platform@0.68.2