import { Context, Effect, Layer } from "effect" import { RequestExecutor } from "./route/executor" import type { ImageOptions, ImageRequest, ImageRequestFor, ImageResponse } from "./image" import type { LLMError } from "./schema" export type Execute = RequestExecutor.Interface["execute"] export interface Interface { readonly generate: ( request: ImageRequestFor, ) => Effect.Effect } export class Service extends Context.Service()("@opencode/ImageClient") {} export const generate = ( request: ImageRequestFor, ): Effect.Effect => Effect.gen(function* () { const client = yield* Service return yield* client.generate(request) }) as Effect.Effect export const layer: Layer.Layer = Layer.effect( Service, Effect.gen(function* () { const executor = yield* RequestExecutor.Service return Service.of({ generate: (request) => request.model.route.generate(request, executor.execute), }) }), ) export const ImageClient = { Service, layer, generate, } as const