- Replaced minLevel/maxLevel range with explicit efforts array plus baked effortMap/supportsDisplay wire facts. - Removed runtime enrichment layer and modelOmitsReasoningEffort; providers now read baked fields. - Fixed dotted Opus 4.7/4.8 ids missing adaptive display via classifier-based predicates (#1373). - Bumped model cache schema to v4 to invalidate pre-efforts rows.
41 lines
1.4 KiB
TypeScript
41 lines
1.4 KiB
TypeScript
/**
|
|
* The single Model constructor. Resolution order is a dependency chain, each
|
|
* step materialized exactly once per spec:
|
|
*
|
|
* 1. compat — URL/provider/id detection resolved into a complete record;
|
|
* 2. thinking — derived from identity + resolved compat (or trusted verbatim
|
|
* when the spec carries explicit metadata);
|
|
*
|
|
* Request handlers read fields — they never detect, parse ids, or allocate
|
|
* compat per request.
|
|
*/
|
|
import { buildAnthropicCompat } from "./compat/anthropic";
|
|
import { buildOpenAICompat, buildOpenAIResponsesCompat } from "./compat/openai";
|
|
import { resolveModelThinking } from "./model-thinking";
|
|
import type { Api, CompatOf, Model, ModelSpec } from "./types";
|
|
|
|
export function buildModel<TApi extends Api>(spec: ModelSpec<TApi>): Model<TApi> {
|
|
const compat = buildCompat(spec) as CompatOf<TApi>;
|
|
return {
|
|
...spec,
|
|
thinking: resolveModelThinking(spec, compat),
|
|
compat,
|
|
compatConfig: spec.compat,
|
|
} as Model<TApi>;
|
|
}
|
|
|
|
export function buildCompat(spec: ModelSpec<Api>): CompatOf<Api> {
|
|
switch (spec.api) {
|
|
case "openai-completions":
|
|
return buildOpenAICompat(spec as ModelSpec<"openai-completions">);
|
|
case "openai-responses":
|
|
case "azure-openai-responses":
|
|
case "openai-codex-responses":
|
|
return buildOpenAIResponsesCompat(spec as ModelSpec<"openai-responses">);
|
|
case "anthropic-messages":
|
|
return buildAnthropicCompat(spec as ModelSpec<"anthropic-messages">);
|
|
default:
|
|
return undefined;
|
|
}
|
|
}
|