Skip to content

ModelCatalog

The ModelCatalog port: a stored model choice ({ provider, modelId }) resolves here to an effect/ai language model layer and the metadata effect/ai does not model: the context window, prices, the thinking-level mapping, and what counts as a context overflow.

import * as AnthropicClient from "@effect/ai-anthropic/AnthropicClient"
import * as AnthropicLanguageModel from "@effect/ai-anthropic/AnthropicLanguageModel"
import { ModelCatalog } from "@effective-harness/core"
import * as Layer from "effect/Layer"
import type * as Redacted from "effect/Redacted"
import * as FetchHttpClient from "effect/http/FetchHttpClient"
declare const apiKey: Redacted.Redacted<string>
const Models = ModelCatalog.layer([
ModelCatalog.model(
"anthropic",
"claude-sonnet-5-5",
AnthropicLanguageModel.layer({ model: "claude-sonnet-5-5" }).pipe(
Layer.provide(AnthropicClient.layer({ apiKey })),
Layer.provide(FetchHttpClient.layer)
),
{ contextWindow: 200_000 }
)
])

Since v0.0.0


One model the harness can call.

Signature

export interface CatalogModel {
readonly provider: string
readonly modelId: string
/** Tokens the model accepts per request, prompt and answer together; 0 when unknown (no threshold compaction). */
readonly contextWindow: number
readonly maxTokens: number
readonly pricing?: Pricing
/** The effect/ai model: the `LanguageModel` service for this model. */
readonly layer: Layer.Layer<LanguageModel.LanguageModel>
/** Whether a failed request was too long for the context window. Default: the error text says so. */
readonly isOverflow?: (error: AiError.AiError) => boolean
/** Apply a thinking level to one request, for example a provider config override. Default: ignore it. */
readonly withThinking?: (level: ThinkingLevel) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
/**
* Cap the answer of one request, for example a provider config override; compaction caps its summaries with it.
* Default: no cap.
*/
readonly withMaxTokens?: (maxTokens: number) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>
}

Source

Since v0.0.0

Signature

declare class ModelCatalog

Source

Since v0.0.0

Signature

export interface ModelCatalogShape {
readonly get: (ref: ModelRef) => Option.Option<CatalogModel>
}

Source

Since v0.0.0

Prices in dollars per million tokens.

Signature

export interface Pricing {
readonly input: number
readonly output: number
readonly cacheRead: number
readonly cacheWrite: number
}

Source

Since v0.0.0

Whether the error text reports a context overflow.

Signature

declare const isOverflowText: (text: string) => boolean

Source

Since v0.0.0

Signature

declare const layer: (models: Iterable<CatalogModel>) => Layer.Layer<ModelCatalog>

Source

Since v0.0.0

A catalog of models; a later model with the same reference replaces an earlier one.

Signature

declare const make: (models: Iterable<CatalogModel>) => ModelCatalogShape

Source

Since v0.0.0

Describe a model for the catalog.

Signature

declare const model: (
provider: string,
modelId: string,
layer: Layer.Layer<LanguageModel.LanguageModel, never, never> | Layer.Layer<any, never, never>,
options?: Partial<Omit<CatalogModel, "provider" | "modelId" | "layer">>
) => CatalogModel

Source

Since v0.0.0