Avoiding Dependency Leakage in @effect/ai Service Method
Trying to wrap my head around the @effect/ai mental model.. How do I avoid dependency leakage when implementing the model in e.g. a service method:
https://effect.website/play/#ba3fece56bf4
https://effect.website/play/#ba3fece56bf4
import { LanguageModel } from "@effect/ai";
import { OpenAiClient, OpenAiLanguageModel } from "@effect/ai-openai";
import { NodeHttpClient } from "@effect/platform-node";
import { Config, Effect, Layer } from "effect";
const OpenAi = OpenAiClient.layerConfig({
apiKey: Config.redacted("OPENAI_API_KEY"),
});
const OpenAiWithHttp = Layer.provide(OpenAi, NodeHttpClient.layerUndici);
export class TestService extends Effect.Service<TestService>()(
"app/TestService",
{
dependencies: [], // <= include OpenAiWithHttp here
effect: Effect.gen(function* () {
// <= lift the OpenAiClient dependency here?
return {
// Effect<string,never,OpenAiClient>
generateDadJoke: (prompt: string, model: string) =>
Effect.gen(function* () {
const response = yield* LanguageModel.generateText({
prompt,
});
return response;
}).pipe(Effect.provide(OpenAiLanguageModel.model(model))),
};
}),
}
) {}
const main = Effect.gen(function* () {
const testService = yield* TestService;
const response = yield* testService.generateDadJoke(
"Generate a dad joke",
"gpt-4o"
);
console.log(response);
});
void main.pipe(Effect.provide(TestService.Default), Effect.runPromise);import { LanguageModel } from "@effect/ai";
import { OpenAiClient, OpenAiLanguageModel } from "@effect/ai-openai";
import { NodeHttpClient } from "@effect/platform-node";
import { Config, Effect, Layer } from "effect";
const OpenAi = OpenAiClient.layerConfig({
apiKey: Config.redacted("OPENAI_API_KEY"),
});
const OpenAiWithHttp = Layer.provide(OpenAi, NodeHttpClient.layerUndici);
export class TestService extends Effect.Service<TestService>()(
"app/TestService",
{
dependencies: [], // <= include OpenAiWithHttp here
effect: Effect.gen(function* () {
// <= lift the OpenAiClient dependency here?
return {
// Effect<string,never,OpenAiClient>
generateDadJoke: (prompt: string, model: string) =>
Effect.gen(function* () {
const response = yield* LanguageModel.generateText({
prompt,
});
return response;
}).pipe(Effect.provide(OpenAiLanguageModel.model(model))),
};
}),
}
) {}
const main = Effect.gen(function* () {
const testService = yield* TestService;
const response = yield* testService.generateDadJoke(
"Generate a dad joke",
"gpt-4o"
);
console.log(response);
});
void main.pipe(Effect.provide(TestService.Default), Effect.runPromise);