import { Effect, Predicate, Stream } from "effect" import { dual } from "effect/Function" import type { Response } from "effect/unstable/ai" import { LanguageModel } from "effect/unstable/ai" export const withLanguageModel: { (options: { readonly generateText?: | Array | ((options: LanguageModel.ProviderOptions) => | Array | Effect.Effect>) readonly streamText?: | Array | ((options: LanguageModel.ProviderOptions) => | Array | Stream.Stream) }): (effect: Effect.Effect) => Effect.Effect> (effect: Effect.Effect, options: { readonly generateText?: | Array | ((options: LanguageModel.ProviderOptions) => | Array | Effect.Effect>) readonly streamText?: | Array | ((options: LanguageModel.ProviderOptions) => | Array | Stream.Stream) }): Effect.Effect> } = dual(2, (effect: Effect.Effect, options: { readonly generateText?: | Array | ((options: LanguageModel.ProviderOptions) => | Array | Effect.Effect>) readonly streamText?: | Array | ((options: LanguageModel.ProviderOptions) => | Array | Stream.Stream) }): Effect.Effect> => Effect.provideServiceEffect( effect, LanguageModel.LanguageModel, LanguageModel.make({ generateText: (opts) => { if (Predicate.isUndefined(options.generateText)) { return Effect.succeed([]) } if (Array.isArray(options.generateText)) { return Effect.succeed(options.generateText) } const result = options.generateText(opts) return Effect.isEffect(result) ? result : Effect.succeed(result) }, streamText: (opts) => { if (Predicate.isUndefined(options.streamText)) { return Stream.empty } if (Array.isArray(options.streamText)) { return Stream.fromIterable(options.streamText) } const result = options.streamText(opts) return Array.isArray(result) ? Stream.fromIterable(result) : result } }) ))