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
CatalogModel (interface)
Section titled “CatalogModel (interface)”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>}Since v0.0.0
ModelCatalog (class)
Section titled “ModelCatalog (class)”Signature
declare class ModelCatalogSince v0.0.0
ModelCatalogShape (interface)
Section titled “ModelCatalogShape (interface)”Signature
export interface ModelCatalogShape { readonly get: (ref: ModelRef) => Option.Option<CatalogModel>}Since v0.0.0
Pricing (interface)
Section titled “Pricing (interface)”Prices in dollars per million tokens.
Signature
export interface Pricing { readonly input: number readonly output: number readonly cacheRead: number readonly cacheWrite: number}Since v0.0.0
isOverflowText
Section titled “isOverflowText”Whether the error text reports a context overflow.
Signature
declare const isOverflowText: (text: string) => booleanSince v0.0.0
Signature
declare const layer: (models: Iterable<CatalogModel>) => Layer.Layer<ModelCatalog>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>) => ModelCatalogShapeSince 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">>) => CatalogModelSince v0.0.0