1import * as Effect from "effect/Effect";
2import * as Layer from "effect/Layer";
3import { Converse } from "./Converse.ts";
4import { ConverseHttp } from "./ConverseHttp.ts";
5import { ConverseStream } from "./ConverseStream.ts";
6import { ConverseStreamHttp } from "./ConverseStreamHttp.ts";
7import {
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 */
19export 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)));