@effect/ai-anthropic
0.27.0
Patch Changes
- Updated dependencies [
fffdee0]:- effect@3.22.0
- @effect/ai@0.37.0
- @effect/experimental@0.61.0
- @effect/platform@0.97.0
0.26.1
Patch Changes
-
#6288
cfa2bbfThanks @davidgoli! - populatecachedInputTokensin streaming responses fromcache_read_input_tokens -
Updated dependencies [
307d54a,d95868a,95c7d2e,d24511f,99d5575]:- effect@3.21.5
- @effect/platform@0.96.3
0.26.0
Patch Changes
0.25.0
Patch Changes
- Updated dependencies [
f7bb09b,bd7552a,ad1a7eb,0d32048,0d32048]:- effect@3.21.0
- @effect/ai@0.35.0
- @effect/experimental@0.60.0
- @effect/platform@0.96.0
0.24.0
Patch Changes
- Updated dependencies [
fc82e81,82996bc,4d97a61,f6b0960,8798a84]:- effect@3.20.0
- @effect/ai@0.34.0
- @effect/experimental@0.59.0
- @effect/platform@0.95.0
0.23.0
Patch Changes
- Updated dependencies [
77eeb86,ff7053f,287c32c]:- effect@3.19.13
- @effect/platform@0.94.0
- @effect/ai@0.33.0
- @effect/experimental@0.58.0
0.22.0
Patch Changes
- Updated dependencies [
3c15d5f,3863fa8,2a03c76,24a1685]:- effect@3.19.0
- @effect/platform@0.93.0
- @effect/ai@0.32.0
- @effect/experimental@0.57.0
0.21.1
Patch Changes
0.21.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)
Patch Changes
- Updated dependencies [
4c3bdfb]:- @effect/ai@0.31.0
0.20.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
-
#5615
1d2e92dThanks @janglad! - Remove accidental commit of debug console.dir -
Updated dependencies [
6ae2f5d,c63e658]:- effect@3.18.4
- @effect/ai@0.30.0
0.19.2
Patch Changes
-
#5608
215ed46Thanks @IMax153! - Fix incorrect detection of either result -
Updated dependencies [
8ba4757]:- effect@3.18.2
0.19.1
Patch Changes
0.19.0
Patch Changes
- Updated dependencies [
1c6ab74,70fe803,c296e32,a098ddf,f8b93ac]:- effect@3.18.0
- @effect/ai@0.29.0
- @effect/platform@0.92.0
- @effect/experimental@0.56.0
0.18.2
Patch Changes
- #5571
122aa53Thanks @IMax153! - Ensure that AI provider clients filter response status for stream requests
0.18.1
Patch Changes
-
#5554
800ab2eThanks @IMax153! - Improve the information available to the user following a model response error -
Updated dependencies [
800ab2e,800ab2e,800ab2e,800ab2e,800ab2e,800ab2e]:- @effect/ai@0.28.2
0.18.0
Patch Changes
- Updated dependencies [
d4d86a8]:- @effect/platform@0.91.0
- @effect/ai@0.28.0
- @effect/experimental@0.55.0
0.17.1
Patch Changes
-
#5521
fa49bc8Thanks @IMax153! - Fix provider metadata and parse tool call parameters safely -
Updated dependencies [
fa49bc8]:- @effect/ai@0.27.1
0.17.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
Patch Changes
- Updated dependencies [
42b914a]:- @effect/ai@0.27.0
0.16.2
Patch Changes
0.16.1
Patch Changes
- #5474
5f5ae17Thanks @IMax153! - Ensure that the finish part is emitted when streaming text from Anthropic
0.16.0
Patch Changes
- Updated dependencies []:
- @effect/ai@0.26.0
- @effect/experimental@0.54.6
0.15.1
Patch Changes
4bcf799Thanks @dmaretskyi! - Fix tools with no parameters not being called
0.15.0
Patch Changes
- Updated dependencies [
5a0f4f1]:- effect@3.17.1
- @effect/ai@0.25.0
- @effect/experimental@0.54.0
0.14.0
Patch Changes
- Updated dependencies [
7813640]:- @effect/platform@0.90.0
- @effect/ai@0.24.0
- @effect/experimental@0.54.0
0.13.0
Patch Changes
- Updated dependencies [
40c3c87,ed2c74a,073a1b8,f382e99,e8c7ba5,7e10415,e9bdece,8d95eb0]:- effect@3.17.0
- @effect/ai@0.23.0
- @effect/experimental@0.53.0
- @effect/platform@0.89.0
0.12.2
Patch Changes
- Updated dependencies [
f5dfabf,17a5ea8,d25f22b]:- effect@3.16.14
- @effect/platform@0.88.1
- @effect/experimental@0.52.1
- @effect/ai@0.22.1
0.12.1
Patch Changes
- #5209
3deaa66Thanks @tim-smart! - fix ai layerConfig regression, to allow for conditional Config variables
0.12.0
Patch Changes
- Updated dependencies [
27206d7,dbabf5e]:- @effect/platform@0.88.0
- @effect/ai@0.22.0
- @effect/experimental@0.52.0
0.11.19
Patch Changes
- Updated dependencies [
c1c05a8,81fe4a2]:- effect@3.16.13
- @effect/ai@0.21.17
- @effect/experimental@0.51.14
- @effect/platform@0.87.13
0.11.18
Patch Changes
-
#5186
e5692abThanks @IMax153! - Do not useConfig.Wrapfor AI providerlayerConfig -
Updated dependencies [
32ba77a,d5e25b2]:- @effect/platform@0.87.12
- @effect/ai@0.21.16
- @effect/experimental@0.51.13
0.11.17
Patch Changes
- Updated dependencies [
001392b,7bfb099]:- @effect/platform@0.87.11
- @effect/ai@0.21.15
- @effect/experimental@0.51.12
0.11.16
Patch Changes
- Updated dependencies [
678318d,678318d]:- @effect/platform@0.87.10
- @effect/ai@0.21.14
- @effect/experimental@0.51.11
0.11.15
Patch Changes
- Updated dependencies [
54514a2]:- @effect/platform@0.87.9
- @effect/ai@0.21.13
- @effect/experimental@0.51.10
0.11.14
Patch Changes
- Updated dependencies [
4ce4f82]:- @effect/platform@0.87.8
- @effect/experimental@0.51.9
- @effect/ai@0.21.12
0.11.13
Patch Changes
-
#5029
d92d12aThanks @IMax153! - Cleanup AiLanguageModel construction and finish basic support for gemini -
Updated dependencies [
d92d12a,25ca0cf,d92d12a]:- @effect/ai@0.21.11
0.11.12
Patch Changes
- Updated dependencies [
a9b617f,7e26e86]:- @effect/platform@0.87.7
- @effect/ai@0.21.10
- @effect/experimental@0.51.8
0.11.11
Patch Changes
- Updated dependencies [
030ac21,905da99,aaae9b1]:- @effect/ai@0.21.9
- effect@3.16.12
- @effect/experimental@0.51.7
- @effect/platform@0.87.6
0.11.10
Patch Changes
- Updated dependencies [
96c1292]:- @effect/experimental@0.51.6
- @effect/ai@0.21.8
0.11.9
Patch Changes
- Updated dependencies [
2fd8676]:- @effect/platform@0.87.5
- @effect/ai@0.21.7
- @effect/experimental@0.51.5
0.11.8
Patch Changes
- Updated dependencies [
e82a4fd]:- @effect/platform@0.87.4
- @effect/ai@0.21.6
- @effect/experimental@0.51.4
0.11.7
Patch Changes
- Updated dependencies [
1b6e396]:- @effect/platform@0.87.3
- @effect/ai@0.21.5
- @effect/experimental@0.51.3
0.11.6
Patch Changes
- Updated dependencies [
4fea68c,b927954,99590a6,6c3e24c]:- @effect/platform@0.87.2
- effect@3.16.11
- @effect/ai@0.21.4
- @effect/experimental@0.51.2
0.11.5
Patch Changes
-
#5121
8e3c565Thanks @IMax153! - Fix several issues in the generated OpenAPI models for the Anthropic AI provider package.The OpenAPI specification that Anthropic maintains for its API is apparently incorrect. Some properties which are marked as nullable but required are sometimes not returned by the API. This fixes the schemas associated with some of those properties, though others may exist / be found that require manual adjustment.
0.11.4
Patch Changes
0.11.3
Patch Changes
- Updated dependencies [
faad30e]:- effect@3.16.10
- @effect/ai@0.21.3
- @effect/experimental@0.51.1
- @effect/platform@0.87.1
0.11.2
Patch Changes
- Updated dependencies []:
- @effect/ai@0.21.2
- @effect/experimental@0.51.0
0.11.1
Patch Changes
- Updated dependencies [
f667373]:- @effect/ai@0.21.1
- @effect/experimental@0.51.0
0.11.0
Patch Changes
- Updated dependencies [
b5bac9a]:- @effect/platform@0.87.0
- @effect/ai@0.21.0
- @effect/experimental@0.51.0
0.10.0
Patch Changes
- Updated dependencies [
5137c70,c23d25c,5137c70,5137c70]:- effect@3.16.9
- @effect/platform@0.86.0
- @effect/ai@0.20.0
- @effect/experimental@0.50.0
0.9.5
Patch Changes
- Updated dependencies [
a8d99b2]:- @effect/ai@0.19.4
- @effect/experimental@0.49.2
0.9.4
Patch Changes
- Updated dependencies [
914a191]:- @effect/platform@0.85.2
- @effect/ai@0.19.3
- @effect/experimental@0.49.2
0.9.3
Patch Changes
0.9.2
Patch Changes
- Updated dependencies []:
- @effect/ai@0.19.2
- @effect/experimental@0.49.1
0.9.1
Patch Changes
- Updated dependencies [
8cb98d5,db2dd3c]:- effect@3.16.8
- @effect/ai@0.19.1
- @effect/experimental@0.49.1
- @effect/platform@0.85.1
0.9.0
Patch Changes
- Updated dependencies [
93687dd,93687dd,93687dd]:- @effect/platform@0.85.0
- @effect/ai@0.19.0
- @effect/experimental@0.49.0
0.8.16
Patch Changes
- Updated dependencies [
daed158]:- @effect/ai@0.18.16
0.8.15
Patch Changes
- Updated dependencies [
c315989]:- @effect/ai@0.18.15
0.8.14
Patch Changes
- Updated dependencies [
1bb0d8a,cbac1ac,dd4d380]:- effect@3.16.7
- @effect/ai@0.18.14
- @effect/experimental@0.48.12
- @effect/platform@0.84.11
0.8.13
Patch Changes
- Updated dependencies [
a5f7595,a02470c,aa3a819,bf369b2,f891d45]:- effect@3.16.6
- @effect/ai@0.18.13
- @effect/platform@0.84.10
- @effect/experimental@0.48.11
0.8.12
Patch Changes
- Updated dependencies [
bf418ef]:- effect@3.16.5
- @effect/ai@0.18.12
- @effect/experimental@0.48.10
- @effect/platform@0.84.9
0.8.11
Patch Changes
- Updated dependencies [
2dc5f93]:- @effect/ai@0.18.11
- @effect/experimental@0.48.9
0.8.10
Patch Changes
- Updated dependencies [
8b9db77]:- @effect/platform@0.84.8
- @effect/experimental@0.48.9
- @effect/ai@0.18.10
0.8.9
Patch Changes
- Updated dependencies [
74ab9a0,770008e]:- effect@3.16.4
- @effect/ai@0.18.9
- @effect/experimental@0.48.8
- @effect/platform@0.84.7
0.8.8
Patch Changes
- Updated dependencies [
a2d57c9]:- @effect/experimental@0.48.7
- @effect/ai@0.18.8
0.8.7
Patch Changes
- Updated dependencies [
ceea77a]:- @effect/platform@0.84.6
- @effect/ai@0.18.7
- @effect/experimental@0.48.6
0.8.6
Patch Changes
- Updated dependencies [
85f54ed,ec52c6a]:- @effect/ai@0.18.6
- @effect/platform@0.84.5
- @effect/experimental@0.48.5
0.8.5
Patch Changes
- Updated dependencies [
4ddb28d]:- @effect/ai@0.18.5
0.8.4
Patch Changes
- Updated dependencies [
87722fc,36217ee]:- effect@3.16.3
- @effect/ai@0.18.4
- @effect/experimental@0.48.4
- @effect/platform@0.84.4
0.8.3
Patch Changes
- Updated dependencies [
52c88c4,ab7684f]:- @effect/ai@0.18.3
- @effect/platform@0.84.3
- @effect/experimental@0.48.3
0.8.2
Patch Changes
- Updated dependencies [
0ddf148]:- effect@3.16.2
- @effect/ai@0.18.2
- @effect/experimental@0.48.2
- @effect/platform@0.84.2
0.8.1
Patch Changes
- Updated dependencies [
71174d0,d615e6e]:- @effect/platform@0.84.1
- effect@3.16.1
- @effect/ai@0.18.1
- @effect/experimental@0.48.1
0.8.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,0552674,918c9ea,9198e6f,2a370bf,58ccb91,fd47834]:- effect@3.16.0
- @effect/ai@0.18.0
- @effect/experimental@0.48.0
- @effect/platform@0.84.0
0.7.0
Patch Changes
- Updated dependencies [
5522520,cc5bb2b]:- @effect/platform@0.83.0
- effect@3.15.5
- @effect/ai@0.17.0
- @effect/experimental@0.47.0
0.6.9
Patch Changes
- Updated dependencies [
0617b9d]:- @effect/platform@0.82.8
- @effect/ai@0.16.9
- @effect/experimental@0.46.8
0.6.8
Patch Changes
- Updated dependencies [
f570554,78047e8,c20b95a,94ada43]:- effect@3.15.4
- @effect/platform@0.82.7
- @effect/ai@0.16.8
- @effect/experimental@0.46.7
0.6.7
Patch Changes
- Updated dependencies [
618903b]:- @effect/platform@0.82.6
- @effect/ai@0.16.7
- @effect/experimental@0.46.6
0.6.6
Patch Changes
- Updated dependencies [
7764a07,4577f54,30a0d9c]:- @effect/platform@0.82.5
- effect@3.15.3
- @effect/ai@0.16.6
- @effect/experimental@0.46.5
0.6.5
Patch Changes
-
Updated dependencies [
d45e8a8,d13b68e]:- @effect/platform@0.82.4
- @effect/ai@0.16.5
- @effect/experimental@0.46.4
0.6.4
Patch Changes
- Updated dependencies [
b8722b8,a328f4b]:- effect@3.15.2
- @effect/platform@0.82.3
- @effect/ai@0.16.4
- @effect/experimental@0.46.3
0.6.3
Patch Changes
- Updated dependencies [
739a3d4]:- @effect/platform@0.82.2
- @effect/ai@0.16.3
- @effect/experimental@0.46.2
0.6.2
Patch Changes
- Updated dependencies [
787ce70,1269641,1269641]:- effect@3.15.1
- @effect/ai@0.16.2
- @effect/experimental@0.46.1
- @effect/platform@0.82.1
0.6.1
Patch Changes
- Updated dependencies [
cb3c30f]:- @effect/ai@0.16.1
- @effect/experimental@0.46.0
0.6.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/ai@0.16.0
- @effect/experimental@0.46.0
0.5.0
Minor Changes
Patch Changes
- Updated dependencies [
a4d42c5]:- @effect/ai@0.15.0
- @effect/experimental@0.45.1
0.4.1
Patch Changes
- Updated dependencies [
24a9ebb]:- effect@3.14.22
- @effect/ai@0.14.1
- @effect/experimental@0.45.1
- @effect/platform@0.81.1
0.4.0
Patch Changes
- Updated dependencies [
672920f]:- @effect/platform@0.81.0
- @effect/ai@0.14.0
- @effect/experimental@0.45.0
0.3.22
Patch Changes
- Updated dependencies [
2f3b7d4]:- effect@3.14.21
- @effect/ai@0.13.21
- @effect/experimental@0.44.21
- @effect/platform@0.80.21
0.3.21
Patch Changes
- Updated dependencies [
17e2f30]:- effect@3.14.20
- @effect/ai@0.13.20
- @effect/experimental@0.44.20
- @effect/platform@0.80.20
0.3.20
Patch Changes
- Updated dependencies [
056a910,e25e7bb,3273d57]:- effect@3.14.19
- @effect/platform@0.80.19
- @effect/ai@0.13.19
- @effect/experimental@0.44.19
0.3.19
Patch Changes
- Updated dependencies [
b1164d4]:- effect@3.14.18
- @effect/ai@0.13.18
- @effect/experimental@0.44.18
- @effect/platform@0.80.18
0.3.18
Patch Changes
- Updated dependencies [
0b54681,41a59d5]:- effect@3.14.17
- @effect/ai@0.13.17
- @effect/experimental@0.44.17
- @effect/platform@0.80.17
0.3.17
Patch Changes
- Updated dependencies [
ee14444,f1c8583]:- effect@3.14.16
- @effect/platform@0.80.16
- @effect/ai@0.13.16
- @effect/experimental@0.44.16
0.3.16
Patch Changes
- Updated dependencies [
239cc99,8b6c947,c50a63b]:- effect@3.14.15
- @effect/ai@0.13.15
- @effect/experimental@0.44.15
- @effect/platform@0.80.15
0.3.15
Patch Changes
- Updated dependencies [
6ed8d15]:- effect@3.14.14
- @effect/ai@0.13.14
- @effect/experimental@0.44.14
- @effect/platform@0.80.14
0.3.14
Patch Changes
- Updated dependencies [
ee77788,5fce6ba,570e45f]:- effect@3.14.13
- @effect/ai@0.13.13
- @effect/experimental@0.44.13
- @effect/platform@0.80.13
0.3.13
Patch Changes
- Updated dependencies [
c2ad9ee,9c68654]:- effect@3.14.12
- @effect/ai@0.13.12
- @effect/experimental@0.44.12
- @effect/platform@0.80.12
0.3.12
Patch Changes
- Updated dependencies [
e536127]:- effect@3.14.11
- @effect/ai@0.13.11
- @effect/experimental@0.44.11
- @effect/platform@0.80.11
0.3.11
Patch Changes
- Updated dependencies [
bc7efa3]:- effect@3.14.10
- @effect/ai@0.13.10
- @effect/experimental@0.44.10
- @effect/platform@0.80.10
0.3.10
Patch Changes
- Updated dependencies [
d78249f]:- effect@3.14.9
- @effect/ai@0.13.9
- @effect/experimental@0.44.9
- @effect/platform@0.80.9
0.3.9
Patch Changes
- #4726
b8b0703Thanks @dearlordylord! - AnthropicClient.layerConfig has the same ROut as AnthropicClient.layer - specifically, AiModels.AiModels was missing
0.3.8
Patch Changes
- Updated dependencies [
b3a2d32]:- effect@3.14.8
- @effect/ai@0.13.8
- @effect/experimental@0.44.8
- @effect/platform@0.80.8
0.3.7
Patch Changes
- Updated dependencies [
b542a4b]:- effect@3.14.7
- @effect/ai@0.13.7
- @effect/experimental@0.44.7
- @effect/platform@0.80.7
0.3.6
Patch Changes
- Updated dependencies [
47618c1,6077882]:- effect@3.14.6
- @effect/ai@0.13.6
- @effect/experimental@0.44.6
- @effect/platform@0.80.6
0.3.5
Patch Changes
- Updated dependencies [
40dbfef,85fba81,5a5ebdd]:- effect@3.14.5
- @effect/platform@0.80.5
- @effect/ai@0.13.5
- @effect/experimental@0.44.5
0.3.4
Patch Changes
- Updated dependencies [
e4ba2c6]:- effect@3.14.4
- @effect/ai@0.13.4
- @effect/experimental@0.44.4
- @effect/platform@0.80.4
0.3.3
Patch Changes
- Updated dependencies [
37aa8e1,34f03d6]:- effect@3.14.3
- @effect/ai@0.13.3
- @effect/experimental@0.44.3
- @effect/platform@0.80.3
0.3.2
Patch Changes
- Updated dependencies [
f87991b,f87991b,0a3e3e1]:- effect@3.14.2
- @effect/ai@0.13.2
- @effect/experimental@0.44.2
- @effect/platform@0.80.2
0.3.1
Patch Changes
- Updated dependencies [
4a274fe]:- effect@3.14.1
- @effect/ai@0.13.1
- @effect/experimental@0.44.1
- @effect/platform@0.80.1
0.3.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
- @effect/ai@0.13.0
0.2.4
Patch Changes
-
#4592
5662363Thanks @tim-smart! - update generated ai clients -
Updated dependencies [
5662363,5f1fd15,8bb1460]:- @effect/platform@0.79.4
- @effect/ai@0.12.4
- @effect/experimental@0.43.4
0.2.3
Patch Changes
- Updated dependencies [
0c4803f,6f65ac4]:- effect@3.13.12
- @effect/ai@0.12.3
- @effect/experimental@0.43.3
- @effect/platform@0.79.3
0.2.2
Patch Changes
- Updated dependencies [
fad8cca,4296293,9c241ab,082b0c1,be12983,de88127]:- effect@3.13.11
- @effect/ai@0.12.2
- @effect/experimental@0.43.2
- @effect/platform@0.79.2
0.2.1
Patch Changes
- Updated dependencies [
527c964]:- effect@3.13.10
- @effect/ai@0.12.1
- @effect/experimental@0.43.1
- @effect/platform@0.79.1
0.2.0
Patch Changes
- Updated dependencies [
88fe129,d630249,2976e52]:- @effect/platform@0.79.0
- effect@3.13.9
- @effect/experimental@0.43.0
- @effect/ai@0.12.0
0.1.1
Patch Changes
- Updated dependencies [
c65d336,22d2ebb]:- effect@3.13.8
- @effect/ai@0.11.1
- @effect/experimental@0.42.1
- @effect/platform@0.78.1
0.1.0
Patch Changes
- Updated dependencies [
c5bcf53]:- @effect/platform@0.78.0
- @effect/ai@0.11.0
- @effect/experimental@0.42.0
0.0.7
Patch Changes
- Updated dependencies [
840cc73,9bf8a74,87ba23c,f910880,0d01480,a95108a]:- @effect/platform@0.77.7
- effect@3.13.7
- @effect/ai@0.10.7
- @effect/experimental@0.41.7
0.0.6
Patch Changes
- Updated dependencies [
3154ce4]:- effect@3.13.6
- @effect/ai@0.10.6
- @effect/experimental@0.41.6
- @effect/platform@0.77.6
0.0.5
Patch Changes
- Updated dependencies [
3d6d323,367bb35,6cf11c3,a0acec8,975c20e]:- @effect/ai@0.10.5
- effect@3.13.5
- @effect/experimental@0.41.5
- @effect/platform@0.77.5
0.0.4
Patch Changes
- Updated dependencies [
e0746f9,17d9e89]:- @effect/platform@0.77.4
- effect@3.13.4
- @effect/ai@0.10.4
- @effect/experimental@0.41.4
0.0.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,a67a8a1]:- effect@3.13.3
- @effect/ai@0.10.3
- @effect/experimental@0.41.3
- @effect/platform@0.77.3
0.0.2
Patch Changes
- Updated dependencies [
31be72a,3e7ce97,31be72a]:- effect@3.13.2
- @effect/platform@0.77.2
- @effect/ai@0.10.2
- @effect/experimental@0.41.2