| 1 | import * as Effect from "effect/Effect"; |
| 2 | import * as Layer from "effect/Layer"; |
| 3 | import { Converse } from "./Converse.ts"; |
| 4 | import { ConverseHttp } from "./ConverseHttp.ts"; |
| 5 | import { ConverseStream } from "./ConverseStream.ts"; |
| 6 | import { ConverseStreamHttp } from "./ConverseStreamHttp.ts"; |
| 7 | import { |
| 8 | LanguageModel, |
| 9 | type LanguageModelOptions, |
| 10 | makeLanguageModelLayer, |
| 11 | } from "./LanguageModel.ts"; |
| 12 | |
| 13 | /** |
| 14 | * HTTP implementation of {@link LanguageModel}. Composes the {@link Converse} |
| 15 | * and {@link ConverseStream} bindings, so binding a model registers both |
| 16 | * `bedrock:InvokeModel` and `bedrock:InvokeModelWithResponseStream` scoped to |
| 17 | * exactly that model. |
| 18 | */ |
| 19 | export const LanguageModelHttp = Layer.effect( |
| 20 | LanguageModel, |
| 21 | Effect.gen(function* () { |
| 22 | const converse = yield* Converse; |
| 23 | const converseStream = yield* ConverseStream; |
| 24 | return Effect.fn(function* ( |
| 25 | model: string | readonly [string, ...string[]], |
| 26 | options?: LanguageModelOptions, |
| 27 | ) { |
| 28 | const [first, ...rest] = typeof model === "string" ? [model] : model; |
| 29 | return makeLanguageModelLayer({ |
| 30 | converse: yield* converse(first, ...rest), |
| 31 | converseStream: yield* converseStream(first, ...rest), |
| 32 | parameters: options?.parameters, |
| 33 | }); |
| 34 | }); |
| 35 | }), |
| 36 | ).pipe(Layer.provide(Layer.mergeAll(ConverseHttp, ConverseStreamHttp))); |