Effect CommunityEC
Effect Community2mo ago
14 replies
adama

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

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);
Was this page helpful?